目录
反二值化处理
零处理
低于阈值零处理
超出阈值零处理
截断处理
自适应处理
Otsu 方法
阈值处理的作用
像素值的最小值默认为 0,但最大值可以由开发者设定。如果最大值不是 255(纯白色),那么「非黑」的像素就不一定是纯白色了。例如,灰度值 150 表现为「灰色」,查看将 150 作为最大值处理的效果
反二值化处理
反二值化处理也叫反二值化阈值处理,其结果为二值化处理的相反结果。将大于阈值的像素值变为 0,将小于或等于阈值的像素值变为最大值。原图像中白色的部分变成黑色,黑色的部分变成白色。
import cv2
import numpy as np
image=cv2.imread('dog/gou .jpg',0)
t1,image1=cv2.threshold(image,128,255,cv2.THRESH_BINARY)
t2,image2=cv2.threshold(image,127,255,cv2.THRESH_BINARY_INV)
cv2.imshow('image1',image1)
cv2.imshow('image2',image2)
cv2.waitKey(0)
cv2.destroyAllWindows()
关于二值处理 和反二值处理的展示
零处理
零处理会将某一个范围内的像素值变为 0,并允许范围之外的像素保留原值。零处理包括低于阈值零处理和超出阈值零处理。
低于阈值零处理
低于阈值零处理也叫低阈值零处理,该处理将低于或等于阈值的像素值变为 0,大于阈值的像素值保持原值
import cv2
import numpy as np
image=cv2.imread('dog/gou .jpg',0)
t1,dst=cv2.threshold(image,127,255,cv2.THRESH_TOZERO)
cv2.imshow('dst',dst)
cv2.imshow('image',image)
cv2.waitKey(0)
cv2.destroyAllWindows()
超出阈值零处理
超出阈值零处理也叫超阈值零处理,该处理将大于阈值的像素值变为 0,小于或等于阈值的像素值保持原值
import cv2
image=cv2.imread('dog/gou .jpg',0)
t1,dst=cv2.threshold(image,127,255,cv2.THRESH_TOZERO_INV)
cv2.imshow('image',image)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
原图 与效果图
截断处理
截断处理也叫截断阈值处理,该处理将图像中大于阈值的像素值变为和阈值一样的值,小于或等于阈值的像素保持原值
import cv2
image=cv2.imread('dog/gou .jpg',)
t1,dst=cv2.threshold(image,127,255,cv2.THRESH_TRUNC)
cv2.imshow('image',image)
cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
自适应处理
前面已经依次对 cv2.THRESH_BINARY、cv2.THRESH_BINARY_INV、cv2.THRESH_TOZERO、cv2.THRESH_TOZERO_INV 和 cv2.THRESH_TRUNC 这 5 种阈值处理类型进行了详解。处理彩色图片直接使用一种阈值处理类型就能够对图像进行阈值处理。很多时候图像的色彩是不均衡的,如果只使用一种阈值处理类型,就无法得到清晰有效的结果。
import cv2
image=cv2.imread('dog/gou .jpg')
image_gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
athdmena=cv2.adaptiveThreshold\
(image_gray,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,5,3)
athdgaus=cv2.adaptiveThreshold\
(image_gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
cv2.THRESH_BINARY,5,3)
cv2.imshow('athdmena',athdmena)
cv2.imshow('athdgaus',athdgaus)
cv2.waitKey(0)
cv2.destroyAllWindows()
从视觉上看,对于色彩不均衡的图像,虽然使用截断处理的效果是 5 种阈值处理类型中效果比较好的,但是有些轮廓依然模糊不清,不适合计算机用来识别
OpenCV 提供了一种改进的阈值处理技术:图像中的不同区域使用不同的阈值。把这种改进的阈值处理技术称作自适应阈值处理也称自适应处理,自适应阈值是根据图像中某一正方形区域内的所有像素值按照指定的算法计算得到的。与前面讲解的 5 种阈值处理类型相比,自适应处理能更好地处理明暗分布不均的图像,获得更简单的图像效果。
OpenCV 提供了 adaptiveThresHold()方法对图像进行自适应处理,adaptiveThresHold()方法的语法如下:
dst = cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, block
注意
使用自适应阈值处理图像时,如果图像是彩色图像,那么需要先将彩色图像转换为灰度图像;否则,运行程序时会出现错误提示。
Otsu 方法
前面在讲解 5 种阈值处理类型的过程中,每个实例设置的阈值都是 127,这个 127 是笔者设置的,并不是通过算法计算得到的。对于有些图像,当阈值被设置为 127 时,得到的效果并不好,这时就需要一个个去尝试,直到找到最合适的阈值。
逐个寻找最合适的阈值不仅工作量大,而且效率低。为此,OpenCV 提供了 Otsu 方法。Otsu 方法能够遍历所有可能的阈值,从中找到最合适的阈值。
Otsu 方法的语法与 threshold()方法的语法基本一致,只不过在为 type 传递参数时,要多传递一个参数,即 cv2.THRESH_OTSU。cv2.THRESH_OTSU 的作用就是实现 Otsu 方法的阈值处理。Otsu 方法的语法如下:
retval, dst = cv2.threshold(src, thresh, maxval, type)
#---------otsu方法计算阈值---------
import cv2
image=cv2.imread('dog/gou .jpg',0)
t,dst=cv2.threshold(image,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
cv2.imshow('dst',dst)
print(t)
cv2.imshow('image',image)
cv2.waitKey(0)
cv2.destroyAllWindows()
阈值处理的作用
阈值处理在计算机视觉技术中占有十分重要的位置,它是很多高级算法的底层处理逻辑之一。因为二值图像会忽略细节,放大特征,而很多高级算法要根据物体的轮廓来分析物体特征,所以二值图像非常适合做复杂的识别运算。在进行识别运算之前,应先将图像转为灰度图像,再进行二值化处理,这样就得到了算法所需要的物体(大致)轮廓图像。