OpenCV空间滤波采用的是模板运算。模板运算的操作过程在于不断移动模板,将模板系数与图像区域重叠,以得到模板中心位置所对应像素的响应值。如果模板覆盖区域像素都位于图像内部,则模板所覆盖区域都有像素值与其对应;但是如果模板区域像素有一部分位于图像外部,则没有像素值与这些模板系数对应。这时候就需要对原图像边缘区域进行扩展,以便于模板运算能够覆盖整个图像的所有像素。
OpenCV对图像边缘的扩展处理,有7种处理方式,列表如下:
表1. OpenCV图像边缘扩展处理方式
值 | BorderTypes | 处理方式 |
0 | BORDER_CONSTANT | 以常数填充边缘 |
1 | BORDER_REPLICATE | 复制边缘像素填充 |
2 | BORDER_REFLECT | 以边缘为轴,镜像复制边界像素 |
3 | BORDER_WRAP | 以行、列或对角线为周期进行复制 |
4 | BORDER_REFLECT_101 | 以最边缘像素为轴对称填充 |
6 | BORDER_REFLECT101 | 等同BORDER_REFLECT_101 |
7 | BORDER_DEFAULT | 等同BORDER_REFLECT_101 |
图1. 原图像和BORDER_REPLICATE边缘扩展
图2. 镜像边缘扩展和周期扩充
图3. BORDER_REFLECT_101和常数填充
图1到图3以实例的方式说明了图像中的各种边缘处理方式。在实际计算中,可以利用 cv::copyMakeBorder()函数来对图像边缘进行扩展,此函数的原型为:
void copyMakeBorder(
InputArray src, //原图像
//处理结果,大小为Size(src.cols left right,src.rows top bottom)
OutputArray dst,
int top, //上面填充像素行数
int bottom, //下面填充的像素行数
int left, //左边填充的像素列数
int right, //右边填充的像素列数
int borderType, //边缘像素处理方式
//如果处理方式选BORDER_CONSTANT时,边缘像素的值
const Scalar& value = Scalar()
);
cv::copyMakeBorder()函数是将原图像src中的像素值拷贝到目标图像dst中,并且在dst的上下左右边缘扩充像素,所以目标图像的尺寸与原图像的尺寸有可能不一致。borderType参数决定了如何计算扩充边缘的像素值。扩充边缘的大小由top,bottom,left和right这4个参数来决定,分别表示上面扩充的行数,下面扩充的行数,左边扩充的列数,右边扩充的列数。
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved