一.写在前面
图像卷积的时候边界像素,不能被卷积操作,原因在于边界像素没有完全跟kernel重叠,所以当3×3滤波时候有1个像素的边缘没有被处理,5×5滤波的时候有2个像素的边缘没有被处理。
在卷积开始之前增加边缘像素,填充的像素值为0或者RGB黑色,比如3×3在
四周各填充1个像素的边缘,这样就确保图像的边缘被处理,在卷积处理之
后再去掉这些边缘。openCV中默认的处理方法是: BORDER_DEFAULT,此外
常用的还有如下几种:
– BORDER_CONSTANT – 填充边缘用指定像素值
– BORDER_REPLICATE – 填充边缘像素用已知的边缘像素值。
– BORDER_WRAP – 用另外一边的像素来补偿填充
二.对应API
lcopyMakeBorder(
– Mat src, // 输入图像
– Mat dst, // 添加边缘图像
– int top, // 边缘长度,一般上下左右都取相同值,
– int bottom,
– int left,
– int right,
– int borderType // 边缘类型
– Scalar value
)
三.代码实现
/*
OpenCV 处理边缘学习
Michael Jiang<sencom1997@outlook.com>
2019年7月26日06:07:12
*/
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
int main()
{
Mat src, dst;
//读取图像
src = imread("D:/linus.jpg", IMREAD_COLOR);
//判断读取是否成功
if (src.empty()) {
printf("pic load failed!\n");
return -1;
}
imshow("src", src);
//高斯模糊采用默认边界处理方式
GaussianBlur(src, dst, Size(5, 5), -1, (0, 0), BORDER_DEFAULT);
imshow("dst", dst);
waitKey(0);
return 0;
}