opencv 二值化_图像二值化处理

4f10ffb2524931a863e10784381cb601.png

初学图像处理的人,一般首先熟悉图像格式,图像存储方式,8位灰度图,24位彩色图等基础知识,然后接触到的图像算法一般都是图像直方图、图像二值化处理等基础算法。二值化算法作为图像处理入门级算法,在很多场合都有应用。常用的二值化算法是固定阈值二值化,算法本身很简单,机器视觉处理的很多都是8位灰度图像,灰度值从0到255,。所谓二值化就是给定一个阈值,让小于这个阈值的灰度值为0,大于等于这个阈值的设为255,这样在图像上显示出来就是一幅黑白图像。当然,很多资料介绍的是小于阈值为0,大于阈值为1。这其实是一个意思。但是,如果想看到显示效果,一般不会用1来表示亮的点,而是用255。如果熟悉了最早我写的opencv对于mat数据的操作,要实现这种固定阈值算法是非常简单的。但是,opencv已经写好了二值化算法,也不需要我们自己写了。下面看一下具体的例子,代码在vs2015+opencv4.0.1上实现。如果已经配置好了opencv,可以直接运行。

#include "iostream"
#include "opencv2opencv.hpp"
using namespace std;
int main(int argc, char ** argv)
{
Mat src = imread("e:img1.ppm", 0);
Mat dst;
threshold(src, dst, 100, 255, 0);
Mat adpDst;
adaptiveThreshold(src, adpDst, 100, 0, 0, 31,-20);
namedWindow("src", 0);
imshow("src", src);
namedWindow("dst", 0);
imshow("dst", dst);
namedWindow("adp", 0);
imshow("adp", adpDst);
waitKey(0);
return 0;
}

可以看到,算法本身很简单,只需要一个函数threshold就可以实现。第一个参数是输入图像,第二个是输出图像,第三个是阈值,第四个是指将大于等于阈值的灰度值设置为多大的值,最后一个参数是二值化方式。在opencv里面用了一个枚举类型来定义。如下:

enum ThresholdTypes {

THRESH_BINARY = 0,

THRESH_BINARY_INV = 1,

THRESH_TRUNC = 2,

THRESH_TOZERO = 3,

THRESH_TOZERO_INV = 4,

THRESH_MASK = 7,

THRESH_OTSU = 8,

THRESH_TRIANGLE = 16

};

在这几种二值化方式的中,最常用的也就是前面两种。有的人还喜欢用THRESH_OTSU进行二值化,这是大律法。然而,如果直接用大律法进行二值化,实际效果并不是很好,因为这是全局阈值,比较好的二值化方法应该用局部阈值,毕竟图像上每个地方的灰度值差别是比较大的。所以,opencv里面有提供了一个局部自适应二值化函数adaptiveThreshold。这个函数的效果比较好,但是,很多人用这个函数的时候,却不知道参数怎么设置比较好,结果往往出来的效果不理想,反而认为算法不好。其实,就算固定阈值二值化算法,在很多时候都能得到很好的效果,只不过我们很多人不是很清楚算法怎么配合使用而已。比如,我们设置参数的时候,对于adaptiveThreshold算法,设置的块大小很多人都是3、5、7。好像觉得把块设大一点图像就不对了一样,对于adaptiveThreshold的最后一个参数,其实还可以设置为负值,可能最后得到的效果就完全不一样。所以,这就是我们对算法不够了解,只知道如何调用这些函数,却不知道怎么使用是最好的。

另外,对于threshold函数,由于只有一个固定阈值,而很多时候我们可能需要分段阈值,有可能图像上的感兴趣区域灰度值在100到180之间,那么这个函数就需要我们自己改造一下才能够达到效果。此外,其实很多时候是不直接对原图进行二值化操作的,这种效果并不好,这也是很多人觉得threshold函数效果不好的原因,给个提示,如果你先将图像进行一下边缘检测,再用这个函数试试,可能效果就完全不一样了,当然边缘检测的函数也要有选择,不能随便哪个函数都可以。

上面代码只是展示了threshold和adaptiveThreshold两个函数的调用方法,具体的参数怎么调节才能到达最好的效果,还需要根据具体的图像来确定,在视觉检测中,一般要将参数发布出来,供技术人员调试,不然很难达到实际检测需求。下面的图是上面两种算法的结果,可以参考一下。

7b81661e639cf4796f15c72eaa027065.png

图1 原图

4eeb7316644ce16f41403f7b6ac00797.png

图2 固定阈值二值化

3bca07cbe13ea54ea0a9e7098a7d28dc.png

图3 自适应二值化

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值