/*
*处理边缘
图像卷积的时候边界像素不能被卷积操作,原因在于边界像素没有完全跟kernel(卷积核)重叠,所以当3*3滤波时候
有1个像素的边缘没有被处理,5*5滤波的时候有2个像素的边缘没有被处理
在卷积开始之前增加边缘像素,填充的像素值为0或者RGB黑色,比如3*3在四周各填充1个像素的边缘,这样就确保图像的边缘被处理,
在卷积处理之后再去掉这些边缘。openCV中默认的处理方法是:BORDER_DEFAULT,此外常用的还有如下几种:
BORDER_CONSTANT -填充边缘用指定像素值
BORDER_REPLICATE -填充边缘用已知的像素边缘值
BORDER_WRAP -用另外一边的像素来补偿填充 就相当于你一个东西到顶了你还往上面走走不了了就换行
好像是卷积到边上超出了几个像素对超出的几个像素给它换行换到这边来
把这边的几个像素加过来一起把边缘像素给处理
API说明 -给图像添加边缘API
copyMakeBorder(
Mat src, //输入图像
Mar dst, //添加边缘图像
int top, //边缘长度,一般上下左右都取相同值
int bottom,
int left,
int borderType //边缘类型
Scalar value //颜色,颜色的一个向量
)
*/
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat src, res;
src = imread("D:/A_Graduation/Pictures/Segmentatio/1.jpg");
imshow("src", 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);
int borderType = BORDER_DEFAULT;
//生成随机数
//定义一个随机数
RNG rng(12345);
int c = 0;
while (true)
{
c = waitKey(500); //500毫秒
if ((char)c == 27) //ESC
{
break;
}
if ((char)c == 'r')
{
borderType = BORDER_REPLICATE;
}
else if ((char)c == 'w')
{
borderType = BORDER_WRAP;
}
else if ((char)c == 'c')
{
borderType = BORDER_CONSTANT;
}
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
copyMakeBorder(src, res, top, bottom, left, right, borderType, color); //color好像只对BORDER_CONSTANT有效
imshow("result", res);
}
// GaussianBlur(src, res, Size(5, 5), 0, 0,BORDER_CONSTANT);
// imshow("result", res);
waitKey(0);
return 0;
}