可根据灰度的差异来分割图像

1, 固定阈值Threshold


函数原型:

  1. public static double Threshold(InputArray src,
  2. OutputArray dst,
  3. double thresh,
  4. double maxval,
  5. ThresholdTypes type);

src: 输入图像
dst: 输出图像
thresh: 阈值
maxval: 阈值最大
type: 阈值类型,详解见下
Binary: 阈值二值化(大于阈值的让它等于最大值,小于的等于最小值)
BinaryInv: 阈值反二值化(二值化阈值相反,大于阈值为最小值,小于阈值为最大值)
Trunc: 截断(大于阈值的就等于阈值,小的不变)
ToZero: 阈值归零(当大于阈值的不变,小于阈值的归零)
ToZeroIv: 阈值归零取反(与阈值取零相反,大于时为最小值,小于时保持不变)

  1. while (true)
  2. {
  3. Console.WriteLine("请输入阈值");
  4. string Value = Console.ReadLine();
  5. Int32 result = 0;
  6. if (int.TryParse(Value, out result))
  7. {
  8. if (result>255||result <0)
  9. {
  10. continue;
  11. }
  12. //阈值操作
  13. Mat src = new Mat(@"I:\OpenCvSharp学习\3副本.jpg", ImreadModes.AnyColor);
  14. Window srcWin = new Window("src", WindowMode.AutoSize, src);
  15. Mat dst = new Mat();
  16. Mat Binary = new Mat();
  17. Mat BinaryInv = new Mat();
  18. Mat Trunc = new Mat();
  19. Mat ToZero = new Mat();
  20. Mat ToZeroInv = new Mat();
  21. Mat Mask = new Mat();
  22. Mat Otsu = new Mat();
  23. Mat Triangle = new Mat();
  24. Cv2.CvtColor(src, dst, ColorConversionCodes.BGR2GRAY);
  25. Window dstWin = new Window("dst", WindowMode.AutoSize, dst);
  26. Cv2.Threshold(dst, Binary, result, 255, ThresholdTypes.Binary);
  27. Cv2.Threshold(dst, BinaryInv, result, 255, ThresholdTypes.BinaryInv);
  28. Cv2.Threshold(dst, Trunc, result, 255, ThresholdTypes.Trunc);
  29. Cv2.Threshold(dst, dst, result, 255, ThresholdTypes.Trunc);
  30. Cv2.Threshold(dst, ToZero, result, 255, ThresholdTypes.Tozero);
  31. Cv2.Threshold(dst, ToZeroInv, result, 255, ThresholdTypes.TozeroInv);
  32. Cv2.Threshold(dst, Mask, result, 255, ThresholdTypes.Mask);
  33. Cv2.Threshold(dst, Otsu, result, 255, ThresholdTypes.Otsu);
  34. Cv2.Threshold(dst, Triangle, result, 255, ThresholdTypes.Triangle);
  35. Window dstWin1 = new Window("Binary", WindowMode.Normal, Binary);
  36. Window dstWin2 = new Window("Binary", WindowMode.Normal, BinaryInv);
  37. Window dstWin3 = new Window("BinaryInv", WindowMode.Normal, Trunc);
  38. Window dstWin4 = new Window("Trunc", WindowMode.Normal, ToZero);
  39. Window dstWin5 = new Window("ToZero", WindowMode.Normal, ToZero);
  40. Window dstWin6 = new Window("ToZeroInv", WindowMode.Normal, ToZeroInv);
  41. Window dstWin7 = new Window("Mask", WindowMode.Normal, Mask);
  42. Window dstWin8 = new Window("Otsu", WindowMode.Normal, Otsu);
  43. Window dstWin9 = new Window("Triangle", WindowMode.Normal, Triangle);
  44. Cv2.WaitKey(0);
  45. }
  46. else
  47. {
  48. continue;
  49. }
  50. Console.ReadKey();
  51. }

以下图片是阈值为160时的各个阈值类型的图像
image.png

2, 自动阈值AdaptiveThreshold

  1. public static void AdaptiveThreshold(InputArray src,
  2. OutputArray dst,
  3. ouble maxValue,
  4. AdaptiveThresholdTypes adaptiveMethod,
  5. ThresholdTypes thresholdType,
  6. int blockSize,
  7. double c);

src: 输入图像
dst: 输出图像
maxValue: 赋给满足条件的像素的非零值
adaptiveMethod: 自适应阈值的算法
thresholdType: 阈值类型必须为THRESH_BINARY或THRESH_BINARY_INV
blockSize: 用于计算像素阈值的像素邻域大小:3、5、7,等等。
c : 常数减去平均值或加权平均值(详见下文)。通常,它是正的,但也可以是零或负的

  1. Mat src = new Mat(@"I:\OpenCvSharp学习\3副本.jpg", ImreadModes.AnyColor);
  2. Window srcWin = new Window("src", WindowMode.AutoSize, src);
  3. Mat dst = new Mat();
  4. Mat GaussianC = new Mat();
  5. Mat MeanC = new Mat();
  6. Mat GaussianCInv = new Mat();
  7. Mat MeanCInv = new Mat();
  8. Cv2.CvtColor(src, dst, ColorConversionCodes.BGR2GRAY);
  9. Window dstWin = new Window("dst", WindowMode.AutoSize, dst);
  10. Cv2.AdaptiveThreshold(dst, GaussianC, 255,AdaptiveThresholdTypes.GaussianC,ThresholdTypes.Binary,11,5);
  11. Cv2.AdaptiveThreshold(dst, GaussianCInv, 255, AdaptiveThresholdTypes.GaussianC, ThresholdTypes.BinaryInv, 11, 5);
  12. Cv2.AdaptiveThreshold(dst, MeanC, 255, AdaptiveThresholdTypes.MeanC, ThresholdTypes.Binary, 11, 5);
  13. Cv2.AdaptiveThreshold(dst, MeanCInv, 255, AdaptiveThresholdTypes.MeanC, ThresholdTypes.BinaryInv, 11, 5);
  14. Window dstWin1 = new Window("GaussianC", WindowMode.Normal, GaussianC);
  15. Window dstWin11 = new Window("GaussianCInv", WindowMode.Normal, GaussianCInv);
  16. Window dstWin2 = new Window("MeanC", WindowMode.Normal, MeanC);
  17. Window dstWin21 = new Window("MeanCInv", WindowMode.Normal, MeanCInv);
  18. Cv2.WaitKey(0);

image.png