当前位置: 首页 > article >正文

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

目录

一,概念

二,题目

三,matlab实现 


 

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

图像的缩小有两种: 

  1. 按比例缩小:图像的高 h 和宽 w 按照相同的比例缩小,k1=k2(k1<1,k2<1)

    又称为全比例缩小。
     
  2. 不按比例缩小:图像的高 h 和宽 w 不按照相同的比例缩小,k1\neq k2(k1<1,k2<1)

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

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

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

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

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

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

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

一,概念

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

(i\times \Delta i,j \times \Delta j),并将该像素点的值(即像素值) f(i\times \Delta i,j \times \Delta j) 赋给目标位置 g(i,j)

假设原始图像的大小为 M\times N (高 M 宽 N ),现在需要将其缩小为k1\cdot M\times k2\cdot N

其中:k1 是高的缩小倍数。k2 是宽的缩小倍数。(k1,k2<1)

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

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

🚗 \Delta i=\frac{d}{k}

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

  • 图像高的像素间距:\Delta i=\frac{1}{k1}
  • 图像宽的像素间距:\Delta j=\frac{1}{k2}

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

g(i,j)=f(i\times \Delta i,j \times \Delta j)

二,题目

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

  1. 高(行)缩小的倍数为 k1=0.7
  2. 宽(列)的缩小倍数为 k2=0.6 

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

f=\begin{bmatrix} f11 & f12 & f13 & f14 & f15 & f16 \\ f21 & f22 & f23 & f24 & f25 & f26 \\ f31 & f32 & f33 & f34 & f35 & f36 \\ f41 & f42 & f43 & f44 & f45 & f46 \end{bmatrix}

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

解: 

由于高宽缩小的倍数分别为 0.7 和 0.6 ,且原图像的大小为 4\times 6  (高 4 宽 6)因此压缩后
得到图像矩阵g:
高=4\times 0.7=2.8\approx 3

宽=6\times 0.6=3.6\approx 4 。

可知,新得到的图像矩阵 g 大小为 3\times 4

g=\begin{bmatrix} 0 &0 &0 &0 \\ 0& 0 & 0 &0 \\ 0&0 &0 &0 \end{bmatrix}

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

垂直方向上(高)的采样间隔 \Delta i=\frac{1}{k1}=\frac{1}{0.7}\approx 1.4

水平方向上(宽)的采样间隔 \Delta j=\frac{1}{k2}=\frac{1}{0.6}\approx =1.7

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

g(i,j)=f(i\times \Delta i,j\times \Delta j)

g(1,1)=f(1\times \Delta i,1\times \Delta j)=f(1\times1.4,1 \times 1.7)=f(1.4,1.7)\approx f(1,2)

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

即:

g(1,1)=f12

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

g(1,2)=f(1\times1.4,2\times 1.7)=f(1.4,3.4)\approx f(1,3)=f13

g(1,3)=f(1\times1.4,3\times 1.7)=f(1.4,5.1)\approx f(1,5)=f15

g(1,4)=f(1\times1.4,4\times 1.7)=f(1.4,6.8)\approx f(1,7)=f17

-- 由于 f17 超出了原始图像矩阵:像素点 (1,7) 中的 j=7=width  比原始矩阵的列数(宽)

j=6=width  大,因此,需要在两者中取最小的那一个,即 令 j=min(6,7)=6

最终:g(1,4)=f16

此时图像矩阵 g 如下:


g=\begin{bmatrix} f12 &f13 &f15 &f16 \\ 0& 0 & 0 &0 \\ 0&0 &0 &0 \end{bmatrix}

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

g(2,1)=f(2\times1.4,1\times 1.7)=f(2.8,1.7)\approx f(3,2)=f32

g(2,2)=f(2\times1.4,2\times 1.7)=f(2.8,3.4)\approx f(3,3)=f33

g(2,3)=f(2\times1.4,3\times 1.7)=f(2.8,5.1)\approx f(3,5)=f35

g(2,4)=f(2\times1.4,4\times 1.7)=f(2.8,6.8)\approx f(3,7)=f37

--      g(2,4) 和 g(1,4) 同理,最终:g(2,4)=f36

此时图像矩阵 g 如下:
g=\begin{bmatrix} f12 &f13 &f15 &f16 \\ f32&f33 &f35 &f36 \\ 0&0 &0 &0 \end{bmatrix}

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

g=\begin{bmatrix} f12 & f13 & f15& f16\\ f32& f33&f35 &f36 \\ f42&f43 & f45& f46 \end{bmatrix}

三,matlab实现 

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

 按比例缩小👇 

 不按比例缩小👇 

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

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

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

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

imwrite(g, 'D:\myMatlab\img\01reduced_image.jpg');

 

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

代码

% 最邻近插值法将图像缩小
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');

其中:

g = zeros(nh, nw, dim, 'uint8');

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

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

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

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

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


http://www.kler.cn/a/406095.html

相关文章:

  • ABAP开发-CO的底层表-物料价格分析CKM3
  • 推荐一款专业电脑护眼工具:CareUEyes Pro
  • 【软考】系统架构设计师-信息系统基础
  • OBOO鸥柏车载广告屏:28.6寸液晶一体机的技术革新与应用前景
  • 小米C++ 面试题及参考答案上(120道面试题覆盖各种类型八股文)
  • 无人机与低空经济:开启新质生产力的新时代
  • C语言:strcpy
  • OpenCV和Qt坐标系不一致问题
  • window 中安装 php 环境
  • 云高性能计算 CHPC :基因研究的加速器(二)使用Docker工作流示例
  • PID多变量解耦控制
  • Spring Boot3.x自动配置不生效的排查与解决:IDEA 文件夹命名导致的问题
  • 大数据学习17之Spark-Core
  • wordpress二开-WordPress新增页面模板-说说微语
  • 深入理解TensorFlow中的形状处理函数
  • 鸿蒙MVVM模式介绍与使用
  • 数字IC后端笔试面试题库 | 经典时序Timing计算题
  • 解决复杂查询难题:如何通过 Self-querying Prompting 提高 RAG 系统效率?
  • 如何创建软件设计文档(+方法步骤)
  • Admin.NET框架前端由于keep-alive设置缓存导致的onUnmount未触发问题
  • C:mbedtls库实现https双向认证连接示例_七侠镇莫尛貝大侠20241122
  • Linux的基础开发工具
  • dockerfile构建Nginx镜像练习二(5-2)
  • 代码随想录第三十八天
  • Pulid:pure and lightning id customization via contrastive alignment
  • 华为HCCDA云技术认证--数据库服务