【问题标题】: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);
}

【问题讨论】:

    标签: c++ opencv


    【解决方案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)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-21
      • 1970-01-01
      相关资源
      最近更新 更多