- 阈值化函数
- 我的理解为,在计算机图像视觉中,我们常见的RGB图像表现的信息过多,可能会存在于一些掺杂的噪声(因为针对视觉目标不是我们需要的),因此使用阈值算法,直接效果就是可以降噪,特征更加的明显化。
- 一般使用灰度图,需要使用单通道的图片才可以进行阈值化,针对RGB或者HSV格式的图片,我们需要进行灰度化操作才可以进行阈值算法的使用。
import cv2 as cv
img = cv.imread("./images/1.jpg")
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
ret,binary = cv.threshold(gray,0,255,cv.THRESH_BINARY | cv.THRESH_OTSU)
cv.imshow("gray",gray)
cv.imshow("binary",binary)
cv.waitKey(0)
- 阈值化的方式有很多,有针对像素对半分的,也有针对大于阈值进行操作或者小于阈值进行操作的。
- 自适应阈值化
- 自适应均值化
- 自适应高斯均值化
在计算机视觉中,阈值处理是图像分割的重要技术。OpenCV 提供了多种阈值处理方法,其中包括全局阈值(cv.threshold
)和自适应阈值(cv.adaptiveThreshold
)。以下是对这两种方法的详细介绍,包括它们的区别、数学原理、输入参数等。
1. 全局阈值(cv.threshold
)
定义:全局阈值是将整个图像应用一个固定的阈值进行二值化处理。所有像素值大于该阈值的像素被设置为最大值(通常是255),而小于该阈值的像素被设置为0。
数学原理:
给定一个图像 ,全局阈值处理可以表示为:
其中:
- 是阈值类型(如
cv.THRESH_BINARY
或cv.THRESH_BINARY_INV
)。
输入参数:
-
src
:输入图像(单通道)。 -
thresh
:阈值。 -
maxval
:最大值。 -
type
:阈值类型。
2. 自适应阈值(cv.adaptiveThreshold
)
定义:自适应阈值是根据图像的局部特征动态计算阈值。它在图像的每个小区域内计算阈值,从而更好地处理光照不均匀的情况。
数学原理:
自适应阈值处理可以表示为:
其中:
- 是位置
- 是在邻域
自适应阈值的公式可以表示为:
输入参数:
-
src
:输入图像(单通道)。 -
maxValue
:最大值(通常为255)。 -
adaptiveMethod
:自适应方法(如cv.ADAPTIVE_THRESH_MEAN_C
或cv.ADAPTIVE_THRESH_GAUSSIAN_C
)。 -
thresholdType
:阈值类型(如cv.THRESH_BINARY
或cv.THRESH_BINARY_INV
)。 -
blockSize
:邻域大小(必须是奇数)。 -
C
:从计算的阈值中减去的常数。
3. 区别
- 阈值计算:
- 全局阈值:使用一个固定的阈值处理整个图像。
- 自适应阈值:根据局部区域的特征动态计算阈值。
- 适用场景:
- 全局阈值:适用于光照均匀的图像。
- 自适应阈值:适用于光照不均匀或具有复杂背景的图像。
- 处理效果:
- 全局阈值:可能会导致某些区域的细节丢失。
- 自适应阈值:能够保留更多的细节,适应不同的光照条件。
总结
-
cv.threshold
是全局阈值处理,适用于光照均匀的图像。 -
cv.adaptiveThreshold
是自适应阈值处理,适用于光照不均匀的图像。 - 两者的选择取决于具体的应用场景和图像特征。
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
img = cv.imread("./images/2.jpg",cv.IMREAD_GRAYSCALE)
img = cv.GaussianBlur(img,(5,5),sigmaX=0)
ret,th1 = cv.threshold(img,127,255,cv.THRESH_BINARY)
# blockSize为邻域块的大小、C为偏移值
th2 = cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,blockSize=9,C=2)
th3 = cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,blockSize=9,C=2)
titles = ["Original Image",
"Global Thresholding(V=127)",
"Adaptive Mean Thresholding",
"Adaptive Gaussian Thresholding"]
images = [img,th1,th2,th3]
for i in range(4):
plt.subplot(2,2,i+1)
plt.imshow(images[i],"gray")
plt.title(titles[i])
plt.xticks([])
plt.yticks([])
plt.show()