正确用于模糊过滤器的内核

Correct kernel for blur filter

本文关键字:内核 过滤器 模糊 用于      更新时间:2023-10-16

我试图使用自己的内核模糊图像(出于教育目的(。但是我的内核只是使我的整个图像变白。我的模糊内核正确吗?我相信我要应用的模糊过滤器的专有名称是一个归一化的模糊。

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);
}

您的图像不是白色,是浮动的。我确定您是否正在以后的位置显示imshow的图像,并且看起来全是白色的。这在imshow文档中进行了解释。具体:

如果图像为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);

此函数确实会饱和,因此它可能处理可能的溢出/下流。

3(使用另一个输出深度的filter2D

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

带有-1的欲望输出将为相同类型的源(我认为您的源是CV_8U(

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