校正内核的模糊过滤器

时间:2018-03-31 07:33:26

标签: c++ opencv

我正在尝试使用自己的内核来模糊图像(出于教育目的)。但我的内核只是让我的整个图像变白。我的模糊内核是否正确?我相信我尝试应用的模糊滤镜的正确名称是标准化模糊。

void blur_img(const Mat& src, Mat& output) { 
    // src is a 1 channel CV_8UC1

    float kdata[] = { 0.0625f, 0.125f, 0.0625f,   0.125f, 0.25f, 0.125f, 0.0625f, 0.125f, 0.0625f };
    //float kdata[] = { -1,-1,-1,  -1,8,-1,  -1,-1,-1}; // outline filter works fine
    Mat kernel(3, 3, CV_32F, kdata);

    // results in output being a completely white image
    filter2D(src, output, CV_32F, kernel);
}

1 个答案:

答案 0 :(得分:0)

你的图像不是白色的,是浮动的。我相信你在以后的地方用imshow显示图像,它看起来都是白色的。这在imshow documentation中有解释。具体做法是:

  

如果图像是32位浮点,则像素值相乘   也就是说,值范围[0,1]被映射到[0,255]。

这意味着如果它是浮点数,则必须正确显示[0,1]值。

现在,我们知道是什么导致它,让我们看看如何解决它。我可以想到3种可能的方式:

1) normalize图片为[0,1]

cv::Mat dst;
cv::normalize(outputFromBlur, dst, 0, 1, cv::NORM_MINMAX);

此函数将值标准化,因此它可能会移动颜色......这不是已知图像的最佳颜色,而是深度图或其他具有未知颜色值的矩阵。

2) covertTo uchar:

cv::Mat dst;
outputFromBlur.convertTo(dst, CV_8U);

此函数执行saturate_cast,因此它可以处理可能的上溢/下溢。

3)filter2D与另一个输出深度一起使用:

cv::filter2D(src, output, -1, kernel);

使用-1时,欲望输出将与源的类型相同(我假设您的源是CV_8U)

如果不发表评论,我希望这会对你有所帮助。