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 ,对应的值和含义如下

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

二进制阈值和反二进制阈值

阈值化为0和阈值化为0

截断阈值

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

(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时明显感到卡顿

(4)otsu大津算法

可以直接调用CV_THRESH_OTSU

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

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值