一、为什么需要边界填充
在图像处理中,卷积操作是核心处理手段之一。
例如,使用一个 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) | 将图像转换为黑白二值图像 |
掌握这些基础技术对于后续的图像处理、计算机视觉任务至关重要。