15.图像尺寸变换

目录

        1 概念讲解及用处

        2 函数详解

        3 插值方法讲解

​        3.1 最近邻插值(Nearest Neighbor Interpolation)

        3.2 双线性插值(Bilinear Interpolation)

        3.3 双立方插值(Bicubic Interpolation)

        4 代码实现

        1 概念讲解及用处

        图像尺寸变换是指改变图像的宽度和高度,即对图像进行缩放或放大操作。图像尺寸变换在图像处理和计算机视觉中非常常见,并具有广泛的应用。

        通过图像尺寸变换,可以调整图像的大小,从而实现图像的缩放、裁剪、放大等操作。图像尺寸变换通常用于预处理、特征提取、图像增强以及图像配准等任务。

        2 函数详解

        在OpenCV中,cv::resize()函数用于对图像进行尺寸变换。该函数有多种重载形式,可以根据不同的参数设置进行图像的缩放、裁剪、放大等操作。

        常见的cv::resize()函数形式如下:

void resize(
    InputArray src, // 输入图像
    OutputArray dst, // 输出图像
    Size dsize, // 目标尺寸
    double fx = 0, // x方向缩放比例
    double fy = 0, // y方向缩放比例
    int interpolation = INTER_LINEAR // 插值方法
);

        该函数接受一个输入图像src,并将变换后的图像存储在输出数组dst中。可以通过参数dsize指定目标尺寸,或者通过参数fx和fy指定x和y方向的缩放比例。

        此外,还可以通过参数interpolation指定插值方法,例如INTER_NEAREST、INTER_LINEAR、INTER_CUBIC等。

参数数字代号作用
INTER_NEAREST0最近邻插值
INTER_LINEAR1双线性插值
INTER_CUBIC2双三次插值
INTER_AREA3

使用像素面积关系重新采样。这可能是用于图像抽取的优选方法,如

它给出了无莫尔条纹的结果。但当图像被放大时,它类似于INTER_NEAREST

INTER_LANCZOS448x8邻域上的Lanczos插值
INTER_LINEAR_EXACT5位精确最近邻插值
INTER_MAX7用掩码进行插值

        3 插值方法讲解

​        3.1 最近邻插值(Nearest Neighbor Interpolation)

        最近邻插值是一种简单的插值方法,它根据原始图像中离目标位置最近的像素点的灰度值来确定新图像中对应位置的像素值。

        假设我们有一个原始图像如下所示:

原始图像

10 20 30 40
50 60 70 80
90 100 110 120
130 140 150 160

        现在我们要将该图像放大两倍,使用最近邻插值方法。放大后的图像尺寸为6x6,每个原始像素周围都有四个相邻的目标像素。

        对于每个目标像素,最近邻插值会选择与其最近的原始像素作为对应像素的值。因此,新图像的像素值如下所示:

放大后的图像

10 10 20 20 30 30
10 10 20 20 30 30
40 40 50 50 60 60
40 40 50 50 60 60
70 70 80 80 90 90
70 70 80 80 90 90

可以看到,每个目标像素的值被设置为其最近的原始像素的值。

        3.2 双线性插值(Bilinear Interpolation)

        双线性插值是一种比最近邻插值更精确的插值方法,它使用原始图像中相邻四个像素的灰度值进行加权平均,从而确定新图像中对应位置的像素值。

        与前面的例子相同,我们有一个原始图像:

原始图像

10 20 30
40 50 60
70 80 90

        现在我们要将该图像放大两倍,使用双线性插值方法。放大后的图像尺寸为6x6,每个原始像素周围都有四个相邻的目标像素。

        对于每个目标像素,双线性插值会使用其周围四个原始像素的值进行加权平均。具体而言,它根据目标像素相对于原始像素的位置,计算出其在水平和垂直方向上的权重,并将这些权重与对应原始像素的灰度值相乘,再进行累加。

        因此,新图像的像素值如下所示:

放大后的图像

10 15 20 25 30 35
25 30 35 40 45 50
40 45 50 55 60 65
55 60 65 70 75 80
70 75 80 85 90 95
85 90 95 100 105 110

        可以看到,双线性插值通过对相邻像素进行加权平均,获得了更平滑的图像。

        这就是最近邻插值和双线性插值的图示讲解。最近邻插值简单快速,但可能会引入锯齿状的伪像。双线性插值更精确,能够提供更平滑的图像效果。

        3.3 双立方插值(Bicubic Interpolation)

        双立方插值是一种更高级的插值方法,它使用原始图像中相邻16个像素的灰度值进行加权平均来确定新图像中对应位置的像素值。

        假设我们有一个原始图像如下所示:

原始图像

10 20 30 40
50 60 70 80
90 100 110 120
130 140 150 160

        现在我们要将该图像放大两倍,使用双立方插值方法。放大后的图像尺寸为8x8,每个原始像素周围都有16个相邻的目标像素。

        对于每个目标像素,双立方插值会使用其周围16个原始像素的值进行加权平均。具体而言,它根据目标像素相对于原始像素的位置,计算出其在水平和垂直方向上的权重,并将这些权重与对应原始像素的灰度值相乘,再进行累加。

        因此,新图像的像素值如下所示:

放大后的图像

10 15 19 23 27 31 35 40
30 35 39 43 47 51 55 60
50 55 59 63 67 71 75 80
70 75 79 83 87 91 95 100
90 95 99 103 107 111 115 120
110 115 119 123 127 131 135 140
130 135 139 143 147 151 155 160
150 155 159 163 167 171 175 180

        可以看到,双立方插值通过对相邻像素进行加权平均,获得了更平滑的图​像。

        4 代码实现

#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    // 读取图像
    cv::Mat image = cv::imread("image.jpg");

    // 目标尺寸
    int targetWidth = 400;
    int targetHeight = 300;

    // 进行尺寸变换
    cv::Mat resizedImage;
    cv::resize(image, resizedImage, cv::Size(targetWidth, targetHeight));

    // 显示变换后的图像
    cv::imshow("Resized Image", resizedImage);
    cv::waitKey(0);

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

别叭叭儿—好好学

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

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

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

打赏作者

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

抵扣说明:

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

余额充值