shreshoding阈值化
阈值化就是图像的二值化,我们通常选择把一幅灰度图转换成二值图,里面的像素值要么是0,要么是255。
一个简单地方法就是选择一个数值p,当像素值小于这个数的时候,就变成0,大于这个数的时候就变成了255。
通常我们使用阈值化,来聚焦一幅图形中的物体或感兴趣的区域。
1 simple thresholding简单阈值化
# 简单二值化
# 155是一个阈值,高于这个值得变成白色(前景),低于这个值得变成黑色(背景)
(T, thersh) = cv2.threshold(blurred, 155, 255, cv2.THRESH_BINARY)
cv2.imshow("Threshold Binary", thresh)
# 反向二值化
(T, thershInv) = cv2.threshold(blurred, 155, 255, cv2.THRESH_BINARY_INV)
cv2.imshow("Threshold Binary Inverse", threshInv)
# 蒙版和原图叠加
cv2.imshow("coins", cv2.bitwise_and(image, image, mask = threshInv))
2 adaptive shresholding自适应阈值
上面的方法必须手动指定一个阈值,那么可以不手动指定阈值吗?
# 使用平均法实现自适应阈值
# 11表示邻域大小,4表示在平均值中减去4
thresh = cv2.adaptiveThreshold(blurred, 255, cv2.ADAPTIVE_THERESHOLD_MEAN_C, cv2.THRESH_BINARY_INV, 11, 4)
cv2.imshow("Mean Thresh", thresh)
# 使用高斯加权法实现自适应阈值
thresh = cv2.adaptiveThreshold(blurred, 255, cv2.ADAPTIVE_THERESHOLD_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 15, 3)
cv2.imshow("Gaussian Thresh", thresh)
3 Otsu and Riddler-Calvard
另外一个自动计算阈值的方法就是使用Ostu方法。
Otsu方法假定在灰度图的直方图中,有两个峰,Otsu方法尝试寻找一个最优的值来分隔这两个峰。
import mahotas
# 使用mahotas里面的otsu方法计算,最终得到T = 137
T = mahotas.thresholding.otsu(blurred)
thresh = image.copy()
thresh[thresh > T] = 255
thresh[thresh < T] = 0
thresh = cv2.bitwise_not(thresh)
cv2.imshow("Otsu", thresh)
# 使用mahotas里面的riddler-carvard方法计算,最终也得到T = 137
T = mahotas.thresholding.rc(blurred)
thresh = image.copy()
thresh[thresh > T] = 255
thresh[thresh < T] = 0
thresh = cv2.bitwise_not(thresh)
cv2.imshow("Riddler-Calvard", thresh)