Otsu’s 二值化是一种自适应的图像阈值选择方法,它通过最小化类内方差和最大化类间方差来确定一个最佳的阈值。该方法由日本学者大津展之(Otsu)于1979年提出,广泛用于图像分割。
该算法的核心在于前景与背景图像的类间方差最大
在 OpenCV 中,可以使用 cv2.threshold
函数结合 cv2.THRESH_OTSU
标志来应用 Otsu’s 二值化。基本语法如下:
retval, threshold = cv2.threshold(src, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
其中,src
是输入的灰度图像,threshold
是阈值化后的图像。
以下是一个简单的示例,演示如何使用 Otsu’s 二值化:
import cv2
import matplotlib.pyplot as plt
# 读取图像并转换为灰度
img = cv2.imread(r"C:\Users\mzd\Desktop\opencv\images.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 使用 Otsu's 二值化
_, binary_otsu = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# 显示原图和 Otsu's 二值化结果
plt.figure(figsize=(10, 5))
plt.subplot(121), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.title('Original Image'), plt.axis('off')
plt.subplot(122), plt.imshow(binary_otsu, cmap='gray')
plt.title('Otsu\'s Binarization'), plt.axis('off')
plt.show()
在这个示例中,我们首先读取了一幅图像,将其转换为灰度图像。然后,使用 cv2.threshold
函数应用 Otsu’s 二值化,其中的 cv2.THRESH_OTSU
表示使用 Otsu’s 方法自动选择阈值。最后,通过 Matplotlib 显示原图和 Otsu’s 二值化的结果。 Otsu’s 二值化通常在处理具有双峰直方图的图像时效果较好。