如何使用 Python OpenCV 对图像执行 Otsu 阈值分割?


Otsu 阈值分割是一种阈值分割技术。还有其他类型的阈值分割技术,例如简单阈值分割自适应阈值分割

简单阈值分割技术使用全局阈值,而自适应阈值分割技术对不同区域使用不同的阈值。

Otsu 阈值分割技术使用全局阈值,但该阈值不是人为选择的。它是自动确定的。它对双峰图像非常有效。双峰图像是指直方图有两个峰值的图像。阈值是这两个峰值中间的近似值。如果图像不是双峰的,则此阈值分割方法不准确。

要应用Otsu阈值分割,我们使用额外的标志cv2.THRESH_OTSU应用简单的阈值分割cv2.threshold()。请参阅以下语法。

语法

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 required libraries import cv2 # read the input image as a gray image img = cv2.imread('architecture2.jpg',0) # Apply Otsu's thresholding _,th = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) # display the output image cv2.imshow("Otsu's Thresholding", th) cv2.waitKey(0) cv2.destroyAllWindows()

输出

运行以上程序后,将生成以下输出:

以上输出显示了应用 Otsu 阈值分割后的图像。

示例 2

在此程序中,我们对输入图像应用Otsu阈值分割。我们还应用了全局阈值分割高斯滤波 + Otsu 阈值分割

import cv2 from matplotlib import pyplot as plt img = cv2.imread('architecture2.jpg',0) # Apply global (simple) thresholding on image ret1,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY) # Apply Otsu's thresholding on image ret2,th2 = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) # Apply Otsu's thresholding after Gaussian filtering blur = cv2.GaussianBlur(img,(5,5),0) ret3,th3 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) titles = ['Original Image','Global Thresholding (v=127)',"Otsu's Thresholding",'Gaussian Filter + 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 阈值分割后的不同图像。

更新于: 2022年9月27日

4K+ 阅读量

开启你的 职业生涯

通过完成课程获得认证

立即开始
广告