图像二值化方法及 Python OpenCV 实现

发布于:2025-07-07 ⋅ 阅读:(20) ⋅ 点赞:(0)

目录

一、引言

二、环境准备

三、代码实现及方法介绍

1. 阈值法

2. 反阈值法

3. 截断阈值法

4. 低阈值零处理

5. 超低阈值零处理

6. OTSU 阈值法

7. 自适应阈值法 - 均值阈值法

8. 自适应阈值法二值化 - 高斯核阈值法二值化

主函数调用

四、总结

一、引言

图像二值化是图像处理中一种基本且重要的操作,它将图像中的像素值转换为只有两种状态(通常是 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 库实现了这些方法。不同的二值化方法适用于不同的场景,你可以根据具体需求选择合适的方法。在实际应用中,对于光照均匀的图像,简单的阈值法可能就足够了;而对于光照不均匀的图像,自适应阈值法可能会取得更好的效果。

希望本文对你理解图像二值化有所帮助!