黑色边框:在Open CV中使用高斯滤镜蒙版进行图像平滑

时间:2014-12-16 23:08:09

标签: c++ opencv filter gaussian

我正在尝试使用2D滤镜(高斯滤镜)实现初始卷积。我在公开简历中这样做。问题是,我在图像的边缘周围有一些黑色边框。我使用以下代码:

void naive(int maskSize,Mat img1){


int i,j,k,l,centreOfMask,w,h,newImageWidth,newImageHeight;


double sigma,summation = 0.0;
float a,X,Y,nsum = 0;;
centreOfMask = maskSize/2;

Mat kernel = Mat::zeros(maskSize,maskSize,CV_32F);
Mat newImage = Mat::zeros(img1.size(),CV_32F);
sigma = (maskSize - 1.0) / (2.0 * 2.575);
for(i = 0; i< maskSize;i++){
    for(j = 0;j<maskSize;j++){
        X = abs(centreOfMask-i);
        Y = abs(centreOfMask-j);

        a =(1.0/(2.0* (M_PI) * pow(sigma,2.0))) * exp(-(pow(X,2.0) + pow(Y,2.0)) / (2.0 * pow(sigma,2.0)));
        kernel.at<float>(i,j)=a;
        summation = summation + a;

    }
}
kernel = kernel/summation;

Size s;
s = img1.size();
w = s.width;
h = s.height;
newImageWidth = w - centreOfMask;
newImageHeight = h - centreOfMask;

for(i=centreOfMask;i<newImageWidth;i++){
    for(j = centreOfMask; j < newImageHeight; j++){
        for(k= -centreOfMask;k<centreOfMask+1;k++){
            for(l = -centreOfMask; l < centreOfMask+1;l++){
                nsum = nsum + (int)(img1.at<uchar>(i+k,j+l)) * kernel.at<float>(k+centreOfMask,l+centreOfMask);
            }
        }
        newImage.at<float>(i,j)=nsum;
        nsum=0;

    }

}

newImage.convertTo(newImage, CV_8U);
imshow("hellow",newImage);
waitKey(0);

}

我得到以下输出(第一个是输入图像,第二个是过滤后的图像): 我使用了7x7的面罩尺寸。有一个openCV的内置方法叫做filter2d,当我使用它时,我没有得到那个边界。有人能解释一下原因吗?我怎么能避免这个?

提前谢谢。

0 个答案:

没有答案