将像素点的灰度值变为0或255
(一)简单阈值
cv2.threshold()选取一个全局阈值。
ret,dst = threshold(src,thresh,maxval,type)
参数:原图像、阈值,修改后新的阈值、方法选择。
常用的有:
• cv2.THRESH_BINARY——像素值超过阈值的取maxval,通道像素值低于阈值的取0
• cv2.THRESH_BINARY_INV——像素值超过阈值的取0,通道像素值低于阈值的取maxval
• cv2.THRESH_TRUNC ——像素值超过阈值的取maxval,通道像素值低于阈值的取自身
• cv2.THRESH_TOZERO ——超过阈值不变,低于阈值取0
• cv2.THRESH_TOZERO_INV——超过阈值0,低于阈值取不变
【OpenCV】基于cv2的图像阈值化处理【超详细的注释和解释】掌握基本操作_cv2matchtemplate 设阈值-CSDN博客
import cv2
from matplotlib import pyplot as plt
img = cv2.imread("Cat.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, th1 = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
ret, th2 = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)
ret, th3 = cv2.threshold(gray, 127, 255, cv2.THRESH_TRUNC)
ret, th4 = cv2.threshold(gray, 127, 255, cv2.THRESH_TOZERO)
ret, th5 = cv2.threshold(gray, 127, 255, cv2.THRESH_TOZERO_INV)
titles = [
"img",
"BINARY",
"BINARY_INV",
"THRESH_TRUNC",
"THRESH_TOZERO",
"THRESH_TOZERO_INV",
]
images = [img, th1, th2, th3, th4, th5]
for i in range(6):
# print(i)
plt.subplot(2, 3, i + 1), plt.imshow(images[i], "gray")
plt.title(titles[i])
plt.xticks([]), plt.yticks([])
plt.show()
注:为什么变色了???????? cv2.imshow正常
(二)自适应阈值
cv2.AdaptiveThreshold()选取一个局部性阈值。
参数:原图像、满足条件像素点需要设置的灰度值、自适应方法、二值化方法、分割计算的区域大小(取奇数)、阈值等于均值或加权值减去常数C的最终阈值。
自适应方法:
• cv2.ADAPTIVE_THRESH_MEAN_C——邻域内均值
• cv2.ADAPTIVE_THRESH_GAUSSIAN_C——高斯加权和,将区域中像素点周围的像素根据高斯函数加权计算他们离中心点的距离。
二值化方法:THRESH_BINARY或者THRESH_BINARY_INV
dst = cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
img = cv2.imread("Cat.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, th1 = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
th2 = cv2.adaptiveThreshold(
gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2
)
th3 = cv2.adaptiveThreshold(
gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2
)
images = [gray, th1, th2, th3]
titles = ["gray", "threshold-b", "adaptive-mean", "adaptive-gau"]
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()
(三)Otsu’s
Otsu’s(大津法JAN)自主找到一个认为最好的阈值。Otsu’s非常适合于图像灰度直方图具有双峰的情况,他会在双峰之间找到一个值作为阈值,对于非双峰图像(灰度直方图),可能并不是很好用。
img = cv2.imread("Cat.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 简单二值化
ret1, th1 = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
# OTSU
ret2, th2 = cv2.threshold(gray, 128, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY)
print("ret2", ret2)
plt.figure()
plt.subplot(221), plt.imshow(gray, "gray"), plt.title("gray")
plt.subplot(222), plt.hist(gray.ravel(), 256), plt.title("ravel") # 一维
plt.subplot(223), plt.imshow(th1, "gray"), plt.title("BINARY")
plt.subplot(224), plt.imshow(th2, "gray"), plt.title("OTSU")
plt.show()