如何使用Python OpenCV在图像上执行Otsu二值化?
Otsu 二值化是一种二值化技术。还有其他类型的二值化技术,如 简单二值化 和 自适应二值化 。
简单二值化技术使用全局阈值值,而自适应二值化技术使用不同的阈值值用于不同的区域。
Otsu 阈值技术使用全局阈值值,但并非选择。它是自动确定的。它可以准确地处理双峰图像。双峰图像是其直方图具有两个峰值的图像。阈值值是这两个峰值的中间值的近似值。如果图像不是双峰的,则该二值化不准确。
要应用 Otsu 阈值处理,我们应用简单的二值化 cv2.threshold() 加上额外的标志 cv2.THRESH_OTSU 。请参见下面给出的语法。
语法
cv2.threshold(img, thresh_val, max_valu, thresh_techniques)
参数
- img − 输入灰度图像。它是 numpy.ndarray 。
-
thresh_val − 阈值值。如果像素值高于阈值值,则赋予一个值,否则赋予另一个值。
-
max_valu − 要分配给像素的最大值
-
thresh_techniques − 使用的阈值技术。我们可以应用任何简单的二值化+ Otsu 阈值,即, cv2.THRESH_BINARY + cv2.THRESH_OTSU
它返回全局适应的阈值值和阈值。
让我们通过一些Python示例来了解Otsu阈值处理
输入图像
我们将使用此图像作为以下示例中的输入文件。
示例1
在此程序中,我们在输入图像上应用 Otsu 二值化处理。
# 导入所需的库
import cv2
# 读入灰度图像作为输入图像
img = cv2.imread('architecture2.jpg',0)
# 应用Otsu二值化处理
_,th = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# 显示输出图像
cv2.("Otsu的阈值处理", th)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果
当您运行上面的程序时,它将产生以下输出-
上述输出显示在自动应用Otsu的阈值处理之后的图像。
示例2
在此程序中,我们在输入图像上应用 Otsu 阈值处理。我们还应用 全局阈值处理 和 高斯滤波器 + Otsu的阈值处理 。
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('architecture2.jpg',0)
#在图像上应用全局(简单)阈值处理
ret1,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
#应用Otsu的阈值处理
ret2,th2 = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
#在高斯滤波后应用Otsu的阈值处理
blur = cv2.GaussianBlur(img,(5,5),0)
ret3,th3 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
titles = ['原始图像','全局阈值处理(v=127)',"Otsu的阈值处理",'高斯滤波+Otsu的阈值处理']
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.axis("off")
plt.show()
输出
运行上述程序时,将生成以下输出 —
上述输出显示了应用 全局阈值处理 、 Otsu的阈值处理 和 高斯滤波+Otsu的阈值处理 之后的不同图像。