gpt4 book ai didi

c++ - 在 OpenCV 中平滑缩小图像的插值

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:09:23 29 4
gpt4 key购买 nike

我注意到在下面两种将图像缩放 N 一半的方法中,第一种产生的图像更平滑,看起来更吸引眼球。

    while (lod-- > Payload->MaxZoom)
{
cv::resize(img, img, cv::Size(), 0.5, 0.5, cv::INTER_LINEAR);
}

对比

    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 的线性插值实现相当简单。

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

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

OpenCV 似乎有一个名为 cv::INTER_AREA 的插值模式,它应该可以完成您想要的事情。

关于c++ - 在 OpenCV 中平滑缩小图像的插值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29572347/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com