图像二值化方法及 Python OpenCV 实现
目录
一、引言
二、环境准备
三、代码实现及方法介绍
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 库实现了这些方法。不同的二值化方法适用于不同的场景,你可以根据具体需求选择合适的方法。在实际应用中,对于光照均匀的图像,简单的阈值法可能就足够了;而对于光照不均匀的图像,自适应阈值法可能会取得更好的效果。
希望本文对你理解图像二值化有所帮助!