阈值法的基本思想是基于图像的灰度特征来计算一个或多个灰度阈值,并将图像中每个像素的灰度值与阈值作比较,最后将像素根据比较结果分到合适的类别中。因此,该方法最为关键的一步就是按照某个准则函数来求解最佳灰度阈值。
阈值法特别适用于目标和背景占据不同灰度级范围的图。
图像若只有目标和背景两大类,那么只需要选取一个阈值进行分割,此方法成为单阈值分割;但是如果图像中有多个目标需要提取,单一阈值的分割就会出现错误,在这种情况下就需要选取多个阈值将每个目标分隔开,这种分割方法相应的成为多阈值分割。
阀值分割方法的优缺点:
- 计算简单,效率较高;
- 只考虑像素点灰度值本身的特征,一般不考虑空间特征,因此对噪声比较敏感,鲁棒性不高。
- 对于背景比物体亮度更高的情况,很难处理,是一个很大的弊端
好了,废话不多说,直接上代码
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img1 = cv.imread('E:/BaoSteel/2013.11.1/1-1-0-3(50).jpg')
img = cv.cvtColor(img1, cv.COLOR_BGR2GRAY)
# ret, thresh = cv.threshold(gray,0,255,cv.THRESH_BINARY_INV+cv.THRESH_OTSU)
# img = cv.medianBlur(img, 5)
ret, th1 = cv.threshold(img, 67, 255, cv.THRESH_BINARY)
print(ret)
th2 = cv.adaptiveThreshold(img, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 11, 2)
th3 = cv.adaptiveThreshold(img, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 11, 2)
# Otsu's thresholding after Gaussian filtering
blur = cv.GaussianBlur(img, (5, 5), 0)
ret4, th4 = cv.threshold(blur, 0, 255, cv.THRESH_BINARY + cv.THRESH_OTSU)
# Otsu's thresholding
ret2, th5 = cv.threshold(img, 0, 255, cv.THRESH_BINARY + cv.THRESH_OTSU)
# Otsu's thresholding after Gaussian filtering
blur = cv.GaussianBlur(img, (5, 5), 0)
ret3, th6 = cv.threshold(blur, 0, 255, cv.THRESH_BINARY + cv.THRESH_OTSU)
titles = ['Original Image', 'Original Image1', 'Global Thresholding (v = 67)',
'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding', 'Adaptive Blur Gaussian Thresholding',
"Otsu's Thresholding1", "Otsu's Thresholding"]
images = [img1, img, th1, th2, th3, th4, th5, th6]
for i in range(8):
plt.subplot(2, 4, i + 1), plt.imshow(images[i], 'gray')
plt.title(titles[i])
plt.xticks([]), plt.yticks([])
plt.show()
结果如下:
好吧,效果有点差。。。