如何使用Python OpenCV在图像上执行Otsu二值化?

如何使用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阈值处理

输入图像

我们将使用此图像作为以下示例中的输入文件。

如何使用Python OpenCV在图像上执行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()

输出结果

当您运行上面的程序时,它将产生以下输出-

如何使用Python OpenCV在图像上执行Otsu二值化?

上述输出显示在自动应用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()

输出

运行上述程序时,将生成以下输出 —

如何使用Python OpenCV在图像上执行Otsu二值化?

上述输出显示了应用 全局阈值处理Otsu的阈值处理高斯滤波+Otsu的阈值处理 之后的不同图像。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

Python OpenCV