如何使用 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 阈值分割后的不同图像。
广告