Python opencv 计算图像灰度均值 opencv灰度图像二值化处理_opencv二值化


初学图像处理的人,一般首先熟悉图像格式,图像存储方式,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两个函数的调用方法,具体的参数怎么调节才能到达最好的效果,还需要根据具体的图像来确定,在视觉检测中,一般要将参数发布出来,供技术人员调试,不然很难达到实际检测需求。下面的图是上面两种算法的结果,可以参考一下。


Python opencv 计算图像灰度均值 opencv灰度图像二值化处理_图像处理_02


图1 原图


Python opencv 计算图像灰度均值 opencv灰度图像二值化处理_二值化_03


图2 固定阈值二值化


Python opencv 计算图像灰度均值 opencv灰度图像二值化处理_图像处理_04


图3 自适应二值化