? ? ? ? 之前学了Threshold()二值化函数,这个是在每一张照片里面,用同一个阈值进行二值化操作,但是对于一些对比度比较大的图片,可能会出现问题。比如这张照片想要提取出黑色文字文字:
? ? ? ? 如果执行以下代码:
CvInvoke.Threshold(srcMat, gray, 160, 255, ThresholdType.Binary);
? ? ? ? 也就是以160的阈值进行ThresholdType.Binary的二值化,它的结果是这样的:
? ? ? ? ?这个原始照片背景纸是白色的,前景文字是黑色的,但是最突出的特点是照片的上半部分比下半部分要暗。对于这种对比度大的照片,直接用Threshold()二值化函数的效果就不太好。这时候,AdaptiveThreshold()自适应阈值化处理函数闪亮登场。
? ? ? ? ?函数含义如下:
public static void AdaptiveThreshold(
IInputArray src, // 输入图像
IOutputArray dst, // 输出图像
double maxValue, // 输出图像的最大值,一般设为255
AdaptiveThresholdType adaptiveType, // 要使用的自适应阈值算法,GaussianC或者MeanC
ThresholdType thresholdType, // 阈值类型,分别为Binary和BinaryInv
int blockSize, // 计算像素阈值的像素邻域的大小,大于0的奇数
double param1 // 偏移值调整量,从GaussianC或者MeanC计算出的值再减去的常量,就是最终值,它可以是正的,也可以是零或负的。
)
? ? ? ? ?其中,MeanC的计算方法是计算出领域的平均值再减去第七个参数2的值。,GaussianC的计算方法是计算出领域的高斯均值再减去第七个参数2的值。还是上面那张图,自适应阈值算法采用GaussianC,二值化类型选择Binary,像素邻域的大小为9,偏移调整量为3,输出的结果是:
? ? ? ? ?这下是不是好多了,基本上所有的黑色文字都能看清楚了。这个函数有5个输入参数,具体的使用方法和使用效果,需要读者们多找几张图片上手试试。函数用法很简单,代码在下面:
CvInvoke.AdaptiveThreshold(srcMat, gray, 255, AdaptiveThresholdType.GaussianC, ThresholdType.Binary, 9, 3);
原创不易,请勿抄袭。共同进步,相互学习。?