卷积边缘问题

1 、问题

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


image.png

2 、处理办法

在卷积开始之前增加边缘像素,填充的像素值为0或者RGB黑色,比如3x3在
四周各填充1个像素的边缘,这样就确保图像的边缘被处理,在卷积处理之
后再去掉这些边缘。

openCV中默认的处理方法是: BORDER_DEFAULT,此外
常用的还有如下几种:

  • BORDER_CONSTANT – 填充边缘用指定像素值
  • BORDER_REPLICATE – 填充边缘像素用已知的边缘像素值。
  • BORDER_WRAP – 用另外一边的像素来补偿填充

3 、整体代码测试

CV_EXPORTS_W 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_REPLICATE
  * BORDER_REFLECT
  * BORDER_REFLECT_101
  * BORDER_WRAP
  * BORDER_CONSTANT
const Scalar& value=Scalar():表示如果边界的类型是 BORDER_CONSTANT  ,那么边界的颜色值
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>


using namespace cv;
Mat src, gray_src, dst, dst1;
int threshold_value = 127;
int threshold_max = 255;
int type_value = 2;
int type_max = 4;
const char* output_title = "binary image";
int main(int argc, char** argv) {
    src = imread("D:\\d.jpg");
    if (!src.data) {
        printf("could not load image...\n");
        return -1;
    }
    namedWindow("inputimage", CV_WINDOW_AUTOSIZE);
    imshow("inputimage", 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);
    RNG rng(12345);
    int borderType = BORDER_DEFAULT;


    int c = 0;
    while (true)
    {
        c = waitKey(5000);
        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("1234", dst);
    }
    waitKey(0);
    return 0;
}


image.png

image.png

image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容