OpenCV中图像的平滑缩小插值

4
我注意到以下两种方法都可以将一个图像缩小N倍,但第一种方法会产生更平滑的图像,看起来更加美观。
    while (lod-- > Payload->MaxZoom)
    {
        cv::resize(img, img, cv::Size(), 0.5, 0.5, cv::INTER_LINEAR);
    }

vs

    double scale = 1.0 / (1<< (lod - Payload->MaxZoom));
    cv::resize(img, img, cv::Size(), scale, scale, cv::INTER_LINEAR);

我想知道是否有一种插值方法可以产生类似于第一次调整大小的结果,但不必循环N次。任何关于为什么在多个步骤中进行调整大小可以产生更好结果的数学见解也很有趣。后面的方法(当N=5时)会产生非常像素化的结果,而第一种方法则非常平滑(这是有意义的,因为它是N步中4个像素的平均值)。
1个回答

4
这是因为OpenCV实现的线性插值比较简单。简单的线性插值实现需要使用距离插值点最近的四个像素值进行插值。这对于上采样来说还可以,但对于下采样来说,这会忽略许多像素的价值——如果输出图像中有N个像素,则最多只依赖于输入的4N个像素。当缩放因子乘积小于0.25时,这无法产生好的结果。
正确的做法是考虑所有与变换后的输出像素对应的输入像素,并对它们进行平均(或更一般地,用适当的重采样滤波器进行卷积)。
OpenCV似乎有一个名为cv::INTER_AREA的插值模式,这应该是你想要的东西。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接