1. 什么是二值化处理
在计算机视觉中,我们经常需要将图像变为黑白二值图像,这个过程就被称为二值化处理。具体来说,二值化处理就是将像素点的像素值(通常为灰度值)设定一个阈值,将小于阈值的像素点设为黑色,将大于阈值的像素点设为白色,从而得到一个二值图像。
为了更好地理解,我们可以看一下下面这张图:
左边是原图,右边是经过二值化处理后的图,我们可以看到,二值化处理后的图像只有黑白两色,而原图是一张彩色图
2. 二值化处理的方法
那么,要想进行二值化处理,我们需要使用哪些方法呢?常见的方法有两种:
2.1 全局阈值分割
全局阈值分割是最简单也是最常用的二值化处理方法之一。具体来说,就是将整个图像的像素点的像素值的平均值作为阈值,将小于该值的像素点设为黑色,大于该值的像素点设为白色。
下面是使用全局阈值分割进行二值化处理的代码:
import cv2
# 读入原图
img = cv2.imread('test.jpg', 0)
# 获取全局阈值
ret, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
# 显示原图和二值化图
cv2.imshow('Original Image', img)
cv2.imshow('Global Thresholding (v = 127)', thresh1)
# 等待用户输入并退出
cv2.waitKey(0)
cv2.destroyAllWindows()
其中cv2.threshold()函数用于获取全局阈值,其中参数127就是阈值。这段代码执行完后,我们可以得到下面这张二值化后的图:
2.2 自适应阈值分割
自适应阈值分割相比于全局阈值分割,可以更好地处理光照不均匀的情况。具体来说,自适应阈值分割是将每个像素点的周围一定大小的邻域作为一个整体,根据其像素值的平均值来设置阈值。
下面是使用自适应阈值分割进行二值化处理的代码:
import cv2
# 读入原图
img = cv2.imread('test.jpg', 0)
# 自适应阈值分割
thresh2 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)
# 显示原图和二值化图
cv2.imshow('Original Image', img)
cv2.imshow('Adaptive Mean Thresholding', thresh2)
# 等待用户输入并退出
cv2.waitKey(0)
cv2.destroyAllWindows()
其中cv2.adaptiveThreshold()函数用于自适应阈值分割,其中参数cv2.ADAPTIVE_THRESH_MEAN_C表示使用均值作为阈值,参数11表示窗口大小,参数2表示从平均值中减去的常数(即阈值)。
这段代码执行完后,我们可以得到下面这张二值化后的图:
3. 总结
通过本文的介绍,我们可以看到,二值化处理是一种常用的图像处理方法,能够将图像变为黑白二值图像。常用的二值化处理方法有全局阈值分割和自适应阈值分割。具体方法的选择应该根据实际场景来进行选择。