-
边缘问题存在的原因:
前面在图像的模糊处理中我们已经接触到由于其在边缘及四周由于某一方位的像素缺失,因而我们不能进行完全的卷积操作 -
OpenCV中处理边缘的方法:
在卷积开始之前增加边缘像素,填充的像素值为0或者RGB黑色,比如3×3在四周各填充一个边缘的像素,OpenCV中默认的处理方法是:BORDER_DEFAULT-是通过填充最近的像素值来实现的,此外还有以下几种处理方法
BORDER_CONSTANT:填充边缘用指定像素值即用常数来填充
BORDER_REPLICATE:填充边缘像素用已知的边缘像素值,即相当于一个差值问题,我们也可以理解为复制最近的一行或一列像素并一直延伸至添加边缘的宽度或高度。
BORDER_WRAP:用另外一边的像素来补偿填充,相当于一条路走不通了换另一条 -
用到的重要函数:给图像添加边缘的API-copyMakeBorder
void copyMakeBorder(InputArray src, OutputArray dst, int top, int bottom, int left, int right, int borderType, const Scalar& value = Scalar() );
参数分析:top、bottom、left、right分别表示边缘的长度
borderType表示选择的何种类型的边缘处理方法
最后一个参数为如果选择BORDER_CONSTANT处理方法时用以填充边界的元素的颜色 -
实验代码即内容:
#include<opencv2\opencv.hpp> #include<iostream> #include<math.h> using namespace std; using namespace cv; int main() { Mat src, dst; src = imread("H:/opencv_images/test.jpg"); if (src.empty()) { cout << "could not load the images" << endl; return -1; } namedWindow("original_images", CV_WINDOW_AUTOSIZE); imshow("original_images", 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 bordershape = BORDER_DEFAULT; int c = 0; RNG rng(123456); while (1) { c = waitKey(500); if ((char)c == 27)break; else if ((char)c == 'r')bordershape = BORDER_REFLECT; else if ((char)c == 'c')bordershape = BORDER_CONSTANT; else if ((char)c == 'w')bordershape = BORDER_WRAP; else bordershape = BORDER_DEFAULT; Scalar color(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)); copyMakeBorder(src, dst, top, bottom, left, right, bordershape, color); namedWindow("test_images", CV_WINDOW_AUTOSIZE); imshow("test_images", dst); } waitKey(0); destroyAllWindows(); return 0; }