1, 固定阈值Threshold
函数原型:
public static double Threshold(InputArray src,
OutputArray dst,
double thresh,
double maxval,
ThresholdTypes type);
src: 输入图像
dst: 输出图像
thresh: 阈值
maxval: 阈值最大
type: 阈值类型,详解见下
Binary: 阈值二值化(大于阈值的让它等于最大值,小于的等于最小值)
BinaryInv: 阈值反二值化(二值化阈值相反,大于阈值为最小值,小于阈值为最大值)
Trunc: 截断(大于阈值的就等于阈值,小的不变)
ToZero: 阈值归零(当大于阈值的不变,小于阈值的归零)
ToZeroIv: 阈值归零取反(与阈值取零相反,大于时为最小值,小于时保持不变)
while (true)
{
Console.WriteLine("请输入阈值");
string Value = Console.ReadLine();
Int32 result = 0;
if (int.TryParse(Value, out result))
{
if (result>255||result <0)
{
continue;
}
//阈值操作
Mat src = new Mat(@"I:\OpenCvSharp学习\3副本.jpg", ImreadModes.AnyColor);
Window srcWin = new Window("src", WindowMode.AutoSize, src);
Mat dst = new Mat();
Mat Binary = new Mat();
Mat BinaryInv = new Mat();
Mat Trunc = new Mat();
Mat ToZero = new Mat();
Mat ToZeroInv = new Mat();
Mat Mask = new Mat();
Mat Otsu = new Mat();
Mat Triangle = new Mat();
Cv2.CvtColor(src, dst, ColorConversionCodes.BGR2GRAY);
Window dstWin = new Window("dst", WindowMode.AutoSize, dst);
Cv2.Threshold(dst, Binary, result, 255, ThresholdTypes.Binary);
Cv2.Threshold(dst, BinaryInv, result, 255, ThresholdTypes.BinaryInv);
Cv2.Threshold(dst, Trunc, result, 255, ThresholdTypes.Trunc);
Cv2.Threshold(dst, dst, result, 255, ThresholdTypes.Trunc);
Cv2.Threshold(dst, ToZero, result, 255, ThresholdTypes.Tozero);
Cv2.Threshold(dst, ToZeroInv, result, 255, ThresholdTypes.TozeroInv);
Cv2.Threshold(dst, Mask, result, 255, ThresholdTypes.Mask);
Cv2.Threshold(dst, Otsu, result, 255, ThresholdTypes.Otsu);
Cv2.Threshold(dst, Triangle, result, 255, ThresholdTypes.Triangle);
Window dstWin1 = new Window("Binary", WindowMode.Normal, Binary);
Window dstWin2 = new Window("Binary", WindowMode.Normal, BinaryInv);
Window dstWin3 = new Window("BinaryInv", WindowMode.Normal, Trunc);
Window dstWin4 = new Window("Trunc", WindowMode.Normal, ToZero);
Window dstWin5 = new Window("ToZero", WindowMode.Normal, ToZero);
Window dstWin6 = new Window("ToZeroInv", WindowMode.Normal, ToZeroInv);
Window dstWin7 = new Window("Mask", WindowMode.Normal, Mask);
Window dstWin8 = new Window("Otsu", WindowMode.Normal, Otsu);
Window dstWin9 = new Window("Triangle", WindowMode.Normal, Triangle);
Cv2.WaitKey(0);
}
else
{
continue;
}
Console.ReadKey();
}
以下图片是阈值为160时的各个阈值类型的图像
2, 自动阈值AdaptiveThreshold
public static void AdaptiveThreshold(InputArray src,
OutputArray dst,
ouble maxValue,
AdaptiveThresholdTypes adaptiveMethod,
ThresholdTypes thresholdType,
int blockSize,
double c);
src: 输入图像
dst: 输出图像
maxValue: 赋给满足条件的像素的非零值
adaptiveMethod: 自适应阈值的算法
thresholdType: 阈值类型必须为THRESH_BINARY或THRESH_BINARY_INV
blockSize: 用于计算像素阈值的像素邻域大小:3、5、7,等等。
c : 常数减去平均值或加权平均值(详见下文)。通常,它是正的,但也可以是零或负的
Mat src = new Mat(@"I:\OpenCvSharp学习\3副本.jpg", ImreadModes.AnyColor);
Window srcWin = new Window("src", WindowMode.AutoSize, src);
Mat dst = new Mat();
Mat GaussianC = new Mat();
Mat MeanC = new Mat();
Mat GaussianCInv = new Mat();
Mat MeanCInv = new Mat();
Cv2.CvtColor(src, dst, ColorConversionCodes.BGR2GRAY);
Window dstWin = new Window("dst", WindowMode.AutoSize, dst);
Cv2.AdaptiveThreshold(dst, GaussianC, 255,AdaptiveThresholdTypes.GaussianC,ThresholdTypes.Binary,11,5);
Cv2.AdaptiveThreshold(dst, GaussianCInv, 255, AdaptiveThresholdTypes.GaussianC, ThresholdTypes.BinaryInv, 11, 5);
Cv2.AdaptiveThreshold(dst, MeanC, 255, AdaptiveThresholdTypes.MeanC, ThresholdTypes.Binary, 11, 5);
Cv2.AdaptiveThreshold(dst, MeanCInv, 255, AdaptiveThresholdTypes.MeanC, ThresholdTypes.BinaryInv, 11, 5);
Window dstWin1 = new Window("GaussianC", WindowMode.Normal, GaussianC);
Window dstWin11 = new Window("GaussianCInv", WindowMode.Normal, GaussianCInv);
Window dstWin2 = new Window("MeanC", WindowMode.Normal, MeanC);
Window dstWin21 = new Window("MeanCInv", WindowMode.Normal, MeanCInv);
Cv2.WaitKey(0);