返回顶部
首页 > 资讯 > 后端开发 > Python >PythonOpenCV阈值处理详解
  • 617
分享到

PythonOpenCV阈值处理详解

2024-04-02 19:04:59 617人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录前言阈值技术简介简单的阈值技术阈值类型简单阈值技术的实际应用前言 图像分割是许多计算机视觉应用中的关键处理步骤,通常用于将图像划分为不同的区域,这些区域常常对应于真实世界的对象。

前言

图像分割是许多计算机视觉应用中的关键处理步骤,通常用于将图像划分为不同的区域,这些区域常常对应于真实世界的对象。因此,图像分割是图像识别和内容分析的重要步骤。图像阈值是一种简单、有效的图像分割方法,其中像素根据其强度值进行分区。在本文中,将介绍 OpenCV 所提供的主要阈值技术,可以将这些技术用作计算机视觉应用程序中图像分割的关键部分。

阈值技术简介

阈值处理是一种简单、有效的将图像划分为前景和背景的方法。图像分割通常用于根据对象的某些属性(例如,颜色、边缘或直方图)从背景中提取对象。最简单的阈值方法会利用预定义常数(阈值),如果像素强度小于阈值,则用黑色像素替换,如果像素强度大于阈值,则用白色像素替换。OpenCV 提供了 cv2.threshold() 函数来对图像进行阈值处理。

为了测试 cv2.threshold() 函数,首次创建测试图像,其包含一些填充了不同的灰色调的大小相同的区域,利用 build_sample_image() 函数构建此测试图像:

def build_sample_image():
    """创建填充了不同的灰色调的大小相同的区域,作为测试图像"""
    # 定义不同区域
    tones = np.arange(start=50, stop=300, step=50)
    # 初始化
    result = np.zeros((50, 50, 3), dtype="uint8")

    for tone in tones:
        img = np.ones((50, 50, 3), dtype="uint8") * tone
        # 沿轴连接数组
        result = np.concatenate((result, img), axis=1)
    return result

接下来将使用不同的预定义阈值: 0 、 50 、 100 、 150 、 200 和 250 调用 cv2.threshold() 函数,以查看不同预定义阈值对阈值图像影响。例如,使用阈值 thresh = 50 对图像进行阈值处理:

ret1, thresh1 = cv2.threshold(gray_image, 50, 255, cv2.THRESH_BINARY)

其中,thresh1 是仅包含黑白色的阈值图像。源图像 gray_image 中灰色强度小于 50 的像素为黑色,强度大于 50 的像素为白色。

使用多个不同阈值对图像进行阈值处理:

# 可视化函数
def show_img_with_matplotlib(color_img, title, pos):
    img_RGB = color_img[:, :, ::-1]

    ax = plt.subplot(7, 1, pos)
    plt.imshow(img_RGB)
    plt.title(title, fontsize=8)
    plt.axis('off')
# 使用 build_sample_image() 函数构建测试图像
image = build_sample_image()
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
for i in range(6):
    # 使用多个不同阈值对图像进行阈值处理
    ret, thresh = cv2.threshold(gray_image, 50 * i, 255, cv2.THRESH_BINARY)
    # 可视化
    show_img_with_matplotlib(cv2.cvtColor(thresh, cv2.COLOR_GRAY2BGR), "threshold = {}".fORMat(i * 50), i + 2)
# 可视化测试图像
show_img_with_matplotlib(cv2.cvtColor(gray_image, cv2.COLOR_GRAY2BGR), "img with tones of gray - left to right: (0,50,100,150,200,250)", 1)
# 图像进行阈值处理后,常见的输出是黑白图像
# 因此,为了更好的可视化效果,修改背景颜色
fig.patch.set_facecolor('silver')

plt.show()

从上图可以看出,根据阈值和样本图像灰度值的不同,阈值处理后生成的黑白图像的变化情况。

简单的阈值技术

上一节中,我们已经简单介绍过了 OpenCV 中提供的简单阈值处理函数——cv2.threshold(),该函数用法如下:

cv2.threshold(src, thresh, maxval, type, dst=None) -> retval, dst

cv2.threshold() 函数对 src 输入数组(可以为单通道或多通道图像)应用预定义常数 thresh 设置的阈值;type 参数用于设置阈值类型,阈值类型的可选值如下:cv2.THRESH_BINARYcv2.THRESH_BINARY_INVcv2.THRESH_TRUNCcv2.THRESH_TOZEROcv2.THRESH_TOZERO_INVcv2.THRESH_OTSUcv2.THRESH_TRIANGLE

maxval 参数用于设置最大值,其仅在阈值类型为 cv2.THRESH_BINARYcv2.THRESH_BINARY_INV 时有效;需要注意的是,在阈值类型为 cv2.THRESH_OTSUcv2.THRESH_TRIANGLE 时,输入图像 src 应为为单通道。

阈值类型

为了更好的了解阈值操作的不同类型,接下来给出每种阈值类型的具体公式。符号说明:src 是源(原始)图像,dst 对应于阈值化后的目标(结果)图像,因此,src(x, y) 对应于源图像像素 (x, y) 处的强度,而 dst(x, y) 对应于目标图像像素 (x, y) 处的强度。

阈值类型 cv2.THRESH_BINARY 公式如下:

其表示,如果像素 src(x, y) 的强度高于 thresh,则目标图像像素强度 dst(x,y) 将被设为 maxval;否则,设为 0

阈值类型 cv2.THRESH_BINARY_INV 公式如下:

其表示,如果像素 src(x, y) 的强度高于 thresh,则目标图像像素强度 dst(x,y) 将被设为 0;否则,设为 maxval

阈值类型 cv2.THRESH_TRUNC 公式如下:

其表示,如果像素 src(x, y) 的强度高于 thresh,则目标图像像素强度设置为 threshold;否则,设为 src(x, y)

阈值类型 cv2.THRESH_TOZERO 公式如下:

其表示,如果像素 src(x, y) 的强度高于 thresh,则目标图像像素值将设置为 src(x, y);否则,设置为 0

阈值类型 cv2.THRESH_TOZERO_INV 公式如下:

其表示,如果像素 src(x, y) 的强度大于 thresh,则目标图像像素值将设置为 0;否则,设置为 src(x, y)

cv2.THRESH_OTSUcv2.THRESH_TRIANGLE 属于特殊的阈值类型,它们可以与上述阈值类型( cv2.THRESH_BINARYcv2.THRESH_BINARY_INVcv2.THRESH_TRUNCcv2.THRESH_TOZEROcv2.THRESH_TOZERO_INV)进行组合。组合后,阈值处理函数 cv2.threshold() 将只能处理单通道图像,且计算并返回最佳阈值,而非指定阈值。

接下来使用不同阈值类型对同样的测试图像进行阈值处理,观察不同阈值处理效果:

ret1, thresh1 = cv2.threshold(gray_image, 100, 255, cv2.THRESH_BINARY)
ret2, thresh2 = cv2.threshold(gray_image, 100, 220, cv2.THRESH_BINARY)
ret3, thresh3 = cv2.threshold(gray_image, 100, 255, cv2.THRESH_BINARY_INV)
ret4, thresh4 = cv2.threshold(gray_image, 100, 220, cv2.THRESH_BINARY_INV)
ret5, thresh5 = cv2.threshold(gray_image, 100, 255, cv2.THRESH_TRUNC)
ret6, thresh6 = cv2.threshold(gray_image, 100, 255, cv2.THRESH_TOZERO)
ret7, thresh7 = cv2.threshold(gray_image,100,255, cv2.THRESH_TOZERO_INV)
# 可视化
show_img_with_matplotlib(cv2.cvtColor(thresh1, cv2.COLOR_GRAY2BGR), "THRESH_BINARY - thresh = 100 & maxValue = 255", 2)
show_img_with_matplotlib(cv2.cvtColor(thresh2, cv2.COLOR_GRAY2BGR), "THRESH_BINARY - thresh = 100 & maxValue = 220", 3)
show_img_with_matplotlib(cv2.cvtColor(thresh3, cv2.COLOR_GRAY2BGR), "THRESH_BINARY_INV - thresh = 100", 4)
# 其他图像可视化方法类似,不再赘述
# ...

如上图所示,maxval 参数仅在使用 cv2.THRESH_BINARYcv2.THRESH_BINARY_INV 阈值类型时有效,上例中将 cv2.THRESH_BINARYcv2.THRESH_BINARY_INV 类型的 maxval 值设置为 255220,以便查看阈值图像在这两种情况下的变化情况。

简单阈值技术的实际应用

了解 cv2.threshold() 不同参数的工作原理后,我们将 cv2.threshold() 应用于真实图像,并使用不同的阈值:

# 加载图像
image = cv2.imread('example.png')
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 绘制灰度图像
show_img_with_matplotlib(cv2.cvtColor(gray_image, cv2.COLOR_GRAY2BGR), "img", 1)

# 使用不同的阈值调用 cv2.threshold() 并进行可视化
for i in range(8):
    ret, thresh = cv2.threshold(gray_image, 130 + i * 10, 255, cv2.THRESH_BINARY)
    show_img_with_matplotlib(cv2.cvtColor(thresh, cv2.COLOR_GRAY2BGR), "threshold = {}".format(130 + i * 10), i + 2)

以上就是python OpenCV阈值处理详解的详细内容,更多关于OpenCV阈值处理的资料请关注编程网其它相关文章!

--结束END--

本文标题: PythonOpenCV阈值处理详解

本文链接: https://lsjlt.com/news/138426.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • PythonOpenCV阈值处理详解
    目录前言阈值技术简介简单的阈值技术阈值类型简单阈值技术的实际应用前言 图像分割是许多计算机视觉应用中的关键处理步骤,通常用于将图像划分为不同的区域,这些区域常常对应于真实世界的对象。...
    99+
    2024-04-02
  • Python图像运算之图像阈值化处理详解
    目录一.图像阈值化二.固定阈值化处理1.二进制阈值化2.反二进制阈值化3.截断阈值化4.阈值化为05.反阈值化为0三.自适应阈值化处理四.总结一.图像阈值化 图像阈值化(Binari...
    99+
    2024-04-02
  • Python图像阈值化怎么处理
    这篇“Python图像阈值化怎么处理”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python图像阈值化怎么处理”文章吧。一...
    99+
    2023-06-30
  • Python OpenCV阈值处理的示例分析
    小编给大家分享一下Python OpenCV阈值处理的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!前言图像分割是许多计算机视觉应用中的关键处理步骤,通常用于将图像划分为不同的区域,这些区域常常对应于真实...
    99+
    2023-06-29
  • C++OpenCV单峰三角阈值法Thresh_Unimodal详解
    目录需求说明具体流程功能函数C++测试代码测试效果需求说明 在对图像进行处理时,经常会有这类需求:想通过阈值对图像进行二值化分割,以提取自己感兴趣的区域,常见的阈值分割方法有常数分割...
    99+
    2024-04-02
  • PythonOpenCV图像处理之图像滤波特效详解
    目录1 分类2 邻域滤波2.1 线性滤波2.2 非线性滤波3 频域滤波3.1 低通滤波3.2 高通滤波1 分类 图像滤波按图像域可分为两种类型: 邻域滤波(Spatial Domai...
    99+
    2024-04-02
  • Python+OpenCV实现阈值分割的方法详解
    目录一、全局阈值1.效果图2.源码二、滑动改变阈值(滑动条)1.效果图2.源码三、自适应阈值分割1.效果图2.源码3.GaussianBlur()函数去噪四、参数解释一、全局阈值 原...
    99+
    2024-04-02
  • PythonOpenCV图像模糊处理介绍
    目录均值滤波高斯滤波高斯双边滤波其实我们平时在深度学习中所说的卷积操作,在 opencv 中也可以进行,或者说是类似操作。那么它是什么操作呢?它就是图像的模糊(滤波)处理。 均值滤波...
    99+
    2024-04-02
  • Mysql空值处理函数详解
    目录前言NULL Values (空值)定义测试IFNULL定义COALESCE定义对比:总结前言 mysql中,空值通常用于表示缺失或未定义的值。处理空值的关键在于理解空值与其他值之间的关系,以及如何使用不同的SQL函...
    99+
    2023-08-07
    mysql空字符串处理 mysql空值的作用 mysql空值和null
  • python数字图像处理之图像自动阈值分割示例
    目录引言1、threshold_otsu2、threshold_yen3、threshold_li4、threshold_isodata5、threshold_adaptive引言 ...
    99+
    2024-04-02
  • PythonOpenCV直方图均衡化详解
    目录前言灰度直方图均衡化颜色直方图均衡化前言 图像处理技术是计算机视觉项目的核心,通常是计算机视觉项目中的关键工具,可以使用它们来完成各种计算机视觉任务。在本文中,将介绍如何使用 O...
    99+
    2024-04-02
  • R语言时间序列TAR阈值自回归模型示例详解
    为了方便起见,这些模型通常简称为TAR模型。这些模型捕获了线性时间序列模型无法捕获的行为,例如周期,幅度相关的频率和跳跃现象。Tong和Lim(1980)使用阈值模型表明,该模型能够...
    99+
    2024-04-02
  • PythonOpenCV学习之图像滤波详解
    目录背景一、卷积相关概念二、卷积实战三、均值滤波四、高斯滤波五、中值滤波六、双边滤波七、Sobel算子八、Scharr算子九、拉普拉斯算子十、Canny算法背景 图像滤波的作用简单来...
    99+
    2024-04-02
  • Python处理键映射值操作详解
    目录1. 问题背景2. collections 概述2.1 什么是collections2.2 Collections 内部结构2.3 collections 使用方法3. defa...
    99+
    2022-11-16
    Python键映射值操作 Python键映射值 Python 映射值
  • PythonOpenCV实现图像模板匹配详解
    目录1.什么是模板匹配及模板匹配方法matchTemplate()介绍素材准备2.单模板匹配2.1 单目标匹配2.2 多目标匹配3.多模板匹配1.什么是模板匹配及模板匹配方法matc...
    99+
    2024-04-02
  • PythonOpenCV之常用滤波器使用详解
    目录1. 滤波器1.1 什么是滤波器1.2 关于滤波核1.3 素材选择2.均值滤波器 cv2.blur()2.1 语法简介2.2 代码示例3. 中值滤波器 cv2.medianBlu...
    99+
    2024-04-02
  • PythonOpenCV绘制各类几何图形详解
    目录一.绘制直线二.绘制矩形三.绘制圆形四.绘制椭圆五.绘制多边形六.绘制文字七.总结一.绘制直线 在OpenCV中,绘制直线需要获取直线的起点和终点坐标,调用cv2.line()函...
    99+
    2024-04-02
  • 详解PythonOpenCV图像分割算法的实现
    目录前言1.图像二值化2.自适应阈值分割算法3.Otsu阈值分割算法4.基于轮廓的字符分离4.1轮廓检测 4.2轮廓绘制4.3包围框获取4.4矩形绘制 前言 图像...
    99+
    2024-04-02
  • PythonOpenCV机器学习之图像识别详解
    目录背景一、人脸识别二、车牌识别三、DNN图像分类背景 OpenCV中也提供了一些机器学习的方法,例如DNN;本篇将简单介绍一下机器学习的一些应用,对比传统和前沿的算法,能从其中看出...
    99+
    2024-04-02
  • Python Pandas知识点之缺失值处理详解
    前言 数据处理过程中,经常会遇到数据有缺失值的情况,本文介绍如何用Pandas处理数据中的缺失值。 一、什么是缺失值 对数据而言,缺失值分为两种,一种是Pandas中的空值,另一种是...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作