卷积边缘问题
在做卷积处理时,图像边缘的像素不会被卷积操作。
原因在于边界像素没有完全跟卷积和重合,所以3x3像素会有1个像素的边缘没有被处理。
边缘处理方法:
在卷积开始之前增加边缘像素,填充的像素为0或者RGB黑色。这样就确保边缘被处理。OpenCV默认的是BORDER_DEFAULT,其他还有:
BORDER_CONSTANT - 填充边缘用指定像素
BORDER_REPLICATE -填充边缘像素用已知的边缘像素值
BORDER_WRAP - 用另外一边的像素来补偿填充
API说明 - 给图像添加边缘API
copyMakeBorder
代码:
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace cv;
int main(int argc,char ** argv)
{
Mat src,dst;
int flag = 0;
RNG rng;
Scalar color;
int border_type = BORDER_WRAP;
src = imread("1.jpg");
namedWindow("input window",CV_WINDOW_AUTOSIZE);
imshow("input window",src);
int top = (int)(0.05 *src.rows);
int bottom = (int)(0.05*src.rows);
int left = (int)(0.05 *src.cols);
int right = (int)(0.05*src.cols);
while(true)
{
flag = waitKey(500);
if((char)flag == 27){
break;
}
if((char)flag == 'c'){
border_type = BORDER_CONSTANT;
}
else if((char)flag == 'r'){
border_type = BORDER_REPLICATE;
}
color = Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255));
copyMakeBorder(src,dst,top,bottom,left,right,border_type,color);
imshow("out",dst);
}
return 0;
}
结果:
源码和原图片请到github下载:
https://github.com/MRwangmaomao/OpencvBorder-Project.git