【问题标题】:Sharpening using Gaussian 3x3 filter works but the result is white pixels使用高斯 3x3 滤镜进行锐化,但结果是白色像素
【发布时间】:2017-03-12 00:04:02
【问题描述】:

以下程序不工作。我正在实施高斯 3x3 过滤器来锐化图像文件FACE DETECTION.png,但结果只是显示白色。我认为在卷积运算中sum的值大于255。我需要一个解决方案...

代码:

int main()
{

  Mat src, dst;
  float sum;

  /// Load an image
  src = imread("FACE DETECTION.png", 0);

  if( !src.data )
  { return -1; }

  // define the kernel
  float Kernel[3][3] = {
                        {1.0, 2.0, 1.0},
                        {2.0, 4.0, 2.0},
                        {1.0, 2.0, 1.0}
                       };
     dst = src.clone();
    for(int y = 0; y < src.rows; y++)
        for(int x = 0; x < src.cols; x++)
            dst.at<uchar>(y,x) = 0.0;
    //convolution operation
    for(int y = 1; y < src.rows - 1; y++){
        for(int x = 1; x < src.cols - 1; x++){
            sum = 0.0;
            for(int k = -1; k <= 1;k++){
                for(int j = -1; j <=1; j++){
                    sum = sum + Kernel[j+1][k+1]*src.at<uchar>(y - j, x - k);
                    sum = sum>255? 255:sum;
                    sum = sum<0? 0:sum;
                }
            }
            dst.at<uchar>(y,x) = sum;
        }
    }


    namedWindow("final");
    imshow("final", dst);

    namedWindow("initial");
    imshow("initial", src);

  waitKey();


return 0;
}

【问题讨论】:

    标签: opencv image-processing gaussian convolution


    【解决方案1】:

    问题在于您的内核。内核的总和应该等于 1,但你的等于 16。

    kernel = 1/16* kernel; 
    

    会解决你的问题。

    【讨论】:

    • 是的,这是一个模糊内核。如果要锐化,需要使用锐化滤镜如[ 0 -1 0; -1 4 -1; 0 -1 0].
    猜你喜欢
    • 1970-01-01
    • 2017-01-29
    • 2012-12-03
    • 2017-01-03
    • 2015-11-05
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    相关资源
    最近更新 更多