模糊滤镜的正确内核
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) covertTo
uchar:
cv::Mat dst;
outputFromBlur.convertTo(dst, CV_8U);
此函数执行 saturate_cast,因此它可以处理可能的上溢/下溢。
3) 将filter2D
与另一个输出深度一起使用:
cv::filter2D(src, output, -1, kernel);
使用 -1 时,期望输出将与源的类型相同(我假设您的源是 CV_8U)
希望对您有所帮助,如果没有发表评论。
【讨论】:
以上是关于模糊滤镜的正确内核的主要内容,如果未能解决你的问题,请参考以下文章