当前位置: 首页 > news >正文

图像二值化方法及 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 库实现了这些方法。不同的二值化方法适用于不同的场景,你可以根据具体需求选择合适的方法。在实际应用中,对于光照均匀的图像,简单的阈值法可能就足够了;而对于光照不均匀的图像,自适应阈值法可能会取得更好的效果。

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

http://www.dtcms.com/a/264764.html

相关文章:

  • 深度剖析NumPy核心函数reshape()
  • 香港券商交易系统开发与解决方案全景报告:云原生、跨境协同与高性能架构的创新实践
  • qt-- 学习笔记11(mingw编译,windeployqt生成执行文件exe,同一exe文件不同文件夹结果不同)
  • 分布式定时任务:Elastic-Job-Lite
  • P3842 [TJOI2007] 线段(动态规划)
  • RAC (ReactiveCocoa) 的实现机制与消息传递策略
  • XILINX Kintex 7系列FPGA的架构
  • ubentu服务器版本安装Dify
  • 【leetcode算法300】:哈希板块
  • 多项式带余除法——线性代数题目为例
  • 【.NET Framework 窗体应用程序项目结构介绍】
  • WHAT - React Native 中 Light and Dark mode 深色模式(黑暗模式)机制
  • 如何在Excel中每隔几行取一行
  • 【PMP】项目管理入门:从基础到环境的体系化拆解
  • 分布式定时任务:xxl-job
  • 苍穹外卖day12--Apache POI导出Excel报表
  • [MIA 2025]CLIP in medical imaging: A survey
  • 多云密钥统一管理实战:CKMS对接阿里云/华为云密钥服务
  • .npmrc和.yarnrc配置文件介绍:分别用于 Node.js 中的 npm(Node Package Manager)和 Yarn 包管理工具
  • oracle集合三嵌套表(Nested Table)学习
  • 【第三章:神经网络原理详解与Pytorch入门】01.神经网络算法理论详解与实践-(1)神经网络预备知识(线性代数、微积分、概率等)
  • 微控制器中的EXTI0(External Interrupt 0)中断是什么?
  • uniapp socket 封装 (可拿去直接用)
  • 可编辑33页PPT | 某材料制造企业工业互联网平台解决方案
  • 云原生环境下部署大语言模型服务:以 DeepSeek 为例的实战教程
  • 6种iOS开发中常用的设计模式
  • Qt designer坑-布局内子控件的顺序错乱
  • 量化交易学习之自动化交易策略 [freqtrade 框架学习] ,常见问题避坑指南!!!!
  • <u>#12288;#8203;</u> HTML5全角空格,自动换行,半角用#32;#8203;
  • Spring AI Advisor RAG使用指南