自适应阈值(AdaptiveThreshold):用于二值化处理图像,对于对比大的图像有较好效果,相对于opencv中固定阈值化操作(Threshold),自适应阈值中图像中每一个像素点的阈值是不同的,该阈值由其领域中图像像素带点加权平均决定。这样做的好处:
1、每个像素位置处的二值化阈值不是固定不变的,而是由其周围邻域像素的分布来决定的。
2、亮度较高的图像区域的二值化阈值通常会较高,而亮度较低的图像区域的二值化阈值则会相适应地变小。
3、不同亮度、对比度、纹理的局部图像区域将会拥有相对应的局部二值化阈值。
参数说明:
AdaptiveThreshold(InputArray src, OutputArray dst, double maxValue, AdaptiveThresholdTypes adaptiveMethod, ThresholdTypes thresholdType, int blockSize, double c)
第1个参数 src:源图像。
第2个参数 dst:输出图像,与源图像大小一致。
第3个参数 maxValue:超过阈值的部分取值是多少。
第4个参数 adaptiveMethod:在一个邻域内计算阈值所采用的算法(MeanC 和 GaussianC)。
MeanC的计算方法是计算出领域的平均值再减去第七个参数的值。
GaussianC的计算方法是计算出领域的高斯均值再减去第七个参数的值。
第5个参数 thresholdType:阈值类型。Binary、BinaryInv等。
第6个参数 blockSize:像素的邻域块大小选择,这是局部邻域大小(3、5、7等)。
第7个参数 c:这个参数实际上是一个偏移值调整量,用均值和高斯计算阈值后,再减或加这个值就是最终阈值。
using OpenCvSharp; using OpenCvSharp.Extensions; using DlibDotNet; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace app { public partial class FrmMain : Form { public FrmMain() { InitializeComponent(); } /// <summary> /// 自适应阀值 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnAdaptiveThreshold_Click(object sender, EventArgs e) { Mat src = Cv2.ImRead(@"img\jzh.png"); Cv2.ImShow("src", src); // 灰度转换 Mat gray = new Mat(); Cv2.CvtColor(src, gray, ColorConversionCodes.BGR2GRAY); // 转换为 8位无符号字符型 Mat dest_8U = new Mat(); gray.ConvertTo(dest_8U, MatType.CV_8U); // 阈值化二值分割。 // 自适应阈值则,是根据像素的邻域块的像素值分布来确定该像素位置上的二值化阈值。 /* 第1个参数 src:源图像。 第2个参数 dst:输出图像,与源图像大小一致。 第3个参数 maxValue:超过阈值的部分取值是多少。 第4个参数 adaptiveMethod:在一个邻域内计算阈值所采用的算法(MeanC 和 GaussianC)。 MeanC的计算方法是计算出领域的平均值再减去第七个参数的值。 GaussianC的计算方法是计算出领域的高斯均值再减去第七个参数的值。 第5个参数 thresholdType:阈值类型。Binary、BinaryInv等。 第6个参数 blockSize:像素的邻域块大小选择,这是局部邻域大小(3、5、7等)。 第7个参数 c:这个参数实际上是一个偏移值调整量,用均值和高斯计算阈值后,再减或加这个值就是最终阈值。 */ Mat dest1 = new Mat(); Mat dest2 = new Mat(); Cv2.AdaptiveThreshold(dest_8U, dest1, 200, AdaptiveThresholdTypes.GaussianC, ThresholdTypes.Binary, 199, 0); Cv2.ImShow("dist-AdaptiveThreshold GaussianC", dest1); Cv2.AdaptiveThreshold(dest_8U, dest2, 200, AdaptiveThresholdTypes.MeanC, ThresholdTypes.Binary, 199, 0); Cv2.ImShow("dist-AdaptiveThreshold MeanC", dest2); } } }