► 前言
本篇将介绍使用OpenCV Python对于图像上的二值化操作,二值化主要用途包括图像分割、物体侦测、文字识别等。这种转换可以帮助检测图像中的物体或特定特征,并提取有用的信息。透过程式码的说明,让各位了解OpenCV Python于图像处理上的基本操作。
► 二值化定义
将一幅灰度图像转换为黑白图像的过程。它的目标是将灰度图像中的每个像素点分为两个类别:一个是前景(通常是物体或感兴趣的区域),另一个是背景。二值化后的图像中只包含两种值,通常是0和255(或1),分别表示黑色(背景)和白色(前景)。
►固定阈值二值化(Thresholding)
将图像的每个像素值与一个固定阈值进行比较,将像素值分为两个类别:大于阈值的设为一个值(通常是255),小于阈值的设为另一个值(通常是0)。
cv2.THRESH_BINARY | # 如果大于 127 就等于 255,反之等于 0 |
cv2.THRESH_BINARY_INV | # 如果大于 127 就等于 0,反之等于 255 |
cv2.THRESH_TRUNC | # 如果大于 127 就等于 127,反之数值不变 |
cv2.THRESH_TOZERO | # 如果大于 127 数值不变,反之数值等于 0 |
cv2.THRESH_TOZERO_INV | # 如果大于 127 等于 0,反之数值不变 |
►自适应阈值二值化(Adaptive Thresholding)
自适应阈值二值化允许根据图像的局部区域调整阈值。它将图像分为许多小区域,并为每个区域自动计算阈值。这对于处理不均匀光照的图像特别有用。
►Otsu's 二值化
►TRIANGLE 二值化
TRIANGLE 二值化是另一种自动选择阈值的方法,通常适用于单峰分布的图像。它根据直方图的形状选择阈值。
►选择适当的二值化方法和阈值
在OpenCV中选择适当的二值化方法和阈值通常取决于图像特性和应用需求。
可以先分析图像的特性
- 图像的亮度分布是单峰分布还是多峰分布?
- 图像是否受到噪声的影响?
- 图像中的物体是深色物体对比亮背景,还是亮色物体对比暗背景?
- 如果图像的亮度分布相对均匀,可以使用固定阈值二值化进行二值化操作,通过观察图像直方图来估计一个适当的阈值。
- 如果图像的光照不均匀或受到阴影影响,可以使用自适应阈值二值化,自适应阈值二值化,可以在不同区域使用不同的阈值,以适应局部光照变化。
- 如果要自动选择阈值,可以使用Otsu's 二值化或TRIANGLE 二值化方法根据图像的灰度分布自动选择最佳阈值。
以上方的范例图片进行直方图显示,范例图片偏向单峰分布,透过TRIANGLE 二值化可以很明显的前后景区分出来。
►小结
透过以上讲解,搭配程式码进行范例讲解,相信各位对于图像上的二值化操作能有更深刻的理解,期待下一篇博文吧!
►Q&A
问题一:二值化为甚么要灰度图?
二值化通常应用在灰度图像上,而不是彩色图像,是因为灰度图像只包含亮度信息,它是一种单通道图像,每个像素点的值表示亮度强度,而不考虑颜色信息。在进行二值化时,我们主要关心的是像素的亮度值是否大于或小于阈值,因此使用灰度图像更简单且具有优势。
问题二:在OpenCV中如何评估和调整二值化的效果?
可以使用OpenCV来将原始图像、二值化结果和任何后处理的图像进行可视化,以便比较和分析,或是透过评估指标IoU(Intersection over Union)或Dice系数,用于评估分割的准确性。
问题三:如何选择适当的阈值和二值化方法?
选择适当的阈值和二值化方法取决于影像的特性和应用需求。您可以通过观察影像的直方图来估计阈值,或者使用自适应阈值方法。不同的应用可能需要不同的阈值和二值化方法,您可以通过试验不同的组合来找到最适合的选择。
问题四:如何处理彩色影像的二值化?
对于彩色影像,通常需要将其转换为灰度影像,然后进行二值化处理。可以使用cv2.cvtColor将彩色影像转换为灰度影像,然后选择适当的二值化方法进行处理。在某些情况下,也可以分别处理每个通道的灰度影像,然后组合它们以获得最终的二值化结果。
问题五:自适应阈值二值化的优势是什么?
自适应阈值二值化能够应对不同区域的光照变化,使阈值能够根据局部影像特性自动调整。这使其适用于具有不均匀照明的影像,例如文件扫描或工业检测。
►参考资料
OpenCV - Open Computer Vision Library