OpenCV轻松入门_面向python(第六章 阈值处理)
阈值处理:剔除图像的像素值高于或低于一定值的像素点。
threshold函数
语法格式:
retval, dst = cv2.threshold( src, thresh, maxval, type )
- retval 代表返回的阈值。
- dst 代表阈值分割结果图像,与原始图像具有相同的大小和类型。
- src 代表要进行阈值分割的图像,可以是多通道的,8 位或 32 位浮点型数值。
- thresh 代表要设定的阈值。
- maxval 代表当 type 参数为 THRESH_BINARY 或者 THRESH_BINARY_INV 类型时,需要设定的最大值。
- type 代表阈值分割的类型
阈值分割类型:
阈值分割类型可视化:
二值化阈值处理(cv2.THRESH_BINARY)
二值化阈值处理会将原始图像处理为仅有两个值的二值图像;对于灰度值大于阈值thresh的像素点,将其灰度值设定为最大值;对于灰度值小于或等于阈值thresh的像素点,将其灰度值设定为 0。
用函数 cv2.threshold()对数组进行二值化阈值处理
import cv2
import numpy as np
img = np.random.randint(0,256,size = [4,5],dtype=np.uint8)
t,rst = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
print("img=\n",img)
print("t=\n",t)
print("rst=\n",rst)
使用函数 cv2.threshold()对图像进行二值化阈值处理
import cv2
import numpy as np
img = cv2.imread("lena.jpg")
t,rst = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
cv2.imshow("img",img)
cv2.imshow("rst",rst)
cv2.waitKey()
cv2.destroyAllWindows()
r)
反二值化阈值处理(cv2.THRESH_BINARY_INV)
对于灰度值大于阈值的像素点,将其值设定为 0;对于灰度值小于或等于阈值的像素点,将其值设定为 255。
用函数 cv2.threshold()对图像进行反二值化阈值处理
import cv2
import numpy as np
img = cv2.imread("lena.jpg")
t,rst = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
cv2.imshow("img",img)
cv2.imshow("rst",rst)
cv2.waitKey()
cv2.destroyAllWindows()
截断阈值化处理(cv2.THRESH_TRUNC)
截断阈值化处理会将图像中大于阈值的像素点的值设定为阈值,小于或等于该阈值的像素点的值保持不变。
用函数 cv2.threshold()对图像进行截断阈值化处理。
import cv2
import numpy as np
img=cv2.imread("lena.jpg")
t,rst = cv2.threshold(img,127,255,cv2.THRESH_TRUNC)
cv2.imshow("img",img)
cv2.imshow("rst",rst)
cv2.waitKey()
cv2.destroyAllWindows()
超阈值零处理(cv2.THRESH_TOZERO_INV)
超阈值零处理会将图像中大于阈值的像素点的值处理为 0,小于或等于该阈值的像素点的值保持不变。
import cv2
import numpy as np
img=cv2.imread("lena.jpg")
t,rst = cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)
cv2.imshow("img",img)
cv2.imshow("rst",rst)
cv2.waitKey()
cv2.destroyAllWindows()
低阈值零处理(cv2.THRESH_TOZERO)
对于像素值大于阈值的像素点,其值将保持不变; 对于像素值小于或等于阈值的像素点,其值将被处理为 0。
用函数 cv2.threshold()对图像进行低阈值零处理。
import cv2
img = cv2.imread("lena.jpg")
t,rst = cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
cv2.imshow("img",img)
cv2.imshow("rst",rst)
cv2.waitKey()
cv2.destroyAllWindows()
自适应阈值处理
在进行阈值处理时,自适应阈值处理的方式通过计算每个像素点周围临近区域的加权平均值获得阈值,并使用该阈值对当前像素点进行处理。与普通的阈值处理方法相比,自适应阈值处理能够更好地处理明暗差异较大的图像。
函数 cv2.adaptiveThreshold()
来实现自适应阈值处理,该函数的语法格式为:
dst=cv.adaptiveThreshold(src,maxValue,adaptiveMethod,thresholdType,blockSize,C)
- dst 代表自适应阈值处理结果。
- src 代表要进行处理的原始图像。需要注意的是,该图像必须是 8 位单通道的图像。
- maxValue 代表最大值。
- adaptiveMethod 代表自适应方法:
cv2.ADAPTIVE_THRESH_MEAN_C
:邻域所有像素点的权重值是一致的。
cv2.ADAPTIVE_THRESH_GAUSSIAN_C
:与邻域各个像素点到中心点的距离有关,通过高斯方程得到各个点的权重值。 - thresholdType 代表阈值处理方式,该值必须是
cv2.THRESH_BINARY
或cv2.THRESH_BINARY_INV
中的一个。 - blockSize 代表块大小。表示一个像素在计算其阈值时所使用的邻域尺寸,通常为 3、5、7 等。
- C 是常量。
import cv2
img = cv2.imread("computer.jpg",0)
t1,thd = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
athdMEAN=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,5,3)
athdGAUS=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,5,3)
cv2.imshow("img",img)
cv2.imshow("thd",thd)
cv2.imshow("athdMEAN",athdMEAN)
cv2.imshow("athdGAUS",athdGAUS)
cv2.waitKey()
cv2.destroyAllWindows()
Otsu处理
Otsu 方法能够根据当前图像给出最佳的类间分割阈值。
即:遍历所有可能的阈值,找出最佳的阈值。
在函数 cv2.threshold()中对参数 type 的类型多传递一个参数cv2.THRESH_OTSU
,可实现Otsu的阈值分割;使用 Otsu 方法时,要把阈值设为 0。此时的函数 cv2.threshold()会自动寻找最优阈值,并将该阈值返回。
t,otsu=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
测试 Otsu 阈值处理的实现。
import cv2
import numpy as np
img = np.zeros((5,5),dtype=np.uint8)
img[0:6,0:6]=123
img[2:6,2:6]=126
print("img=\n",img)
t1,thd=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
print("thd=\n",thd)
t2,otsu=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
print("otsu=\n",otsu)
别对一幅图像进行普通的二值化阈值处理和 Otsu 阈值处理,观察处理结果的差异。
import cv2
img = cv2.imread("tiffany.bmp",0)
t1,thd=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
t2,otsu=cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
cv2.imshow("thd",thd)
cv2.imshow("otsu",otsu)
cv2.waitKey()
cv2.destroyAllWindows()