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个像素)

最佳答案 这是因为OpenCV的线性插值实现相当简单.

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

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

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

点赞