OpenCV图像处理——图像缩放函数 resize
目录1. cv::resize() 介绍2. 插值方法(关键)3. 应用示例在某些情况下我们通常需要将图像转换成指定的大小这就需要调整图像尺寸。1. cv::resize() 介绍void cv::resize(InputArraysrc,OutputArraydst,Sizedsize,doublefx 0,doublefy 0,intinterpolation INTER_LINEAR)参数说明src——输入图像dst——输出图像其尺寸为 dsize(当 dsize 非零时)或由 src.size()、fx 和 fy 计算得出dst 的类型与 src 相同。dsize——输出图像大小dsize Size(round(fx*src.cols), round(fy*src.rows))。fx——沿水平轴的缩放因子当其为0时计算为(double)dsize.width/src.cols。fy——沿垂直轴的缩放因子当其为0时计算为(double)dsize.height/src.rows。interpolation——插值方法。2. 插值方法(关键)所谓插值(指内插值(interpolation),相对于外插值即外推(extrapolation))就是通过已有的像素去计算并得出需要填充的像素值。插值是图像大小调整的关键。原图像中的像素值位于一个整数网格上例如我们可以引用 (20,17) 处的像素。当这些整数位置映射到新的图像后可能存在间隙——因为原图像中的整数位置像素映射到了目标图像的浮点位置因此必须四舍五入到最近的整数位置或者因为映射后目标图像是空的没有像素填充(考虑双倍拉伸图像则新图像有一半的位置没有像素)。这些问题通常称为正向投影问题(forward projection problems)。为了处理这样一种舍入问题和目标图像间隙问题我们实际上是反向(backward)来解决这个问题的我们逐像素遍历目标图像的每一个像素并问“源图像中哪一个像素需要用于填充这个目标像素”这些源像素将会总是位于分数像素位置因此我们必须对源像素进行插值来推导出目标位置正确的像素值。该函数默认使用的方法是双线性(bilinear)插值(即一种基于双变量的插值方法)但你也可以选择其它插值方法。常用的插值方法有插值方法说明INTER_NEAREST最近领域插值INTER_LINEAR双线性插值INTER_CUBIC双三次插值(bicubic)INTER_AREA基于像素面积关系的重采样。对于图像抽取(下采样)而言这可能是一种首选方法因为它能产生无Moiré条纹的结果。但在对图像进行放大时其效果与 INTER_NEAREST 方法相似INTER_LANCZOS4基于8x8领域的Lanczos插值INTER_LINEAR_EXACTINTER_NEAREST_EXACT位精确双线性插值INTER_MAX插值代码掩码插值WARP_FILL_OUTLIERS该标志会填充目标图像的所有像素。如果其中某些像素对应于源图像中的离群点(outliers)则会被置为零。WARP_INVERSE_MAP逆变换标识例如linearPolar 或 logPolar 变换填充目标图像最简单的方法就是取源图像中最近像素的值这就是选择INTER_NEAREST能达到的效果。3.应用示例(1)用宽度和高度调整图像voidTest_resize(){// Load the imagecv::Matimage cv::imread(D:\\TestVideo\\Flower6-2.jpg);// Define new width and heightintnew_width 600;intnew_height 400;// Create an empty Mat object for the resized imagecv::Matresized_image;// Resize the imagecv::resize(image, resized_image, cv::Size(new_width, new_height));// Display the resized imagecv::imshow(Resized Image, resized_image);cv::waitKey(0);}(2)按长宽比缩放(aspect ratio)voidTest_resize(){// Load the imagecv::Matimage cv::imread(D:\\TestVideo\\Flower6-2.jpg);// Get the original dimensionsintoriginal_width image.cols;intoriginal_height image.rows;// Define new width while maintaining the aspect ratiointnew_width 2000;doubleaspect_ratio static_castdouble(new_width) / original_width;intnew_height static_castint(original_height * aspect_ratio);// Compute height based on aspect ratio// Create an empty Mat object for the resized imagecv::Matresized_image;// Resize the imagecv::resize(image, resized_image, cv::Size(new_width, new_height));// Display the resized imagecv::imshow(Resized Image, resized_image);cv::waitKey(0);}(3)利用 fx 和 fy 参数来对图像进行缩放与其手动指定宽度和高度我们可以利用 fx 和 fy 参数来对图像进行缩放。将 fx 设置为等于 fy即可确保保持图像的纵横比。voidTest_resize(){// Load the imagecv::Matimage cv::imread(D:\\TestVideo\\Flower6-2.jpg);// Scaling factorsdoublescale_down 0.8;doublescale_up 1.2;// Create Mat objects for the resized imagescv::Matresized_down, resized_up;// Resize the image (scaling down)cv::resize(image, resized_down, cv::Size(), scale_down, scale_down, cv::INTER_LINEAR);// Resize the image (scaling up)cv::resize(image, resized_up, cv::Size(), scale_up, scale_up, cv::INTER_LINEAR);// Display the imagescv::imshow(Original Image, image);cv::imshow(Scaled Down Image, resized_down);cv::imshow(Scaled Up Image, resized_up);cv::waitKey(0);}