《数字图像处理基础》学习06-图像几何变换之最邻近插值法缩小图像

目录

一,概念

二,题目

三,matlab实现


对图像进行几何变换时,都是对数字图像进行处理。由于在matlab中使用imread函数读取的图像通常已经是数字图像,因此不需要进行额外的采样和量化等操作,就可以将图像拿来使用,直接对读取的图像进行操作(一般是将图像矩阵赋值给一个变量)。

图像的缩小有两种:

  1. 按比例缩小:图像的高 和宽 按照相同的比例缩小,

    又称为全比例缩小。

  2. 不按比例缩小:图像的高 和宽 不按照相同的比例缩小,

    图像的的比例缩小(或放大)会改变原始图像像素间的相对位置,产生几何畸变。

    几何畸变(几何变形):变换后的图像与原始图像特征不一致。

数字图像的缩小实际上就是减少像素的个数,从而使得图像的尺寸(即分辨率)变小。

在将图像进行比例缩小时,如果图像中的像素在原始图像中没有相对应的像素点时,就需要进行灰度值的插值运算。一般有如下两种插值处理方法:

  1. 最邻近插值法:直接赋值为和它(像素点)最相近的像素灰度值。
  2. 双线性插值法:进行两次一维线性插值,以此获得二维图像信息中的某一个估计的像素值。

这篇文章主要学习使用最邻近插值法来缩小图像。 最邻近插值法的算法相对简单且代码量少,(就我已知)唯一的缺点就是没有被选取到的像素点的信息无法反映到缩小后的图像中。

【ps:这个缺点因对图像的要求而异,如果要求不高的话,最邻近插值法就是个不错的选择。】

一,概念

最邻近插值法的基本思想是根据已知像素点 找到离目标位置最近且已知像素点

,并将该像素点的值(即像素值) 赋给目标位置 。

假设原始图像的大小为 (高 宽 ),现在需要将其缩小为

其中: 是高的缩小倍数。 是宽的缩小倍数。

由于像素间距与采样间隔和缩放倍数之间的关系如下:

假设在原始图像中,采样间隔为 (例如,d=1 mm),并且图像被缩小了 倍() 那么缩小后的像素间距 可以表示为:

🚗

因此图像高和宽的像素间距分别如下(默认采样间隔 ):

  • 图像高的像素间距:
  • 图像宽的像素间距:

则,缩小后的图像 的表达式如下:

二,题目

下面是一个简单的例子。给出一个原图像矩阵 大小为 ,将其缩小:

  1. 高(行)缩小的倍数为
  2. 宽(列)的缩小倍数为

求对其缩小后的图像矩阵 。

(一般来说,图像矩阵信息不会那么少,这里主要是为了方便计算,信息就少了些,如果信息少的会做,信息多的图像就可以借助工具来进行分析。)

++解:++

由于高宽缩小的倍数分别为 0.7 和 0.6 ,且原图像的大小为 (高 4 宽 6)因此压缩后

得到图像矩阵g:

高=;

宽= 。

可知,新得到的图像矩阵 大小为 。

再根据缩小倍数,可得采样间隔:

垂直方向上(高)的采样间隔

水平方向上(宽)的采样间隔

利用之前分析出来的求结果图像矩阵元素的等式:

此时的矩阵g第一个元素(像素值)可以用位于原图像矩阵第一行第二列的元素(像素值)赋值

即:

剩下的像素值也可以用一样的计算方法得到,如下👇

-- 由于 超出了原始图像矩阵:像素点 中的 比原始矩阵的列数(宽)

大,因此,需要在两者中取最小的那一个,即 令 。

最终:

此时图像矩阵 如下:

由于图像矩阵 的列最多只有 列,因此,接下来开始第二行:

-- 和 同理,最终:

此时图像矩阵 如下:

剩下的最后一行数据和前两行一样的计算过程,这里不赘诉。最后得到的图像矩阵 如下:

三,matlab实现

使用matlab编写代码和上面的分析过程一样,也是需要注意在计算过程中,像素点位置不能超出原始图像(即,需要使用到min函数来取到最小值)。

按比例缩小👇

不按比例缩小👇

观察上图,可以看到,不按比例缩小图像,会改变原始图像像素间的相对位置,产生几何畸变。接下来以不按比例缩小图像为例:

因为matlab是按照它自己的物理显示界面来让图像最大的填充,分辨率小的图像在同样的物理显示下,会更模糊,因为当屏幕的面积不变,而图像的分辨率变小,在让图像填充屏幕时,每一个像素所占的面积会变大(像素变大,在较大的范围内像素值都一样,看起来就像是一个一个的方块),图像变得更模糊。(反之,分辨率越高,像素越小,图像越细腻,图像就越清晰) 。

如果觉得光看分辨率的大小还是不能确定图像是否真的被缩小,可以将缩小后的图像保存:

使用函数:imwrite(存储图像缩小后的变量, '图像保存的本地路径+图像名'); 如下👇

Matlab 复制代码
imwrite(g, 'D:\myMatlab\img\01reduced_image.jpg');

之后到图像保存的本地路径,使用"照片"的打开方式分别打开原图像和缩小后的图像↓

代码

Matlab 复制代码
% 最邻近插值法将图像缩小
clear all,clear,clc;
f = imread('lena_color_256.tif'); 
figure;
subplot(121);
imshow(f);
title(['分辨率为:',num2str(size(f,1)),'×',num2str(size(f,2)),'的原图像']);
k1 = 0.7;
k2 = 0.6; 
[h, w, dim] = size(f);
nh = round(h * k1);
nw = round(w * k2);
g = zeros(nh, nw, dim, 'uint8');
for i = 1:dim
    for j = 1:nh
        for k = 1:nw
            h1 = round(j/k1);
            w1 = round(k/k2);
            h1 = min(h1, h);
            w1 = min(w1, w);
            g(j, k, i) = f(h1, w1, i);
        end
    end
end
subplot(122);
imshow(g);
title(['分辨率为:',num2str(size(g,1)),'×',num2str(size(g,2)),'的缩小图像']);
%imwrite(g, 'D:\myMatlab\img\01reduced_image.jpg');

其中:

Matlab 复制代码
g = zeros(nh, nw, dim, 'uint8');

是创建高(行为) ,宽(列为) ,颜色通道数为 及变量类型为 的矩阵变量 。

关于zeros函数的官方解释如下:

如果在创建矩阵变量 时,不指定变量类型,后面使用imshow函数显示成图像前,需要调用uint8函数:

如果想要图像按比例缩小,修改代码中的 就行。例如想要让图像按比例缩小到原来的50%,则。

有问题请在评论区留言或者是私信我,回复时间不超过一天。

相关推荐
阳光九叶草LXGZXJ7 小时前
达梦数据库-报错-16-MERGE INTO提示:无效的列名[XX]
linux·运维·数据库·sql·学习
xxwl5857 小时前
RabbitMQ 学习笔记
笔记·学习·rabbitmq
李日华大战鸡红9 小时前
滑膜观测器(学习记录)
stm32·单片机·学习·matlab·机器人
传奇开心果编程10 小时前
【现代声明式UI学与练】第4课 列表渲染与 key——如何高效渲染列表、key 的作用、列表重排时的状态保持
学习·flutter·react native·ui·swiftui·android jetpack
传奇开心果编程10 小时前
【Compose Multiplatform 跨端开发学与练】第5课 网络与数据层
android·网络·学习·ui·ios·kotlin·composer
指针向南10 小时前
MP4索引怎样影响边下边播
图像处理·人工智能·计算机视觉
yt004yt10 小时前
园区 VOC 绿岛集中治理项目,管网与监测系统设计要点
大数据·学习
一条破秋裤11 小时前
06_从设备读数据_字符设备read_write流程
学习
m4Rk_11 小时前
【论文阅读】Agent 记忆机制(92):EMPO²——让 Memory 从经验复用走向主动探索
论文阅读·人工智能·学习·开源·github
欣欣之王来了12 小时前
前端开发学习路线图:2026年Vue方向最新版
前端·学习·架构·项目·vue3教程