《数字图像处理基础》学习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%,则

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

相关推荐
Mephisto.java44 分钟前
【大数据学习 | Spark-Core】详解Spark的Shuffle阶段
大数据·学习·spark
南宫生1 小时前
力扣-位运算-3【算法学习day.43】
学习·算法·leetcode
xnuscd1 小时前
Milvus概念
数据库·学习·mysql
神秘的土鸡2 小时前
基于预测反馈的情感分析情境学习
学习
HABuo2 小时前
【数据结构与算法】合并链表、链表分割、链表回文结构
c语言·开发语言·数据结构·c++·学习·算法·链表
AI完全体3 小时前
【AI日记】24.11.25 学习谷歌数据分析初级课程-第6课
学习·数据分析
fa_lsyk3 小时前
mysql window安装(学习使用)
学习·mysql·adb
熬夜的猪4 小时前
现代安全密码哈希算法
java·学习·算法·安全·哈希算法
kuiini4 小时前
C 语言学习-06【指针】
c语言·学习