插值,用于OpenCV中图像的平滑缩小

时间:2015-04-10 23:47:58

标签: c++ opencv

我注意到以下两种方法用于缩放图像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 个答案:

答案 0 :(得分:2)

这是因为OpenCV的线性插值实现相当简单。

线性插值的简单实现采用最接近插值点的四个像素的值并在它们之间进行插值。这可以用于放大,但是对于缩小,这将忽略许多像素的值 - 如果输出图像中有N个像素,则它取决于输入的最多4N像素。当比例因子的乘积低于0.25时,这不能给出好的结果。

正确的做法是在转换后考虑与输出像素对应的所有输入像素,并计算它们的平均值(或者更一般地,使用合适的重采样滤波器计算卷积)。

OpenCV似乎有一个名为cv::INTER_AREA的插值模式,可以做你想要的事情。