Opencv学习笔记(三):图像二值化函数cv2.threshold函数详解

图像二值化详解
本文详细介绍了图像二值化的概念及应用,通过OpenCV库中的cv2.threshold函数实现不同阈值类型的二值化处理,包括BINARY、BINARY_INV等多种方式,并提供了具体的代码示例。


✅💖⚠️▶️➡️🌿🍀🍄🌟⭐❄️✅💖⚠️▶️➡️🌿🍀🍄🌟⭐❄️✅💖⚠️▶️➡️🌿🍀🍄🌟⭐❄️✅💖⚠️

图像二值化:原理、方法与实践

在图像处理领域,图像二值化是一项基础且重要的技术,它能够将复杂的图像信息简化,突出目标物体,便于后续的分析和处理。下面我们就围绕图像二值化展开详细探讨。

1. 何为图像的二值化

图像二值化主要借助 cv2.threshold 函数来实现。其核心思想是将图像上每个像素点的灰度值设定为 0 或 255,使得整个图像呈现出鲜明的黑白视觉效果,其中灰度值 0 代表黑色,灰度值 255 代表白色。

在实际的图像中,除了我们关注的目标物体和背景区域,还常常存在噪声干扰,这会给图像识别带来困难。而图像二值化的作用就是通过设定一个阈值 T,将多值的数字图像中的像素群一分为二,从而直接提取出目标图像,有效减少噪声等干扰因素的影响。

2. 常见的阈值类型

  • cv2.THRESH_BINARY:在这种阈值类型下,图像中大于阈值的部分会被置为 255,小于阈值的部分则被置为 0。这样可以将高于某个灰度值的区域凸显为白色,其余部分为黑色,常用于突出图像中的明亮部分。
  • cv2.THRESH_BINARY_INV:与 cv2.THRESH_BINARY 相反,大于阈值的部分被置为 0,小于阈值的部分被置为 255。此类型适用于需要突出图像中较暗部分的情况。
  • cv2.THRESH_TRUNC:当图像像素的灰度值大于阈值时,该像素值会被置为设定的阈值 threshold,而小于阈值的部分则保持原样。这种方式可以限制图像中过亮部分的灰度值,使其不超过特定阈值。
  • cv2.THRESH_TOZERO:小于阈值的部分被置为 0,大于阈值的部分保持不变。这有助于去除图像中较暗的背景或噪声,保留相对较亮的目标物体。
  • cv2.THRESH_TOZERO_INV:与 cv2.THRESH_TOZERO 相反,大于阈值的部分被置为 0,小于阈值的部分保持不变。常用于突出图像中较暗的目标物体。
  • cv2.THRESH_OTSU:当把阈值 thresh 设为 0 时,算法会自动寻找最优阈值,并将其作为第一个返回值 ret 返回。这种自适应阈值的方法无需手动设定阈值,能够根据图像的灰度分布自动确定最佳的二值化阈值,适用于图像灰度分布较为复杂的情况。

3. 函数介绍

cv2.threshold 函数的基本语法为 cv2.threshold(img, threshold, maxval, type)

  • img:表示要进行二值化处理的输入图片。
  • threshold:即设定的阈值,用于划分像素的灰度值。
  • maxval:当像素的灰度值大于(或小于,取决于 type 的设置)阈值时,将该灰度值赋予的值。
  • type:规定当前使用的二值化方式,可选值就是上述介绍的各种阈值类型。

4. 代码实例

import cv2

image = cv2.imread('D:/pycharm/test/1.jpg')

gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
ret, binary = cv2.threshold(gray, 175, 255, cv2.THRESH_BINARY)
ret1, binaryinv = cv2.threshold(gray, 175, 255, cv2.THRESH_BINARY_INV)
ret2, trunc = cv2.threshold(gray, 175, 255, cv2.THRESH_TRUNC)
ret3, tozero = cv2.threshold(gray, 175, 255, cv2.THRESH_TOZERO)
ret4, tozeroinv = cv2.threshold(gray, 175, 255, cv2.THRESH_TOZERO_INV)
"""上面代码的作用是,将灰度图img2gray中灰度值小于175的点置0,灰度值大于175的点置255"""
cv2.imshow('original', image)
cv2.imshow('gray',gray)
cv2.imshow('binary', binary)
cv2.imshow('binaryinv', binaryinv)
cv2.imshow('trunc', trunc)
cv2.imshow('tozero', tozero)
cv2.imshow('tozeroinv', tozeroinv)

cv2.waitKey(0)

代码解析

  1. 导入模块:首先导入 cv2 库,这是 OpenCV 库的 Python 接口,用于处理图像相关操作。
  2. 读取图像并转换为灰度图:使用 cv2.imread 函数读取指定路径的图像文件,将其存储在 image 变量中。然后通过 cv2.cvtColor 函数将彩色图像转换为灰度图,存储在 gray 变量中。灰度图是进行二值化处理的常用输入格式。
  3. 进行不同类型的二值化处理
    • 使用 cv2.threshold 函数对灰度图 gray 进行不同类型的二值化处理。
    • cv2.THRESH_BINARY 为例,将灰度值大于 175 的点置为 255,小于 175 的点置为 0,结果存储在 binary 变量中。
    • 同样的方式,对其他几种阈值类型进行处理,分别得到 binaryinvtrunctozerotozeroinv 等不同的二值化图像。
  4. 显示图像:使用 cv2.imshow 函数依次显示原始图像 original、灰度图 gray 以及各种二值化处理后的图像。
  5. 等待按键cv2.waitKey(0) 用于等待用户按下任意键,确保图像窗口保持显示状态,直到用户进行操作。

5. 运行结果

通过上述代码的运行,我们得到了不同类型二值化处理后的图像,从提供的图片可以直观地看到各种阈值类型对图像的影响。

  • 原图:展示了原始的彩色图像,包含丰富的色彩和细节信息。
  • gray:灰度图将彩色图像转换为单一灰度值表示,去除了色彩信息,突出了图像的亮度变化。
  • binary:根据设定的阈值 175,将灰度值大于 175 的部分变为白色(255),小于 175 的部分变为黑色(0),使得图像呈现出明显的黑白对比。
  • binaryinv:与 binary 相反,大于阈值的部分为黑色,小于阈值的部分为白色,图像的黑白区域与 binary 相反。
  • trunc:大于阈值 175 的部分被置为 175,小于部分保持不变,图像中较亮的部分被限制在阈值范围内。
  • tozero:小于阈值 175 的部分被置为 0,大于部分保持不变,突出了图像中较亮的部分。
  • tozeroinv:大于阈值 175 的部分被置为 0,小于部分保持不变,突出了图像中较暗的部分。

通过这些不同的二值化结果,可以根据具体的应用需求选择最合适的阈值类型,以达到最佳的图像处理效果。
✅💖⚠️▶️➡️🌿🍀🍄🌟⭐❄️✅💖⚠️▶️➡️🌿🍀🍄🌟⭐❄️✅💖⚠️▶️➡️🌿🍀🍄🌟⭐❄️✅💖⚠️

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZZY_dl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值