✅💖⚠️▶️➡️🌿🍀🍄🌟⭐❄️✅💖⚠️▶️➡️🌿🍀🍄🌟⭐❄️✅💖⚠️▶️➡️🌿🍀🍄🌟⭐❄️✅💖⚠️
图像二值化:原理、方法与实践
在图像处理领域,图像二值化是一项基础且重要的技术,它能够将复杂的图像信息简化,突出目标物体,便于后续的分析和处理。下面我们就围绕图像二值化展开详细探讨。
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)
代码解析
- 导入模块:首先导入
cv2
库,这是 OpenCV 库的 Python 接口,用于处理图像相关操作。 - 读取图像并转换为灰度图:使用
cv2.imread
函数读取指定路径的图像文件,将其存储在image
变量中。然后通过cv2.cvtColor
函数将彩色图像转换为灰度图,存储在gray
变量中。灰度图是进行二值化处理的常用输入格式。 - 进行不同类型的二值化处理:
- 使用
cv2.threshold
函数对灰度图gray
进行不同类型的二值化处理。 - 以
cv2.THRESH_BINARY
为例,将灰度值大于 175 的点置为 255,小于 175 的点置为 0,结果存储在binary
变量中。 - 同样的方式,对其他几种阈值类型进行处理,分别得到
binaryinv
、trunc
、tozero
和tozeroinv
等不同的二值化图像。
- 使用
- 显示图像:使用
cv2.imshow
函数依次显示原始图像original
、灰度图gray
以及各种二值化处理后的图像。 - 等待按键:
cv2.waitKey(0)
用于等待用户按下任意键,确保图像窗口保持显示状态,直到用户进行操作。
5. 运行结果
通过上述代码的运行,我们得到了不同类型二值化处理后的图像,从提供的图片可以直观地看到各种阈值类型对图像的影响。
- 原图:展示了原始的彩色图像,包含丰富的色彩和细节信息。
- gray:灰度图将彩色图像转换为单一灰度值表示,去除了色彩信息,突出了图像的亮度变化。
- binary:根据设定的阈值 175,将灰度值大于 175 的部分变为白色(255),小于 175 的部分变为黑色(0),使得图像呈现出明显的黑白对比。
- binaryinv:与
binary
相反,大于阈值的部分为黑色,小于阈值的部分为白色,图像的黑白区域与binary
相反。 - trunc:大于阈值 175 的部分被置为 175,小于部分保持不变,图像中较亮的部分被限制在阈值范围内。
- tozero:小于阈值 175 的部分被置为 0,大于部分保持不变,突出了图像中较亮的部分。
- tozeroinv:大于阈值 175 的部分被置为 0,小于部分保持不变,突出了图像中较暗的部分。
通过这些不同的二值化结果,可以根据具体的应用需求选择最合适的阈值类型,以达到最佳的图像处理效果。
✅💖⚠️▶️➡️🌿🍀🍄🌟⭐❄️✅💖⚠️▶️➡️🌿🍀🍄🌟⭐❄️✅💖⚠️▶️➡️🌿🍀🍄🌟⭐❄️✅💖⚠️