本文共 1930 字,大约阅读时间需要 6 分钟。
在图像处理过程中,有时需要将图像调整到相同大小,以便于后续处理,这时常常会使用图像 resize 函数。OpenCV 提供了 resize 函数,接下来将详细介绍其工作原理和使用方法。
函数定义为:
void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR)
Size(0, 0),则输出图像的大小根据 fx 和 fy 计算得出。INTER_NEAREST:最近邻插值(默认)INTER_LINEAR:线性插值INTER_AREA:区域插值INTER_CUBIC:三次样条插值INTER_LANCZOS4:Lanczos 插值如果 dsize 为 Size(0, 0),则输出图像的大小自动计算为:
dsize = Size(round(fx * src.cols), round(fy * src.rows))
注意:fx 和 fy 不能同时为 0,此时 dsize 将根据 fx 和 fy 计算得出。
默认情况下,缩放系数 fx 和 fy 可以通过以下公式计算:
fx = (double) dsize.width / src.cols;fy = (double) dsize.height / src.rows;
目标图像的每个像素点取其对应的最近邻原图像像素点的值。假设原图像大小为 (s_height, s_width),目标图像大小为 (d_height, d_width),则高度和宽度的缩放比例为:
h_ratio = s_height / d_height;w_ratio = s_width / d_width;
目标图像像素 (x, y) 的值等于原图像 (x * w_ratio, y * h_ratio) 处的值。
默认插值方式。在线性插值中,目标像素坐标可能不是整数值。例如,缩放后坐标为 (10.5, 20.5),则会取四个邻近像素点的值进行加权求和:
D(x, y) = S(j, k) * w1 + S(j+1, k) * w2 + S(j+1, k+1) * w3 + S(j, k+1) * w4
权值 w1, w2, w3, w4 根据坐标的小数部分计算得出。
区域插值在图像放大时类似于线性插值,在图像缩小时可以有效防止像素波纹的出现。这种插值方式在保持图像细节的同时,减少失真。
使用 4x4 邻域内像素进行双三次插值。这种方法在图像放大时可以有效保持细节。
使用 8x8 像素邻域进行 Lanczos 插值。这种插值方式在图像放大时能有效减小模糊,保持高质量。
以下是一个使用 resize 函数的示例:
#include#include int main(int argc, char* argv[]){ std::string path = ""; int resize_height = 256; int resize_width = 256; cv::Mat src = cv::imread(path); cv::Mat dst; cv::resize(src, dst, cv::Size(resize_width, resize_height), (0, 0), (0, 0), cv::INTER_LINEAR); // 依据实际需求调整交替参数 return 0;}
以上代码示例展示了如何使用 resize 函数将图像调整到指定大小,并使用线性插值方式。
resize 函数是 OpenCV 中常用的工具,适用于图像大小调整的场景。选择合适的插值方式能够显著影响最终图像质量,建议根据具体需求选择最优插值方法。
转载地址:http://ulsfk.baihongyu.com/