模糊滤镜的正确内核

Posted

技术标签:

【中文标题】模糊滤镜的正确内核【英文标题】:Correct kernel for blur filter 【发布时间】:2018-03-31 07:33:26 【问题描述】:

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

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】:

您的图像不是白色的,是浮动的。我相信你稍后会用imshow 显示图像,它看起来全是白色的。这在imshow documentation 中有解释。具体来说:

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

这意味着如果它是浮动的,它必须是 [0,1] 值才能正确显示。

现在,我们知道了它的原因,让我们看看如何解决它。我可以想到 3 种可能的方法:

1) normalize图片到[0,1]

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

此函数对值进行归一化,因此它可能会改变颜色...这不是已知图像的最佳选择,而是深度图或其他具有未知颜色值的矩阵。

2) covertTouchar:

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

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

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

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

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

希望对您有所帮助,如果没有发表评论。

【讨论】:

以上是关于模糊滤镜的正确内核的主要内容,如果未能解决你的问题,请参考以下文章

CoreImage 中的模糊滤镜

GPUImage 动画高斯模糊滤镜

高斯模糊滤镜反转:iOS

CSS滤镜filter

CSS删除一个孩子的模糊滤镜[重复]

iOS 5 是不是支持模糊核心图像滤镜?