1. 阈值处理函数
threshold()方法用于对对象进行阈值处理,该方法的语法如下:
retval, dst = cv2.threshold(src, thresh, maxval, type)
参数说明:
src: 被处理的图像
thresh: 阈值, 在范围(125-150)效果最好
maxval: 阈值处理采用的最大值
type: 阈值处理类型
返回值说明:
retval: 处理时采用的阈值
dst: 阈值处理后的图像
阈值处理类型及其含义
cv2.THRESH_BINARY
:将像素值大于阈值的部分设为最大值(通常是255),其余部分设为0。这种方法常用于图像二值化。
cv2.THRESH_BINARY_INV
:将像素值小于阈值的部分设为最大值(通常是255),其余部分设为0。这是THRESH_BINARY
的反向操作。
cv2.THRESH_TRUNC
:将像素值大于阈值的部分设为阈值,其余部分保持不变。用于将像素值限制在阈值以下。
cv2.THRESH_TOZERO
:将像素值小于阈值的部分设为0,其余部分保持不变。这有助于去除低于阈值的噪声。
cv2.THRESH_TOZERO_INV
:将像素值大于阈值的部分设为0,其余部分保持不变。这是THRESH_TOZERO
的反向操作。
cv2.THRESH_OTSU
:使用大津法自动确定最佳阈值,用于图像二值化。通常与THRESH_BINARY
或THRESH_BINARY_INV
一起使用。
cv2.THRESH_TRIANGLE
:使用三角形法自动确定最佳阈值,这是一种自动阈值计算方法,适用于图像直方图具有明显双峰的情况。
2. 二值化处理
二值化处理(二值化阈值处理)让图像仅保留两种像素值,处理时, 每一个像素值都会与阈值进行比较,将大于阈值的像素值变为最大值, 将小于阈值的像素值变为0,计算公式如下:
if 像素值 <= 阈值:像素值 = 0
if 像素值 > 阈值 : 像素值 = 最大值
通常使用像素值255(纯白色)为最大值, 0(纯黑色)为最小值
2.1 处理黑白渐变图
下面的示例代码:
import cv2
img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(3).jpg", 0) # 读成灰度图像
t1, dst1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) # 二值化阈值处理
cv2.imshow("img", img)
cv2.imshow("dst1", dst1)
cv2.waitKey()
cv2.destrotAllWindows()
处理后的结果:
可以看到处理过后呈现出了非黑即白的效果。
2.2 不同阈值的处理效果
示例代码如下:
import cv2
img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(3).jpg", 0) # 读成灰度图像
t1, dst1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) # 二值化阈值处理
t2, dst2 = cv2.threshold(img, 180, 255, cv2.THRESH_BINARY) # 二值化阈值处理
cv2.imshow("img", img)
cv2.imshow("dst1", dst1)
cv2.imshow("dst2", dst2)
cv2.waitKey()
cv2.destrotAllWindows()
原图中像素值大于127的较多,大于180的较少,因而阈值设为127时,纯白色像素较多,阈值设为180时纯黑色像素较多。
2.3 不同最大值的处理效果
示例代码如下:
import cv2
img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(3).jpg", 0) # 读成灰度图像
t1, dst1 = cv2.threshold(img, 120, 255, cv2.THRESH_BINARY) # 二值化阈值处理
t2, dst2 = cv2.threshold(img, 120, 150, cv2.THRESH_BINARY) # 二值化阈值处理
cv2.imshow("img", img)
cv2.imshow("dst1", dst1)
cv2.imshow("dst2", dst2)
cv2.waitKey()
cv2.destrotAllWindows()
最大阈值设为150时, 大于i120的像素值都被改为150, 呈现灰色。
对于彩色图像也可以进行二值化阈值处理:
import cv2
img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(3).jpg", 1) # 读成彩色图像
t1, dst1 = cv2.threshold(img, 120, 255, cv2.THRESH_BINARY) # 二值化阈值处理
t2, dst2 = cv2.threshold(img, 120, 150, cv2.THRESH_BINARY) # 二值化阈值处理
cv2.imshow("img", img)
cv2.imshow("dst1", dst1)
cv2.imshow("dst2", dst2)
cv2.waitKey()
cv2.destrotAllWindows()
2.4 反二值化处理
反二值化阈值处理,处理结果与二值化处理结果相反, 将大于阈值的像素值变为0, 将小于或等于阈值的像素值变为最大值,原图中黑白部分交换,公式如下 :
if 像素值 <= 阈值:像素值 = 最大值
if 像素值 > 阈值:像素值 = 0
示例代码如下:
import cv2
img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(3).jpg", 0) # 读成灰度图像
t1, dst1 = cv2.threshold(img, 120, 255, cv2.THRESH_BINARY) # 二值化阈值处理
t2, dst2 = cv2.threshold(img, 120, 150, cv2.THRESH_BINARY_INV) # 反二值化阈值处理
cv2.imshow("img", img)
cv2.imshow("dst1", dst1)
cv2.imshow("dst2", dst2)
cv2.waitKey()
cv2.destrotAllWindows()
3. 零处理
将某个范围内的像素值变为0, 而范围之外的像素保留原值,包括低于阈值零处理和超出阈值零处理
3.1 低于阈值零处理
if 像素值 <= 阈值:像素值 = 0
if 像素值 <= 阈值:像素值 = 原值
示例代码如下:
import cv2
img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(3).jpg", 0) # 读成灰度图像
t, dst = cv2.threshold(img, 120, 255, cv2.THRESH_TOZERO) # 低于阈值零处理
cv2.imshow("img", img)
cv2.imshow("dst", dst)
cv2.waitKey()
cv2.destrotAllWindows()
3.2 超出阈值零处理
if 像素值 <= 阈值:像素值 = 原值
if 像素值 > 阈值: 像素值 = 0
示例代码如下:
import cv2
img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(3).jpg", 0) # 读成灰度图像
t, dst = cv2.threshold(img, 120, 255, cv2.THRESH_TOZERO_INV) # 超出阈值零处理
cv2.imshow("img", img)
cv2.imshow("dst", dst)
cv2.waitKey()
cv2.destrotAllWindows()
浅色区域彻底变黑,深色区域不受影响。
import cv2
img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(3).jpg", 0) # 读成灰度图像
t, dst = cv2.threshold(img, 120, 255, cv2.THRESH_TRUNC) # 截断处理
cv2.imshow("img", img)
cv2.imshow("dst", dst)
cv2.waitKey()
cv2.destrotAllWindows()
4. 截断处理
截断阈值处理, 将图像中大于阈值的像素值变为和阈值一样的值,小于或等于阈值的像素保持原值。公式如下:
if 像素 <= 阈值:像素值 = 原值
if 像素 > 阈值:像素 = 阈值
整体颜色变暗, 浅色区域变得更浅
5 .自适应处理
OpenCV提供了adaptivateThreshold(src, macvalue, adaptivateMethod, thresholdType, blockSize, C)
参数说明:
src: 被处理的灰度图像
maxvalue: 阈值处理采用的最大值
adaptivateMethod: 自适应阈值的计算方法
thresholdType: 阈值处理类型(cv2.THRESH_BINARY或者cv2.THRESH_BINARY_INV)
blocksize: 一个正方形区域的大小
C:常量
返回值说明:
dst: 阈值处理后的图像
自适应阈值的计算方法及其解释
cv2.ADAPTIVE_THRESH_MEAN_C
:
- 对于每个像素,计算其邻域区域(通常是一个窗口)的平均值,并用这个平均值作为该像素的阈值。
cv2.ADAPTIVE_THRESH_GAUSSIAN_C:
- 对于每个像素,计算其邻域区域的加权平均值(权重根据高斯分布来决定),并用这个加权平均值作为该像素的阈值。
5.1 无法得到清晰有效的结果
示例代码如下:
import cv2
image = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(3).jpg") # 读取图像
image_Gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 转换为灰度图像
t1, dst1 = cv2.threshold(image_Gray, 127, 255, cv2.THRESH_BINARY) # 二值化阈值处理
t2, dst2 = cv2.threshold(image_Gray, 127, 255, cv2.THRESH_BINARY_INV) # 反二值化阈值处理
t3, dst3 = cv2.threshold(image_Gray, 127, 255, cv2.THRESH_TOZERO) # 低于阈值零处理
t4, dst4 = cv2.threshold(image_Gray, 127, 255, cv2.THRESH_TOZERO_INV) # 超出阈值零处理
t5, dst5 = cv2.threshold(image_Gray, 127, 255, cv2.THRESH_TRUNC) # 截断处理
cv2.imshow("BINARY", dst1)
cv2.imshow("BINARY_INV", dst2)
cv2.imshow("TOZERO", dst3)
cv2.imshow("TOZERO_INV", dst4)
cv2.imshow("TRUNC", dst5)
cv2.waitKey()
cv2.destroyAllWindows()
5.2 显示自适应阈值处理的效果
示例代码如下:
import cv2
image = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(3).jpg") # 读取图像
image_Gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 转换为灰度图像
# cv2.ADAPTIVE_THRESH_MEAN_C方法
athdMEAM = cv2.adaptiveThreshold\
(image_Gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 3)
# cv2.ADAPTIVE_THRESH_GAUSSIAN_C方法
athdGAUS = cv2.adaptiveThreshold\
(image_Gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY, 5, 3)
cv2.imshow("MEAN_C", athdMEAM)
cv2.imshow("GAUSSIAN_C", athdGAUS)
cv2.waitKey()
cv2.destroyAllWindows()
6. Otsu方法
Ostu方法语法结构如下:
retval, dst = cv2.thresholdZ(src ,thresh, maxval, type)
参数说明:
src: 被处理的灰度图像
thresh:阈值(需要设为0)
maxval: 阈值处理采用的最大值
type: 阈值处理类型,例如:cv2.THRESH_BINARY+cv2.THRESH_OTSU
返回值说明:
retval: you Ostu方法计算得到并使用的最合适阈值
dst:处理后的图像
示例代码如下:
import cv2
image = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(3).jpg") # 读取图像
image_Gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 转换为灰度图像
t1, dst1 = cv2.threshold(image_Gray, 127, 255, cv2.THRESH_BINARY) # 二值化阈值处理
# 实现Otsu方法的阈值处理
t2, dst2 = cv2.threshold(image_Gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
cv2.putText(dst2, "best threshold: " + str(t2), (0, 30),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 0), 2) # 在图像上绘制最合适的阈值
cv2.imshow("BINARY", dst1)
cv2.imshow("OTSU", dst2)
cv2.waitKey()
cv2.destroyAllWindows()
7. 阈值处理实例
示例代码如下:
import cv2
img = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(4).jpg") # 原始图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转为灰度图像
t1, dst1 = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # 二值化阈值处理
t2, dst2 = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV) # 反二值化阈值处理
cv2.imshow("img", img)
cv2.imshow("gray", gray)
cv2.imshow("dst1", dst1)
cv2.imshow("dst2", dst2)
cv2.waitKey()
cv2.destroyAllWindows()
二值化处理后, 汽车边缘变得更加鲜明, 更容易被识别。