SmoothIntent.cs 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. using ImageMagick;
  2. using OpenCvSharp;
  3. using PaintDotNet.Base;
  4. using System;
  5. using System.Collections.Generic;
  6. namespace PaintDotNet.Adjust
  7. {
  8. /// <summary>
  9. /// 图像平滑
  10. /// </summary>
  11. public class SmoothIntent
  12. {
  13. /// <summary>
  14. /// 西格玛
  15. /// 目前使用的是opencv的加权中值滤波
  16. /// </summary>
  17. /// <param name="mat"></param>
  18. /// <returns></returns>
  19. public static Mat SigemaFunction(Mat mat, List<Args> lists)
  20. {
  21. //半径
  22. int radius = 1;
  23. //西格玛值
  24. double sigma = 25.5;
  25. foreach (Args args in lists)
  26. {
  27. switch (args.key)
  28. {
  29. case "KernelSize":
  30. radius = int.Parse(args.Value.ToString());
  31. break;
  32. case "Sigma":
  33. sigma = double.Parse(args.Value.ToString());
  34. break;
  35. }
  36. }
  37. //第四个参数是过滤内核的半径,正整数 范围:3-255
  38. //第五个参数是西格玛值,默认25.5 范围:0-127(Filter range standard deviation for the joint image.)
  39. OpenCvSharp.XImgProc.CvXImgProc.WeightedMedianFilter(mat, mat, mat, radius, sigma);
  40. return mat;
  41. }
  42. /// <summary>
  43. /// 各向异性高斯滤波
  44. /// </summary>
  45. /// <param name="mat"></param>
  46. /// <returns></returns>
  47. public static Mat GaussianFiltering(Mat mat, List<Args> lists)
  48. {
  49. double sigmax = 0.0;
  50. double sigmay = 0.0;
  51. foreach (Args args in lists)
  52. {
  53. switch (args.key)
  54. {
  55. case "SigmaX":
  56. sigmax = double.Parse(args.Value.ToString());
  57. break;
  58. case "SigmaY":
  59. sigmay = double.Parse(args.Value.ToString());
  60. break;
  61. }
  62. }
  63. Cv2.GaussianBlur(mat, mat, new Size(0, 0), sigmax, sigmay);
  64. return mat;
  65. }
  66. /// <summary>
  67. /// 低通滤波
  68. /// 参考 https://www.cnblogs.com/zx-zhang/p/10999617.html
  69. /// </summary>
  70. /// <param name="mat"></param>
  71. /// <returns></returns>
  72. public static Mat LowPassFiltering(Mat mat, List<Args> lists)
  73. {
  74. int KernelSizeX = 3;
  75. int KernelSizeY = 3;
  76. int Count = 1;
  77. foreach (Args args in lists)
  78. {
  79. switch (args.key)
  80. {
  81. case "KernelSizeX":
  82. KernelSizeX = int.Parse(args.Value.ToString());
  83. break;
  84. case "KernelSizeY":
  85. KernelSizeY = int.Parse(args.Value.ToString());
  86. break;
  87. case "Count":
  88. Count = int.Parse(args.Value.ToString());
  89. break;
  90. }
  91. }
  92. //构造kernel
  93. Mat mx = Cv2.GetGaussianKernel(KernelSizeX, KernelSizeX);
  94. Mat my = Cv2.GetGaussianKernel(KernelSizeY, KernelSizeY);
  95. Mat dst = new Mat();
  96. mat.CopyTo(dst);
  97. for (int i = 0; i < Count; i++)
  98. {
  99. Cv2.SepFilter2D(dst, dst, mat.Type(), mx, my);
  100. }
  101. return dst;
  102. }
  103. /// <summary>
  104. /// 中值滤波
  105. /// </summary>
  106. /// <param name="mat"></param>
  107. /// <returns></returns>
  108. public static Mat MedianFiltering(Mat mat, List<Args> lists)
  109. {
  110. int ksize = 3;
  111. foreach (Args args in lists)
  112. {
  113. switch (args.key)
  114. {
  115. case "KernelSize":
  116. ksize = int.Parse(args.Value.ToString());
  117. break;
  118. }
  119. }
  120. Cv2.MedianBlur(mat, mat, ksize);
  121. return mat;
  122. }
  123. /// <summary>
  124. /// 高斯模糊
  125. /// </summary>
  126. /// <param name="mat"></param>
  127. /// <returns></returns>
  128. public static Mat GaussianBlur(Mat mat, List<Args> lists)
  129. {
  130. int ksize = 11;
  131. foreach (Args args in lists)
  132. {
  133. switch (args.key)
  134. {
  135. case "KernelSize":
  136. ksize = int.Parse(args.Value.ToString());
  137. break;
  138. }
  139. }
  140. Cv2.GaussianBlur(mat, mat, new Size(ksize, ksize), 0);
  141. return mat;
  142. }
  143. /// <summary>
  144. /// 双边滤波
  145. /// </summary>
  146. /// <param name="mat"></param>
  147. /// <returns></returns>
  148. public static Mat BilateralFiltering(Mat mat, List<Args> lists)
  149. {
  150. Mat dst = new Mat();
  151. //像素邻域的直径
  152. int diameter = 0;
  153. //颜色空间过滤器的sigma值
  154. double sigmaColor = 0.0;
  155. //坐标空间中滤波器的sigma值
  156. double sigmaSpace = 0.0;
  157. foreach (Args args in lists)
  158. {
  159. switch (args.key)
  160. {
  161. case "Diameter":
  162. diameter = int.Parse(args.Value.ToString());
  163. break;
  164. case "SigmaColor":
  165. sigmaColor = int.Parse(args.Value.ToString());
  166. break;
  167. case "SigmaSpace":
  168. sigmaSpace = int.Parse(args.Value.ToString());
  169. break;
  170. }
  171. }
  172. Cv2.BilateralFilter(mat, dst, diameter, sigmaColor, sigmaSpace);
  173. return dst;
  174. }
  175. /// <summary>
  176. /// 小波降噪
  177. /// opencv没有提供小波相关函数
  178. /// MagickImage的小波降噪源码比较复杂,回头考虑是否扒一份
  179. /// 均值滤波 https://blog.csdn.net/dcrmg/article/details/78817985
  180. /// </summary>
  181. /// <param name="mat"></param>
  182. /// <returns></returns>
  183. public static Mat WaveletDenoising(Mat mat, List<Args> lists)
  184. {
  185. int ksize = 3;
  186. foreach (Args args in lists)
  187. {
  188. switch (args.key)
  189. {
  190. case "KernelSize":
  191. ksize = int.Parse(args.Value.ToString());
  192. break;
  193. }
  194. }
  195. //Cv2.FastNlMeansDenoisingColored(mat, mat);
  196. Cv2.Blur(mat, mat, new Size(ksize, ksize));
  197. return mat;
  198. /*CLAHE clahe = Cv2.CreateCLAHE(8, null);
  199. mat = mat.CvtColor(ColorConversionCodes.BGR2GRAY);
  200. clahe.Apply(mat, mat);
  201. return mat;*/
  202. //MagickImage image = new MagickImage(OpenCvSharp.Extensions.BitmapConverter.ToBitmap(mat));
  203. //image.WaveletDenoise((byte)threshold);
  204. //return OpenCvSharp.Extensions.BitmapConverter.ToMat(image.ToBitmap());
  205. }
  206. }
  207. }