opencv::处理边缘

匿名 (未验证) 提交于 2019-12-02 23:57:01

 

卷积边界问题     图像卷积的时候边界像素,不能被卷积操作,原因在于边界像素没有完全跟kernel重叠,所以当3x3滤波时候有1个像素的边缘没有被处理,5x5滤波的时候有2个像素的边缘没有被处理。

 

处理边缘     在卷积开始之前增加边缘像素,填充的像素值为0或者RGB黑色,比如3x3在四周各填充1个像素的边缘,     这样就确保图像的边缘被处理,在卷积处理之后再去掉这些边缘。     openCV中默认的处理方法是: BORDER_DEFAULT     此外常用的还有如下几种:      - BORDER_CONSTANT  填充边缘用指定像素值      - BORDER_REPLICATE  填充边缘像素用已知的边缘像素值。      - BORDER_WRAP  用另外一边的像素来补偿填充

 

copyMakeBorder     Mat src,         // 输入图像     Mat dst,         // 添加边缘图像     int top,         // 边缘长度,一般上下左右都取相同值,     int bottom,     int left,     int right,     int borderType   // 边缘类型     Scalar value  

 

int main(int argc, char** argv) {     Mat src, dst;     src = imread(STRPAHT2);     if (!src.data) {         printf("could not load image...\n");         return -1;     }          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);     RNG rng(12345);     int borderType = BORDER_DEFAULT;      int c = 0;     while (true) {         c = waitKey(500);         // ESC         if ((char)c == 27) {             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, dst, top, bottom, left, right, borderType, color);         imshow("OUTPUT_WIN", dst);     }      //去边缘     GaussianBlur(src, dst, Size(5, 5), 0, 0);     imshow("OUTPUT_WIN", dst);      waitKey(0);     return 0; }

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!