二值化阈值调整:调整是指在进行图像二值化处理时,调整阈值的过程。阈值决定了将图像中的像素分为黑色和白色的界限,大于阈值的像素被设置为白色,小于等于阈值的像素被设置为黑色。
首先画出灰度直方图:横坐标是灰度值0—255,纵坐标是该灰度值的像素个数。
- import cv2
- from matplotlib import pyplot as plt
-
- img = cv2.imread ('6.jpg', 0) # 读取图像并转换为灰度图像
- hist = cv2.calcHist([img],[0],None,[256],[0,256]) # 计算灰度直方图
- plt.hist(img.ravel( ),256,[0,256]) # 绘制直方图
- plt.show()

方法一:
取阈值为 127,相当于 0~255 的中位数(0+255)/2 = 127,灰度值大于等于 127 的设置为 0,灰度值大于 127 的设置为 255,这种方法简单便捷,缺点就是阈值设置的太死板了,对于不同的照片,效果肯定不同。检索资料的时候发现,还有人把这种方法称为 史上最弱智的二值处理方法,没办法,弱智方法也得学啊。
该方法会使用到一个 threshold 方法,threshold 方法的语法格式如下:
cv2.threshold(src, thresh, maxval, type[, dst]) -> retval, dst
参数说明如下:
返回值 retval 阈值 thresh, dst 经过处理的图像。
二值化操作类型type参数(阈值类型):
以上内容也叫做全局阈值。参考代码:
- import cv2
- import matplotlib.pylab as plt
-
- def main2():
- img = cv2.imread('6.jpg', 0)
- ret, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
- ret, thresh2 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)
- ret, thresh3 = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)
- ret, thresh4 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)
- ret, thresh5 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)
-
- titles = ['Original Image', 'BINARY',
- 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']
- images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]
-
- for i in range(6):
- plt.subplot(2, 3, i+1)
- plt.imshow(images[i], 'gray')
- plt.title(titles[i])
- plt.xticks([])
- plt.yticks([])
-
- plt.show()
-
- main2()

当然,也可以把代码里面的127改成别的,这就叫手动选择阈值。
方法二:
计算像素点矩阵中的所有像素点的灰度值的平均值 avg,让每一个像素点与 avg 比较,小于等于 avg 的像素点就为 0(黑色),大于 avg 的像素点为 255(白色),这种方法看起来靠谱了一些。
使用该方法之前需要先遍历图像的所有灰度值,才能计算出平均值。下图所示的阈值计算结果是151.参考代码如下:
- import cv2
-
- def main():
- img = cv2.imread("1.TIF", 0)
-
- height, width = img.shape
- # 灰度值总和
- px_t = 0
- for i in range(height):
- for j in range(width):
- px_t += img[i][j]
- print(px_t)
- # 求像素平均值
- avg_thresh = int(px_t / (height * width))
- print(avg_thresh)
-
- thresh, dst = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
- cv2.imshow("dst", dst)
- cv2.waitKey()
- cv2.imwrite("2.jpg",dst)
-
- if __name__ == "__main__":
- main()
