本文为原创文章,未经本人允许,禁止转载。转载请注明出处。
1.卷积边界问题
图像卷积时边界像素不能被卷积操作,原因在于边界像素没有完全跟kernel重叠,所以当使用3×3卷积核时有1个像素的边缘没有被处理,使用5×5卷积核时有2个像素的边缘没有被处理。此时我们便需要处理下图像的边缘。
2.边缘处理方法
在卷积开始之前增加边缘像素,比如使用3×3卷积核时在四周各填充1个像素的边缘,这样就确保图像的边缘能够被处理,在卷积处理之后再去掉这些边缘。
👉OpenCV提供的用于边缘填充的API:
1
2
3
4
5
6
7
8
9
10
void copyMakeBorder(
InputArray src, //输入图像
OutputArray dst, //添加边缘后的图像
int top, //上边缘填充长度
int bottom, //下边缘填充长度
int left, //左边缘填充长度
int right, //右边缘填充长度
int borderType, //边缘填充方法
const Scalar& value = Scalar() //填充边缘所用的像素值
);
参数int borderType
有以下几种取值:
BORDER_CONSTANT
:iiiiii|abcdefgh|iiiiiii
。BORDER_REPLICATE
:aaaaaa|abcdefgh|hhhhhhh
。BORDER_REFLECT
:fedcba|abcdefgh|hgfedcb
。BORDER_REFLECT_101
:gfedcb|abcdefgh|gfedcba
。BORDER_WRAP
:cdefgh|abcdefgh|abcdefg
。BORDER_DEFAULT
:即BORDER_REFLECT_101
。
假设
abcdefgh
为图像,|......|
外侧的值为边缘填充的值。