OpenCV空间滤波的边缘扩展方式

OpenCV空间滤波的边缘扩展方式

首页休闲益智边缘扩展更新时间:2024-07-27

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