【问题标题】:OpenCV - Not getting desired output while applying Laplacian filterOpenCV - 应用拉普拉斯滤波器时未获得所需的输出
【发布时间】:2017-01-23 18:34:36
【问题描述】:

我正在使用 OpenCV C++。我采用了classical lena image 并应用了具有一定均值和方差noised_lena 的高斯噪声。然后我对这张噪声图像应用平均滤波器并获得Averaged Image 模糊图像。

现在,当我应用拉普拉斯滤波器时,它必须正确检测边缘not correct output。但是我没有得到这个期望的输出,预期的图像应该在哪里,人们可以干净地检测到边缘。代码如下。

提前感谢您的帮助。

int main(int argc, char *argv[])
{
    int i, dim, k, l, j;
    float res=0.0;
    Mat M = imread(argv[1],0); //input image in M
    Mat N(M.rows, M.cols, CV_8U);//Image obtained after applying average filter
    Mat Lap_N(M.rows, M.cols, CV_8U);//Padding the N with zeros based on the filter size given by the user
    Mat Lap(M.rows,M.cols,CV_8U);// image obtained after applying Laplacian filter
    cout << "enter the size of the filter u want odd number only"<<endl;
    cin >> dim;
    Mat Pad_M((M.rows+((dim-1))), (M.cols+((dim-1))), CV_8U);
    Mat Lap_M((M.rows+((dim-1))), (M.cols+((dim-1))), CV_8U);
    copyMakeBorder(M, Pad_M,dim/2,dim/2,dim/2,dim/2, BORDER_CONSTANT, 0);
    /*Average filter*/
    for(i=0;i<=Pad_M.rows-dim;i++)
    {
        for(j=0;j<=Pad_M.cols-dim;j++)
        {   res = 0.0;
            for(k=0;k<dim;k++)
            {   
                for(l=0;l<dim;l++)
                {   
                    res += Pad_M.at<uchar>(i+k,j+l);
                } 
            }
            res = res/(dim*dim);
            N.at<uchar>(i, j)=(uchar)((int)(res));
        }
    }
/* Laplacian Filter*/   
    copyMakeBorder(N, Lap_M,dim/2,dim/2,dim/2,dim/2, BORDER_CONSTANT, 0);
    res = 0;
    for(i=0;i<=Lap_M.rows-dim;i++)
    {
        for(j=0;j<=Lap_M.cols-dim;j++)
        {
            res = 0.0;
            for(k=0;k<dim;k++)
            {   
                for(l=0;l<dim;l++)
                {   
                    if(k==dim/2 && l==dim/2)
                    {
                        res =res - (((dim*dim)-1)*((float)Lap_M.at<uchar>(i+k,j+l)));
                    }
                    else
                    {
                        res += Lap_M.at<uchar>(i+k,j+l);
                    }
                } 
            }

            Lap_N.at<uchar>(i, j)=(uchar)((int)(res));
        }
    }

    imshow("original", M);
    imshow("padded", Pad_M);
    imshow("averaged", N);
    imshow("Laplacian", Lap_N);
    //imwrite("Lap2,500,5*5_lena.png",Lap);
    waitKey(0);
    return 0;
}

【问题讨论】:

  • 您得到了什么出乎意料的结果?
  • 我认为您在应用拉普拉斯滤波器时可能需要标准化步骤:res = res/(dim*dim);

标签: c++ opencv image-processing


【解决方案1】:

我对您提供的模糊图像进行了图像归一化处理:

cv2.normalize(gray, alpha=5, beta=0, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)

应用拉普拉斯滤波器后,我得到了这个:

注意:要执行图像规范化,请确保您的图像类型为 float

【讨论】:

  • 尊敬的先生或女士感谢您的宝贵建议,我发现了错误,即在我的拉普拉斯部分代码中,第 21 行之后:我添加了以下内容:if(res(i, j)=0; } else { Lap_N.at(i, j)=(uchar)(res); } 并且成功了!!!
  • @R.Anush 知道那条线的作用吗?请不要叫我先生(顺便说一句,卢克是一个男人的名字:))
  • 抱歉很晚才回答,为了给您打电话,我添加的代码的 sn-p 将 res 的值(具有像素值的总和)映射到 0,如果它低于 0 ,否则将其强制转换为 uchar 类型。
  • 好的,这是另一种方法。谢谢你让我知道。 :D
猜你喜欢
  • 2019-02-02
  • 2023-03-24
  • 2011-04-28
  • 2021-02-26
  • 2011-02-02
  • 1970-01-01
  • 2020-07-05
  • 1970-01-01
相关资源
最近更新 更多