目录
一、引言
图像二值化是图像处理中一种基本且重要的操作,它将图像中的像素值转换为只有两种状态(通常是 0 和 255),使得图像只包含黑色和白色两种颜色,从而简化图像的分析和处理。在本文中,我们将介绍多种图像二值化方法,并使用 Python 和 OpenCV 库实现这些方法。
二、环境准备
在开始之前,确保你已经安装了 OpenCV 库。可以使用以下命令进行安装:
pip install opencv-python
三、代码实现及方法介绍
1. 阈值法
阈值法是最基本的二值化方法,它将图像中的每个像素值与一个设定的阈值进行比较,大于阈值的像素值设为 255,小于阈值的像素值设为 0。
import cv2
# 阈值法:跟一个值比,大于这个值就是255,小于这个值就是0
def test001():
img = cv2.imread("./opencv_work/src/monkey.jpg", cv2.IMREAD_GRAYSCALE)
ret, binary = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
cv2.imshow("img", img)
cv2.imshow("binary", binary)
cv2.waitKey(0)
cv2.destroyAllWindows()
2. 反阈值法
反阈值法与阈值法相反,大于阈值的像素值设为 0,小于阈值的像素值设为 255。
# 反阈值法:跟一个值比,大于这个值就是0,小于这个值就是255
def test002():
img = cv2.imread("./opencv_work/src/monkey.jpg",cv2.IMREAD_GRAYSCALE)
ret, bi = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)
cv2.imshow("img", img)
cv2.imshow("bi", bi)
cv2.waitKey(0)
cv2.destroyAllWindows()
3. 截断阈值法
截断法将大于阈值的像素值截断为阈值,小于阈值的像素值保持不变。
# 截断法:大于这个值就变成这个值,小于这个值就保持不变
def test003():
img = cv2.imread("./opencv_work/src/monkey.jpg", cv2.IMREAD_GRAYSCALE)
ret, thresh = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)
cv2.imshow("img", img)
cv2.imshow("thresh", thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()
4. 低阈值零处理
低阈值法将大于阈值的像素值保持不变,小于阈值的像素值设为 0。
# 低阈值法:大于这个值就变成这个值,小于这个值就变成0
def test004():
img = cv2.imread("./opencv_work/src/monkey.jpg", cv2.IMREAD_GRAYSCALE)
ret, tozero=cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
cv2.imshow("img",img)
cv2.imshow("tozero",tozero)
cv2.waitKey(0)
cv2.destroyAllWindows()
5. 超低阈值零处理
超低阈值法将大于阈值的像素值设为 0,小于阈值的像素值保持不变。
# 超低阈值法:大于这个值就变成0,小于这个值就保持不变
def test005():
img = cv2.imread("./opencv_work/src/monkey.jpg", cv2.IMREAD_GRAYSCALE)
ret, tozeroinv = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)
cv2.imshow("img", img)
cv2.imshow("tozeroinv", tozeroinv)
cv2.waitKey(0)
cv2.destroyAllWindows()
6. OTSU 阈值法
OTSU 阈值法是一种自动计算阈值的方法,它通过最大化类间方差来确定最佳阈值。
# OTSU阈值法:自动计算阈值
def test006():
img = cv2.imread("./opencv_work/src/monkey.jpg", cv2.IMREAD_GRAYSCALE)
ret, otsu = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
cv2.imshow("img", img)
cv2.imshow("otsu", otsu)
cv2.waitKey(0)
cv2.destroyAllWindows()
7. 自适应阈值法 - 均值阈值法
均值阈值法根据周围像素的平均值来计算阈值,适用于光照不均匀的图像。
# 自适应阈值法-均值阈值法:根据周围像素的平均值来计算阈值
def test007():
img = cv2.imread("./opencv_work/src/monkey.jpg", cv2.IMREAD_GRAYSCALE)
adaptive = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)
cv2.imshow("img", img)
cv2.imshow("adaptive", adaptive)
cv2.waitKey(0)
cv2.destroyAllWindows()
8. 自适应阈值法二值化 - 高斯核阈值法二值化
高斯核阈值法根据周围像素的高斯加权和来计算阈值,相比于均值阈值法,它对噪声更具鲁棒性。
# 自适应阈值法二值化-高斯核阈值法二值化:根据周围像素的高斯加权和来计算阈值
def test008():
img = cv2.imread("./opencv_work/src/monkey.jpg", cv2.IMREAD_GRAYSCALE)
adaptive = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
cv2.imshow("img", img)
cv2.imshow("adaptive", adaptive)
cv2.waitKey(0)
cv2.destroyAllWindows()
主函数调用
if __name__ == '__main__':
# test001()
# test002()
# test003()
# test004()
# test005()
# test006()
# test007()
test008()
四、总结
本文介绍了多种图像二值化方法,并使用 Python 和 OpenCV 库实现了这些方法。不同的二值化方法适用于不同的场景,你可以根据具体需求选择合适的方法。在实际应用中,对于光照均匀的图像,简单的阈值法可能就足够了;而对于光照不均匀的图像,自适应阈值法可能会取得更好的效果。
希望本文对你理解图像二值化有所帮助!