OpenCV 计算机视觉基础(二):图像边界填充与阈值处理详解

OpenCV 计算机视觉基础(二):图像边界填充与阈值处理详解

一、为什么需要边界填充

在图像处理中,卷积操作是核心处理手段之一。

例如,使用一个 3×3 的滤波器:

### # # ###

当处理图像边缘像素时,会遇到一个问题:边缘像素周围没有完整的邻域像素可供卷积核计算。因此,为了确保卷积操作能够正常进行,需要对图像外围进行边界填充(padding)。


二、OpenCV 边界填充

OpenCV 提供了专门的边界填充函数:

cv2.copyMakeBorder()

该函数的基本格式如下:

cv2.copyMakeBorder( src, top, bottom, left, right, borderType )

参数说明:

参数说明
src输入图像(原图)
top顶部扩充像素数
bottom底部扩充像素数
left左侧扩充像素数
right右侧扩充像素数
borderType填充方式(边界类型)

三、常见边界填充方式

1. 常量填充(BORDER_CONSTANT)

cv2.BORDER_CONSTANT

使用固定颜色填充边界区域。

示例代码:

constant = cv2.copyMakeBorder( image, 50, 50, 50, 50, cv2.BORDER_CONSTANT, value=[229, 25, 80] )

效果:图像外围全部变为指定的颜色(如 [229, 25, 80] 表示的 BGR 颜色)。


2. 镜像填充(BORDER_REFLECT)

cv2.BORDER_REFLECT

原图边缘像素序列:

abcdef

扩充后的序列:

fedcbabcdef

特点:复制边界像素并进行镜像对称,边界像素本身会被重复使用。


3. 反射填充(BORDER_REFLECT101)

cv2.BORDER_REFLECT101

与 BORDER_REFLECT 类似,都是镜像填充。

主要区别:BORDER_REFLECT101 不会重复边界像素,而是从边界像素的相邻像素开始反射,通常能获得更平滑的边界效果。


4. 复制填充(BORDER_REPLICATE)

cv2.BORDER_REPLICATE

复制最边缘的像素值来填充边界。

例如,原图边缘序列为 "abcde",填充后变为:

aaaa|abcde|eeeee

特点:简单高效,但可能在边界处产生明显的条纹效应。


5. 环绕填充(BORDER_WRAP)

cv2.BORDER_WRAP

循环复制图像内容来填充边界。

例如,原图序列为 "abcde",填充后变为:

abcdeabcde

特点:适用于周期性纹理的图像,能保持纹理的连续性。


四、阈值处理

4.1 什么是阈值处理

阈值处理(Thresholding)是一种基本的图像分割技术,根据像素值与预设阈值的比较结果,将图像转换为不同的区域。

常用于以下场景:

  • 图像分割:将前景与背景分离
  • 文字识别:增强文档图像中的文字区域
  • 目标提取:从复杂背景中提取特定目标

五、threshold 函数

OpenCV 中的阈值处理函数格式如下:

ret, dst = cv2.threshold( src, thresh, maxval, type )

参数详细说明:

参数作用
src输入图像(通常为灰度图)
thresh阈值(临界值)
maxval最大值(当像素值满足条件时赋予的值)
type阈值类型(决定如何处理像素)

六、五种阈值类型

1. 二值化(THRESH_BINARY)

cv2.THRESH_BINARY

处理规则:

条件结果
像素值 > 阈值设为 maxval(通常为 255)
其他情况设为 0

2. 反二值化(THRESH_BINARY_INV)

cv2.THRESH_BINARY_INV

处理规则与二值化相反:像素值大于阈值时设为 0,否则设为 maxval。


3. 截断(THRESH_TRUNC)

cv2.THRESH_TRUNC

当像素值超过阈值时,将其截断为阈值;否则保持原值不变。

例如:阈值为 175,像素值 220 会被截断为 175。


4. 保留大值(THRESH_TOZERO)

cv2.THRESH_TOZERO

处理规则:

大于阈值的像素值保持不变,小于等于阈值的像素值设为 0。


5. 保留小值(THRESH_TOZERO_INV)

cv2.THRESH_TOZERO_INV

处理规则:

小于阈值的像素值保持不变,大于等于阈值的像素值设为 0。


七、实例代码

gray = cv2.imread( 'wx.jpg', cv2.IMREAD_GRAYSCALE ) ret, binary = cv2.threshold( gray, 175, 255, cv2.THRESH_BINARY )

实现效果:将灰度图像转换为黑白二值图像,阈值设为 175,大于 175 的像素变为白色(255),其余变为黑色(0)。


八、总结

本文介绍了 OpenCV 中图像处理的两个重要技术:

技术/函数主要作用
copyMakeBorder扩充图像边缘,支持多种边界填充方式
BORDER_CONSTANT使用固定颜色填充边界
BORDER_REFLECT镜像填充边界像素
BORDER_REPLICATE复制最边缘像素填充
threshold图像分割与二值化处理
二值化(THRESH_BINARY)将图像转换为黑白二值图像

掌握这些基础技术对于后续的图像处理、计算机视觉任务至关重要。