赞
踩
从以下复杂背景图片下提取划痕
假设采用全局阈值二值化, cv::threshold(src, globalBinayImage, 150, 255, cv::THRESH_BINARY_INV),很难得到最优的二值化效果,划痕没有完整提取出来,反而把背景也提取出来了:
这个时候就需要一种能够自适应的二值化算法上场了。
CV_EXPORTS_W void adaptiveThreshold( InputArray src, OutputArray dst,
double maxValue, int adaptiveMethod,
int thresholdType, int blockSize, double C );
src:输入8位单通道图像。
dst:输出图像,大小和类型与src相同。
maxValue:满足条件的像素所分配的非零值。
adaptiveMethod:要使用的自适应阈值算法,ADAPTIVE_THRESH_MEAN_C或者ADAPTIVE_THRESH_GAUSSIAN_C
thresholdType:阈值类型,必须是THRESH_BINARY或者HRESH_BINARY_INV,指示要提取亮区域还是暗区域
blockSize:用于计算像素阈值的像素邻域的大小:3,5,7,以此类推。
C:偏移值调整量,从每个邻域计算出的平均值或高斯加权平均值中减去的常量,就是最终阈值,它可以是正的,也可以是零或负的。
算法通过计算每个像素周围blockSize x blockSize大小像素块的加权均值并减去常量C得到该像素值的最终阈值,每个像素都会有一个自适应的动态阈值。
cv::Mat src;
src = cv::imread("D:\\QtProject\\Opencv_Example\\adaptiveThreshold\\adaptiveThreshold.png", cv::IMREAD_GRAYSCALE);
if (src.empty()) {
cout << "Cannot load image" << endl;
return;
}
//全局二值化
cv::Mat globalBinayImage;
cv::threshold(src, globalBinayImage, 150, 255, cv::THRESH_BINARY_INV);
//自适应二值化
cv::Mat binaryImage;
cv::adaptiveThreshold(src, binaryImage, 255,cv::THRESH_BINARY_INV, cv::ADAPTIVE_THRESH_GAUSSIAN_C, 7,8);
程序运行效果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。