opencv二值化实验
二值化实验
- 1二值化说明
- 2 阈值法(THRESH_BINARY)
- 3.反阈值法(THRESH_BINARY_INV)
- 4截断阈值法(THRESH_TRUNC)
- 5 低阈值零处理(THRESH_TOZERO)
- 6 超阈值零处理(THRESH_TOZERO_INV)
- 7 OTSU阈值法
- 8 自适应二值化
- 8.1取均值(ADAPTIVE_THRESH_GAUSSIAN_MEAN_C)
- 8.2加权求和(ADAPTIVE_THRESH_GAUSSIAN_C)
1二值化说明
二值化,顾名思义,就是将某张图像的所有像素改成只有两种值之一,其操作的图像也必须是灰度图。也就是说,二值化的过程,就是将一张灰度图上的像素根据某种规则修改为0和maxval(maxval表示最大值,一般为255,显示白色)两种像素值,使图像呈现黑白的效果,能够帮助我们更好地分析图像中的形状、边缘和轮廓等特征。
在本实验中,使用了六种不同的方式来对灰度图进行二值化。
分别为:
- 1.阈值法(THRESH_BINARY)
- 2.反阈值法(THRESH_BINARY_INV)
-
- 截断阈值法(THRESH_TRUNC)
-
- 低阈值零处理(THRESH_TOZERO)
-
- 超阈值零处理(THRESH_TOZERO_INV)
-
- OTSU阈值法
2 阈值法(THRESH_BINARY)
阈值法就是通过设置一个阈值,将灰度图中的每一个像素值与该阈值进行比较,小于等于阈值的像素就被设置为0(黑),大于阈值的像素就被设置为maxval。
代码如下:
'''阈值法'''#二值化实验必须是在灰度图的基础上进行二值处理#直接读取灰度图img=cv2.imread(r'../15day4.10/src/flower.png',cv2.IMREAD_GRAYSCALE)#进行二值处理使用cv2.threshold()方法返回值为元组,第二个元素才是想要的二值图_,img_b=cv2.threshold(img,127,255,cv2.THRESH_BINARY)#小于127的像素点变为127,超过127的像素点变为255cv2.imshow("img",img)cv2.imshow("img_b",img_b)cv2.waitKey(0)
threshold参数说明:
- 参数1:是要做二值化处理的灰度图
- 参数2:设置的阈值,并且是小于这个值的像素点变为这个值
- 参数3 表示超过阈值的像素点的值变为参数3的这个值
- 参数4:表示要进行二值化处理的类型
注意:
- 二值化实验的进行处理的原图必须是灰度图
- threshold的返回值为两个值的元组,第二个值才是处理完后的二值图
- 二值图不是只有0和255的组合,只要是任意两个0-255的组合都可以
3.反阈值法(THRESH_BINARY_INV)
顾名思义,就是与阈值法相反。反阈值法是当灰度图的像素值大于阈值时,该像素值将会变成0(黑),当灰度图的像素值小于等于阈值时,该像素值将会变成maxval。
代码如下:
'''反阈值法'''img=cv2.imread(r'../15day4.10/src/flower.png',cv2.IMREAD_GRAYSCALE)#小于127的像素点变为255,超过127的像素点变为127_,img_b=cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)cv2.imshow("img",img)cv2.imshow("img_b",img_b)cv2.waitKey(0)
反阈值法就是跟阈值法相反,低于阈值的设置为另一个值,超过阈值的设置为阈值的 值
4截断阈值法(THRESH_TRUNC)
截断阈值法,指将灰度图中的所有像素与阈值进行比较,像素值大于阈值的部分将会被修改为阈值,小于等于阈值的部分不变。换句话说,经过截断阈值法处理过的二值化图中的最大像素值就是阈值。
代码如下:
'''截断阈值法'''img=cv2.imread(r'../15day4.10/src/flower.png',cv2.IMREAD_GRAYSCALE)#超过阈值的像素点设置为阈值,没有超过的不变,这里的255只是作为一个threshold的参数_,img_b=cv2.threshold(img,150,255,cv2.THRESH_TRUNC)cv2.imshow("img",img)cv2.imshow("img_b",img_b)cv2.waitKey(0)
注意:
- 截断阈值法(cv2.THRESH_TRUNC)和灰度图相似有多种颜色
- 超过阈值的像素点设置为阈值,没有超过的不变,这里的参数3只是作为一个threshold的参数,在这个方法中不起作用
5 低阈值零处理(THRESH_TOZERO)
低阈值零处理,字面意思,就是像素值小于等于阈值的部分被置为0(也就是黑色),大于阈值的部分不变。
代码如下:
'''低阈值零处理法'''img=cv2.imread(r'../15day4.10/src/flower.png',cv2.IMREAD_GRAYSCALE)#小于或等于阈值的像素点设置为0,超过的不变,这里的255只是作为一个threshold的参数_,img_b=cv2.threshold(img,127,255,cv2.THRESH_TOZERO)cv2.imshow("img",img)cv2.imshow("img_b",img_b)cv2.waitKey(0)
注意:
-低阈值零处理(cv2.THRESH_TOZERO) 小于或等于阈值的像素点设置为0,超过的不变,这里的参数3只是作为一个threshold的参数,在这个方法中不起作用
6 超阈值零处理(THRESH_TOZERO_INV)
超阈值零处理就是将灰度图中的每个像素与阈值进行比较,像素值大于阈值的部分置为0(也就是黑色),像素值小于等于阈值的部分不变。
和低阈值零处理(cv2.THRESH_TOZERO)方法相反
代码如下:
'''超阈值零处理'''img=cv2.imread(r'../15day4.10/src/flower.png',cv2.IMREAD_GRAYSCALE)#大于或等于阈值的像素点设置为0,没超过的不变,这里的255只是作为一个threshold的参数_,img_b=cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)cv2.imshow("img",img)cv2.imshow("img_b",img_b)cv2.waitKey(0)
以上介绍的二值化方法都需要手动设置阈值,但是在不同的环境下,摄像头拍摄的图像可能存在差异,导致手动设置的阈值并不适用于所有图像,这可能会导致二值化效果不理想。因此,我们需要一种能自动计算每张图片阈值的二值化方法,能够根据每张图像的特点 自动计算出适合该图像的二值化阈值,从而达到更好的二值化效果。这种二值化方法可以在不同环境下适用,提高图像处理的准确性和鲁棒性。
7 OTSU阈值法
OTSU算法的具体实现
通过OTSU算法得到阈值之后,就可以结合上面的方法根据该阈值进行二值化,在本实验中**有THRESH_OTSU和THRESH_INV_OTSU两种方法,**就是在计算出阈值后结合了阈值法和反阈值法。
注意:使用OTSU算法计算阈值时,组件中的thresh参数将不再有任何作用。
代码如下:
'''OSTU阈值处理'''img=cv2.imread(r'../15day4.10/src/flower.png',cv2.IMREAD_GRAYSCALE)#127不使用,超过阈值的设置为255 _,img_b=cv2.threshold(img,127,255,cv2.THRESH_OTSU)cv2.imshow("img",img)cv2.imshow("img_b",img_b)cv2.waitKey(0)
8 自适应二值化
与二值化算法相比,自适应二值化更加适合用在明暗分布不均的图片,因为图片的明暗不均,导致图片上的每一小部分都要使用不同的阈值进行二值化处理,这时候传统的二值化算法就无法满足我们的需求了,于是就出现了自适应二值化。
自适应二值化方法会对图像中的所有像素点计算其各自的阈值,这样能够更好的保留图片里的一些信息。自适应二值化组件内容如下图所示:
方法的格式如下:
cv2.adaptiveThreshold(image_np_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 7, 10)
其中各个参数的含义如下:
maxval:最大阈值,一般为255
adaptiveMethod:小区域阈值的计算方式:
ADAPTIVE_THRESH_MEAN_C:小区域内取均值
ADAPTIVE_THRESH_GAUSSIAN_C:小区域内加权求和,权重是个高斯核
thresholdType:二值化方法,只能使用THRESH_BINARY、THRESH_BINARY_INV,也就是阈值法和反阈值法
blockSize:选取的小区域的面积,如7就是7*7的小块。
c:最终阈值等于小区域计算出的阈值再减去此值
8.1取均值(ADAPTIVE_THRESH_GAUSSIAN_MEAN_C)
假如我们使用的小区域是3*3的,那么就会从图片的左上角开始(也就是像素值为162的地方)计算其邻域内的平均值,如果处于边缘地区就会对边界进行填充,填充值就是边界的像素点,如下图所示:
代码如下:
'''自适应阈值法——取均值'''img=cv2.imread(r'../15day4.10/src/flower.png',cv2.IMREAD_GRAYSCALE)#127不使用,超过阈值的设置为255 img_b=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,3,2)#3表示一个正方形的边长(也称为卷积核)必须是奇数 2是一个常数cv2.imshow("img",img)cv2.imshow("img_b",img_b)cv2.waitKey(0)
注意:
cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,3,2)
- 参数2: 255: 输出图像的最大值。在二值化后,超过自适应阈值的像素会被设置为该最大值,通常为255表示白色;未超过阈值的像素将被设置为0,表示黑色。
- 参数3 :表示自适应二值法的类型
- 参数4:表示使用阈值法的类型
- 参数5:表示一个卷积核,表示计算每个像素阈值时所考虑的7x7邻域大小(正方形区域的宽度和高度),其值必须是奇数。
- 参数6:是一个最终阈值减去的常数
8.2加权求和(ADAPTIVE_THRESH_GAUSSIAN_C)
加权求和的原理
首先还是对边界进行填充,然后计算原图中的左上角(也就是162像素值的位置)的二值化阈值,其计算过程如上图所示,再然后根据选择的二值化方法对左上角的像素点进行二值化,之后核向右继续计算第二个像素点的阈值,第三个像素点的阈值…直到右下角(也就是155像素值的位置)为止。
当核的大小不同时,仅仅是核的参数会发生变化,计算过程与此是一样的。
代码如下:
'''自适应二值化——加权值(高斯求和)'''img=cv2.imread(r'../15day4.10/src/flower.png',cv2.IMREAD_GRAYSCALE)img_b=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,3,2)#3表示一个正方形的边长(也称为卷积核)必须是奇数 2是一个常数cv2.imshow("img_b",img_b)cv2.imshow("img",img)cv2.waitKey(0)