1.简单阈值
主要使用cv.threshold()函数来实现。
2.自适应阈值
主要使用cv.adaptiveThreshold()函数来实现。
cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C, dst=None)
参数如下:
- src:单通道原图像
- maxValue:填充色,取值范围为(0~255),输出图像中灰度值最大值
- adaptiveMethod:自适应阈值算法
参数 | 计算方法 |
---|---|
ADAPTIVE_THRESH_MEAN_C | 为局部邻域块的平均值,该算法是先求出块中的均值 |
ADAPTIVE_THRESH_GAUSSIAN_C | 为局部邻域块的高斯加权和。该算法是在区域中(x, y)周围的像素根据高斯函数按照他们离中心点的距离进行加权计算 |
- thresholdType:opencv提供的二值化方法
参数 | 计算方法 |
---|---|
THRESH_BINARY | 阈值的二值化操作,超过阈值部分取maxval(最大值),小于阈值部分取0 |
THRESH_BINARY_INV | cv2.THRESH_BINARY的反转,大于阈值部分取0,小于阈值部分取maxval(最大值) |
THRESH_TRUNC | 进行截断操作,大于阈值部分设为阈值,小于阈值部分不变 |
THRESH_TOZERO | 进行化零操作,大于阈值部分不变,小于阈值部分取0 |
THRESH_TOZERO_INV | THRESH_TOZERO的反转,大于阈值部分取0,小于阈值部分不变 |
- blockSize:要分成的区域大小,上面的N值,一般取奇数
- C:常数,每个区域计算出的阈值的基础上在减去这个常数作为这个区域的最终阈值,可以为负数
- dst:输出图像
两者对比代码示例:
import cv2 as cv
img = cv.imread('C:\\Users\\dell\\Desktop\\prac files\\prac1.jpg')
img2gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
ret, dst1 = cv.threshold(img2gray, 130, 255, cv.THRESH_BINARY)
dst2 = cv.adaptiveThreshold(img2gray, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 5, 5)
cv.imshow("prac", img2gray)
cv.imshow("prac1", dst1)
cv.imshow("prac2", dst2)
cv.waitKey(0)
cv.destroyAllWindows()
3.Otsu的二值化
在全局阈值化中,我们使用任意选择的值作为阈值。相反,Otsu的方法避免了必须选择一个值并自动确定它的情况。
对比代码示例:
import cv2 as cv
img = cv.imread('C:\\Users\\dell\\Desktop\\prac files\\prac1.jpg')
img = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 全局阈值
ret1, th1 = cv.threshold(img, 127, 255, cv.THRESH_BINARY)
# Otsu阈值
ret2, th2 = cv.threshold(img, 0, 255, cv.THRESH_BINARY+cv.THRESH_OTSU)
# 高斯滤波后再采用Otsu阈值
blur = cv.GaussianBlur(img, (5, 5), 0)
ret3, th3 = cv.threshold(blur, 0, 255, cv.THRESH_BINARY+cv.THRESH_OTSU)
cv.imshow("th1", th1)
cv.imshow("Otsu", th2)
cv.imshow("Gauss", th3)
cv.waitKey(0)
cv.destroyAllWindows()