OpenCV4(C++)—— 图片的基本尺寸变换


一、resize(缩放)

void cv::resize(
    cv::InputArray src,          // 输入图像
    cv::OutputArray dst,         // 输出图像
    cv::Size dsize,              // 目标图像尺寸
    double fx = 0,               // 沿水平轴的缩放因子
    double fy = 0,               // 沿垂直轴的缩放因子
    int interpolation = INTER_LINEAR  // 插值方法
);

interpolation:插值方法,用于确定如何处理图像的像素值。常见的插值方法有:
cv::INTER_NEAREST:最近邻插值,使用离目标位置最近的像素值。
cv::INTER_LINEAR:双线性插值(默认),使用目标位置附近的四个像素值进行加权平均。
cv::INTER_CUBIC:双三次插值,在 INTER_LINEAR 基础上更加平滑,但计算成本更高。
cv::INTER_LANCZOS4:Lanczos 插值,通过 sinc 函数进行插值,可获得更好的质量和抗锯齿效果。

注:调整 dsize 参数或缩放因子 fx 和 fy 都可以控制图片大小变化,选择一个即可,另一个设定为0,如:

    cv::Mat out0, out1;
    cv::resize(img, out0, cv::Size(520, 520), 0, 0);  // 调整为520*520大小
    cv::resize(img, out1, cv::Size(0, 0), 0.5, 0.5);  // 调整为原图的0.5倍
    cv::resize(img, out1, cv::Size(0, 0), 0.5, 0.5);  // 调整为原图的2倍

二、filp(翻转)

void cv::flip(
    cv::InputArray src,          // 输入图像
    cv::OutputArray dst,         // 输出图像
    int flipCode                 // 翻转模式
);
常见的翻转模式有:
0:沿 x 轴翻转(水平翻转)。
1:沿 y 轴翻转(垂直翻转)。
-1:同时沿 x 和 y 轴翻转(水平和垂直翻转)。

//cv::Mat img_x, img_y, img_xy;
//cv::flip(img, img_x, 0); // 沿x轴
//cv::flip(img, img_y, 1); // 沿y轴
//cv::flip(img, img_xy, -1); // 中心对称

三、裁剪

在 OpenCV 中,裁剪的常用方式有两种:cv::Rect 或 数组索引 cv::Range。
cv::Rect是定义裁剪区域的左上角坐标 (x, y) 和区域的宽度和高度。cv::Range是指定行或列的范围,以及像素之间的步长

cv::Mat image = cv::imread("input.jpg");

int x = 100;  // 裁剪区域左上角的 x 坐标
int y = 100;  // 裁剪区域左上角的 y 坐标
int width = 200;  // 裁剪区域的宽度
int height = 150;  // 裁剪区域的高度

//1、使用cv::Rect
cv::Rect roi(x, y, width, height);
cv::Mat croppedImage = image(roi);
//2、使用数组索引
cv::Mat croppedImage = image(cv::Range(y, y + height), cv::Range(x, x + width));

通常,对一张图片进行裁剪时,采用的是网格裁剪的方法来固定每一小张裁剪图片的大小。下面是一个简单示例:

	cv::Mat img = cv::imread("C:/Users/Opencv/temp/lena.png", 0);
	
    int rows = 2;  // 网格行数
    int cols = 2;  // 网格列数
    int grid_w = img.cols / cols;  // 每个网格的宽度
    int grid_h = img.rows / rows;  // 每个网格的高度

    int n = 0;
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < cols; j++)
        {
            // 计算当前网格的左上角坐标
            int src_x = j * grid_w;
            int src_y = i * grid_h;

            // 裁剪当前网格
            cv::Rect roi(src_x, src_y, grid_w, grid_h);
            cv::Mat gridImg = img(roi);

            // 保存
            string filename = "grid_" + to_string(n) + ".png";
            cv::imwrite(filename, gridImg);
            ++n;
        }
    }

在这里插入图片描述

四、拼接

    cv::Mat img1 = cv::imread("C:/Users/Opencv/temp/grid_0.png",0);
    cv::Mat img2 = cv::imread("C:/Users/Opencv/temp/grid_1.png",0);
    cv::Mat img3 = cv::imread("C:/Users/Opencv/temp/grid_2.png",0);
    cv::Mat img4 = cv::imread("C:/Users/Opencv/temp/grid_3.png",0);
    cv::Mat out1, out2, out;

    cv::hconcat(img1, img2, out1);  // 横向拼接
    cv::hconcat(img3, img4, out2);
    cv::vconcat(out1, out2, out);  // 纵向拼接
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想要躺平的一枚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值