opencv 自适应阈值化_【图像处理】OpenCV系列十九 --- 自适应阈值(adaptiveThreshold)...

上一节我们学习了几何图像变换函数的具体功能,相信大家学习之后,已经有所了解,本节了我们进入OpenCV学习的下一个模块Miscellaneous Image Transformations(各种各样的图像变换处理),首先我们学习本模块的第一个知识点,自适应阈值详解(adaptiveThreshold)。

1、函数原型

void adaptiveThreshold(InputArray src,  OutputArray dst, double maxValue,  int adaptiveMethod, int thresholdType,  int blockSize,  double C);

2、函数功能

对一幅灰度图像进行二值化,该函数支持就地操作;

该函数用下面的公式对一幅灰度图像进行二值化:

(1)正向二值化,THRESH_BINARY

46b626f893b9d0269898f1e06b0e5dc0.png

正向二值化

(2)反向二值化,THRESH_BINARY_INV

3218473b4b7bfaeaac11ab3fe6fde3b8.png

反向二值化

3、参数详解

  • 第一个参数,InputArray src,原图,即输入图像,是一个8位单通道的图像;
  • 第二个参数,OutputArray dst,目标图像,与原图像具有同样的尺寸与类型;
  • 第三个参数,double maxValue,分配给满足条件的像素的非零值;
  • 第四个参数,int adaptiveMethod,自适应阈值的方法,通常有以下几种方法;

(1)ADAPTIVE_THRESH_MEAN_C,阈值T(x,y)是(x,y)减去C的Blocksize×Blocksize邻域的平均值。

(2)ADAPTIVE_THRESH_GAUSSIAN_C ,阈值T(x,y)是(x,y)减去C的Blocksize×Blocksize邻域的加权和(与高斯相关),默认sigma(标准差)用于指定的Blocksize;具体的情况可以参见getGaussianKernel函数;

  • 第五个参数,int thresholdType,阈值的类型必须是以下两种类型,

(1)THRESH_BINARY,正向二值化

(2)THRESH_BINARY_INV ,反向二值化

  • 第六个参数,int blockSize,像素邻域的大小,用来计算像素的阈值,blockSize必须为奇数,例如,3,5,7等等;
  • 第七个参数,double C,从平均数或加权平均数减去常量。通常,它是正的,但也可能是零或负数。

4、阈值类型详解

ebc53c049775a3cca86e9546fcd5ae99.png

阈值的类型

(1)THRESH_BINARY,正向二值化,如果当前的像素值大于设置的阈值(thresh),则将该点的像素值设置为maxval;否则,将该点的像素值设置为0;

具体的公式如下

d30188890f224d9fb7ae406fb36c36e1.png

THRESH_BINARY

(2)THRESH_BINARY_INV ,反向二值化,如果当前的像素值大于设置的阈值(thresh),则将该点的像素值设置为0;否则,将该点的像素值设置为maxval;

具体的公式如下

e8989215f4ead485e5a7deb7d887cc29.png

THRESH_BINARY_INV

(3)THRESH_TRUNC ,如果当前的像素值大于设置的阈值(thresh),则将该点的像素值设置为threshold;否则,将该点的像素值不变;

具体的公式如下

5698447fa4532316ef3b12ace95890dc.png

THRESH_TRUNC

(4)THRESH_TOZERO ,如果当前的像素值大于设置的阈值(thresh),则将该点的像素值不变;否则,将该点的像素值设置为0;

具体的公式如下

51aa56fedf8cc797fd9a40b339183395.png

THRESH_TOZERO

(5)THRESH_TOZERO_INV ,如果当前的像素值大于设置的阈值(thresh),则将该点的像素值设置为0;否则,将该点的像素值不变;

具体的公式如下

faf0718dca5622511e951b337eeaea33.png

THRESH_TOZERO_INV

(6)THRESH_MASK

(7)THRESH_OTSU,使用Otsu算法选择最佳阈值。

(8)THRESH_TRIANGLE,使用三角算法选择最佳阈值。

5、具体实例

#include #include #include using namespace cv;// 原图像Mat srcImage,dstImage;// 调整自适应阈值方法的变量int g_AdaptiveMethod = 0;// 调整阈值类型的变量int g_ThresholdType = 0;// 回调函数static void OnAdaptiveMethod(int, void*);int main(int argc, char** argv){ // 载入图像 srcImage = imread("lena.png"); // 判断图像是否为空 if (srcImage.empty()) { printf("image error!"); return 0; } // 对原图像进行备份 dstImage = srcImage.clone(); namedWindow("原图"); imshow("原图
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值