OpenCV copyMakeBorder()
图像边界扩展详解与实战
在图像处理和计算机视觉中,有时需要在原始图像的四周增加边界(Padding)。这种操作在很多场景中都有应用,比如:
-
卷积神经网络(CNN)中的图像预处理
-
为图像添加装饰性边框
-
保证滤波、卷积等操作不会丢失边缘信息
OpenCV 提供了一个非常方便的函数 cv2.copyMakeBorder()
来实现边界扩展。
1. copyMakeBorder()
函数原型
cv2.copyMakeBorder()是OpenCV库中的一个函数,用于给图像添加额外的边界(padding)。
dst = cv2.copyMakeBorder(src, top, bottom, left, right, borderType[, value])
参数说明
参数 | 含义 |
---|---|
src |
原始图像 |
top, bottom, left, right |
上、下、左、右四个方向的边界宽度(单位:像素) |
borderType |
边界类型(见下文详解) |
value |
当 borderType=cv2.BORDER_CONSTANT 时,需要指定填充的颜色(BGR 格式) |
2. 常用 borderType
类型
OpenCV 提供了多种扩展方式,不同方式在边缘处理时会有不同效果。
-
cv2.BORDER_CONSTANT
-
用固定颜色填充边界。
-
需要额外指定
value
参数,例如(0, 0, 255)
代表红色。 -
适合纯色边框的效果。
-
-
cv2.BORDER_REFLECT
-
镜像反射边界,边界像素会被复制。
-
模式类似:
321|123456789|987
-
-
cv2.BORDER_REFLECT_101
或cv2.BORDER_REFLECT101
-
也是镜像反射,但不复制边界像素本身。
-
模式类似:
432|123456789|876
-
-
cv2.BORDER_REPLICATE
-
使用边界像素重复填充。
-
模式类似:
111|123456789|999
-
-
cv2.BORDER_WRAP
-
边界使用图像另一侧的像素包裹。
-
模式类似:
789|123456789|123
-
3. 示例代码
下面的示例会分别展示 5 种 borderType
效果,方便直观对比。
import cv2
# 读取图片
img = cv2.imread('lyf.jpg')
# 调整图片大小
img = cv2.resize(img, (500, 500))
# 设置边界宽度
top, bottom, left, right = 100, 100, 100, 100
# 1. 设置颜色边界(红色)
constant = cv2.copyMakeBorder(img, top, bottom, left, right,
borderType=cv2.BORDER_CONSTANT, value=(0, 0, 255))
# 2. 镜像反射(复制边界像素)
reflect = cv2.copyMakeBorder(img, top, bottom, left, right, borderType=cv2.BORDER_REFLECT)
# 3. 镜像反射(不复制边界像素)
reflect101 = cv2.copyMakeBorder(img, top, bottom, left, right, borderType=cv2.BORDER_REFLECT101)
# 4. 重复边界像素
replicate = cv2.copyMakeBorder(img, top, bottom, left, right, borderType=cv2.BORDER_REPLICATE)
# 5. 包裹方式
wrap = cv2.copyMakeBorder(img, top, bottom, left, right, borderType=cv2.BORDER_WRAP)
# 显示结果
cv2.imshow('Original', img)
cv2.imshow('BORDER_CONSTANT', constant)
cv2.imshow('BORDER_REFLECT', reflect)
cv2.imshow('BORDER_REFLECT101', reflect101)
cv2.imshow('BORDER_REPLICATE', replicate)
cv2.imshow('BORDER_WRAP', wrap)
cv2.waitKey(0)
cv2.destroyAllWindows()
4. 运行效果示意
原图:lyf.jpg

BORDER_CONSTANT

BORDER_REFLECT

BORDER_REFLECT101

BORDER_REPLICATE

BORDER_WRAP

类型 | 效果描述 |
---|---|
BORDER_CONSTANT | 边界为纯红色(示例中是 (0,0,255) ) |
BORDER_REFLECT | 边界为镜像反射,边缘处像素被复制 |
BORDER_REFLECT101 | 边界为镜像反射,去掉边缘像素自身 |
BORDER_REPLICATE | 边界像素直接复制填充 |
BORDER_WRAP | 边界使用对面边的像素包裹 |
5.应用场景案例
多给几个真实案例,读者会立刻想到怎么用:
-
图像边框美化 → 用
BORDER_CONSTANT
做彩色相框。 -
深度学习数据增强 → 随机 padding 后再裁剪。
-
全景图拼接 → 避免拼接缝隙处出现黑边。
-
滤波降噪 → 用镜像 padding 防止边缘模糊不均。
6. 小结
cv2.copyMakeBorder()
是一个简单而强大的函数,可以在图像四周添加不同类型的边界。
在实际应用中:
-
图像卷积/滤波前 → 推荐
BORDER_REFLECT
或BORDER_REFLECT101
,能保留边缘信息。 -
美化图片 → 推荐
BORDER_CONSTANT
,可指定任意颜色作为相框。 -
特殊视觉效果 → 可尝试
BORDER_WRAP
。
掌握它之后,你不仅能做图像边界填充,还能理解很多计算机视觉算法在"边缘处理"时的逻辑。