OpenCV--图像二值化、阈值化

阈值化

(1)直接

cvtColor(sourceImg, imgGray, CV_BGR2GRAY);  //转成灰度
Mat dst=imgGray>150;    //大于150为白色
imshow("二值化",dst);

(2)threshold() 固定阈值操作

double cv::threshold(  
    cv::InputArray src, // 输入图像 灰度图cvtColor(src, src, CV_BGR2GRAY);  
    cv::OutputArray dst, // 输出图像  
    double thresh, // 阈值  
    double maxValue, // 向上最大值  
    int thresholdType // 阈值化操作的类型   
);

关于thresholdType ,对应的值和含义如下

OpenCV--图像二值化、阈值化_第1张图片

使用以上5种类型,实验如下:

二进制阈值和反二进制阈值
OpenCV--图像二值化、阈值化_第2张图片
阈值化为0和阈值化为0
OpenCV--图像二值化、阈值化_第3张图片
截断阈值
OpenCV--图像二值化、阈值化_第4张图片

可以看出,由于图片各处亮度不同,导致阈值化的效果并不好

(3)自适应阈值化——cv::adaptiveThreshold()

自适应阈值化能够根据图像不同区域亮度分布的,改变阈值,具体调用方法如下

void cv::adaptiveThreshold(
	cv::InputArray src, // 输入图像
	cv::OutputArray dst, // 输出图像
	double maxValue, // 向上最大值
	int adaptiveMethod, // 自适应方法,平均或高斯
	int thresholdType // 阈值化类型
	int blockSize, // 块大小
	double C // 常量
);

支持两种自适应方法,即adaptiveMethod可为
ADAPTIVE_THRESH_MEAN_C(平均)和ADAPTIVE_THRESH_GAUSSIAN_C(高斯)
  在两种情况下,自适应阈值T(x, y)。通过计算每个像素周围bxb大小像素块的加权均值并减去常量C得到。其中,b由blockSize给出,须为奇数3,5,7…
  如果使用平均的方法,则所有像素周围的权值相同;如果使用高斯的方法,则(x,y)周围的像素的权值则根据其到中心点的距离通过高斯方程得到

使用slider调节blockSize效果如下(图片大小为540*581,经测试最合适的blockSize为127)

//----------------------------------【on_Trackbar()函数】-----------------------------
//     描述:响应滑动条的回调函数
//-----------------------------------------------------------------------------------
void on_Trackbar(int, void *)
{
	int maxVal = 255;
	int blockSize = 2*ValueSlider+3;  //blockSize为奇数,3,5,7...
	double C = 0;
	cv::adaptiveThreshold(chessImg, dstAdpat, maxVal, cv::ADAPTIVE_THRESH_MEAN_C, cv::THRESH_BINARY, blockSize, C);
	//显示效果图
	imshow(WINDOW_NAME, dstAdpat);
}
高斯所用时间较长,在调b时明显感到卡顿 OpenCV--图像二值化、阈值化_第5张图片

(4)otsu大津算法

可以直接调用CV_THRESH_OTSU

threshold(srcGray,dstOTSU,0,255, CV_THRESH_OTSU);  //thresh由OTSU算法生成

OpenCV--图像二值化、阈值化_第6张图片

你可能感兴趣的:(OpenCV)