插值用于在 OpenCV 中平滑缩小图像
interpolation for smooth downscale of image in OpenCV
我注意到,在下面两种将图像缩放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的线性插值实现相当简单。
线性插值的简单实现采用最接近插值点的四个像素的值,并在它们之间进行插值。这对于放大是可以的,但是对于缩小,这将忽略许多像素的值 - 如果输出图像中有 N 个像素,则它取决于输入的最多 4N 个像素。当比例因子的乘积低于 0.25 时,这不能给出良好的结果。
正确的做法是考虑转换后与输出像素对应的所有输入像素,并计算它们的平均值(或者更一般地说,使用合适的重采样滤波器计算卷积)。
OpenCV似乎有一个名为cv::INTER_AREA
的插值模式,它应该做你想要的事情。
相关文章:
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 我无法缩小此分段错误的原因
- 将stl字符串缩小到小于15个字符的容量
- OpenGL 和 GLM 矩阵无法正确扩展,总是按比例缩小
- 奇怪的缩小转换在 g++ 编译器中加倍到浮点警告
- 如何在不强制转换每个参数的情况下删除初始值设定项列表中从 int 到 char 的缩小转换?
- 将向量从 N1 缩小到 N2 项,而不触发默认构造函数并仅使用 move 语义
- std::map, std::unordered_map - 缩小初始值设定项列表中的转换范围
- 为什么显式构造被视为(隐式)缩小转换?
- 为什么C++在将浮点数转换为字符时没有显示缩小转换错误?
- glpointsize() 无法缩小点
- 根据帧速率缩放/缩小数字
- 使用具有设置延迟C++的mouse_event平滑鼠标移动
- SDL/C++: 如何平滑但随机地移动矩形?
- 错误:在 { } [-缩小] 中将"199"从"int"到"char&
- C(嵌入式):注释 FreeRTOS 的 RootTask 时代码大小不会缩小
- 缩小从double到float的转换
- 为什么 gcc 警告只针对统一初始化缩小转换范围?
- 使用 SDL2 平滑网格移动?
- 插值用于在 OpenCV 中平滑缩小图像