OpenCV第四章——阈值

1. 阈值处理函数

threshold()方法用于对对象进行阈值处理,该方法的语法如下:

retval, dst  = cv2.threshold(src, thresh, maxval, type)

参数说明:

src: 被处理的图像

thresh: 阈值, 在范围(125-150)效果最好

maxval: 阈值处理采用的最大值

type: 阈值处理类型

返回值说明:

retval: 处理时采用的阈值

dst: 阈值处理后的图像

                                                   阈值处理类型及其含义

  1. cv2.THRESH_BINARY:将像素值大于阈值的部分设为最大值(通常是255),其余部分设为0。这种方法常用于图像二值化。

  2. cv2.THRESH_BINARY_INV:将像素值小于阈值的部分设为最大值(通常是255),其余部分设为0。这是THRESH_BINARY的反向操作。

  3. cv2.THRESH_TRUNC:将像素值大于阈值的部分设为阈值,其余部分保持不变。用于将像素值限制在阈值以下。

  4. cv2.THRESH_TOZERO:将像素值小于阈值的部分设为0,其余部分保持不变。这有助于去除低于阈值的噪声。

  5. cv2.THRESH_TOZERO_INV:将像素值大于阈值的部分设为0,其余部分保持不变。这是THRESH_TOZERO的反向操作。

  6. cv2.THRESH_OTSU:使用大津法自动确定最佳阈值,用于图像二值化。通常与THRESH_BINARYTHRESH_BINARY_INV一起使用。

  7. 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()  

二值化处理后, 汽车边缘变得更加鲜明, 更容易被识别。 

猜你喜欢

转载自blog.csdn.net/2301_80166849/article/details/141570517