《数字图像处理基础》学习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:dimfor j = 1:nhfor k = 1:nwh1 = round(j/k1);w1 = round(k/k2);h1 = min(h1, h);w1 = min(w1, w);g(j, k, i) = f(h1, w1, i);endend
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.rhkb.cn/news/476495.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TabNet 模型示例

代码功能 加载数据&#xff1a;从 UCI Adult Census 数据集中读取样本&#xff0c;进行清洗和编码。 特征处理&#xff1a;对分类特征进行标签编码&#xff0c;对数值特征进行标准化。 模型训练&#xff1a;使用 TabNet 模型对数据进行分类训练&#xff0c;采用早停机制提高效…

一次封装,解放双手:Requests如何实现0入侵请求与响应的智能加解密

引言 之前写了 Requests 自动重试的文章&#xff0c;突然想到&#xff0c;之前还用到过 Requests 自动加解密请求的逻辑&#xff0c;分享一下。之前在做逆向的时候&#xff0c;发现一般医院的小程序请求会这么玩&#xff0c;请求数据可能加密也可能不加密&#xff0c;但是返回…

锂电池学习笔记(一) 初识锂电池

前言 锂电池近几年一直都是很热门的产品&#xff0c;充放电管理更是学问蛮多&#xff0c;工作生活中难免会碰到&#xff0c;所以说学习锂电池是工程师的必备知识储备&#xff0c;今天学习锂电池的基本知识&#xff0c;分类&#xff0c;优缺点&#xff0c;循序渐进 学习参考 【…

《Vue零基础入门教程》第四课: 应用实例

往期内容 《Vue零基础入门教程》第一课&#xff1a;Vue简介 《Vue零基础入门教程》第二课&#xff1a;搭建开发环境 《Vue零基础入门教程》第三课&#xff1a;起步案例 参考官方文档 https://cn.vuejs.org/api/application#create-app 示例 const {createApp} Vue// 通…

介绍一下strncmp(c基础)

strncmp是strcmp的进阶版 链接介绍一下strcmp(c基础)-CSDN博客 作用 比较两个字符串的前n位 格式 #include <string.h> strncmp (arr1,arr2,n); 工作原理&#xff1a;strcmp函数按照ACII&#xff08;字符编码顺序&#xff09;比较两个字符串。它从两个字符串的第一…

Lucene(2):Springboot整合全文检索引擎TermInSetQuery应用实例附源码

前言 本章代码已分享至Gitee: https://gitee.com/lengcz/springbootlucene01 接上文。Lucene(1):Springboot整合全文检索引擎Lucene常规入门附源码 如何在指定范围内查询。从lucene 7 开始&#xff0c;filter 被弃用&#xff0c;导致无法进行调节过滤。 TermInSetQuery 指定…

【电路笔记 TMS320F28335DSP】时钟+看门狗+相关寄存器(功能模块使能、时钟频率配置、看门狗配置)

时钟源和主时钟&#xff08;SYSCLKOUT&#xff09; 外部晶振&#xff1a;通常使用外部晶振&#xff08;如 20 MHz&#xff09;作为主要时钟源。内部振荡器&#xff1a;还可以选择内部振荡器&#xff08;INTOSC1 和 INTOSC2&#xff09;&#xff0c;适合无需高精度外部时钟的应…

java 并发编程 (1)java中如何实现并发编程

目录 1. 继承 Thread 类 2. 实现 Runnable 接口 3. 使用 FutureTask 4. 使用 Executor 框架 5. 具体案例 1. 继承 Thread 类 概述&#xff1a;通过继承 Thread 类并重写其 run() 方法来创建一个新的线程。 步骤&#xff1a; 创建一个继承 Thread 类的子类。重…

巧用观测云可用性监测(云拨测)

前言 做为系统运维或者开发&#xff0c;很多时候我们需要能够实时感知我们所运维的系统和服务的情况&#xff0c;比如以下的场景&#xff1a; 系统上线前测试&#xff1a;包括功能完整性检查&#xff0c;确保页面元素&#xff08;如图像、视频、脚本等&#xff09;都能够正常…

python oa服务器巡检报告脚本的重构和修改(适应数盾OTP)有空再去改

Two-Step Vertification required&#xff1a; Please enter the mobile app OTPverification code: 01.因为巡检的服务器要双因子认证登录&#xff0c;也就是登录堡垒机时还要输入验证码。这对我的巡检查服务器的工作带来了不便。它的机制是每一次登录&#xff0c;算一次会话…

Unreal从入门到精通之如何绘制用于VR的3DUI交互的手柄射线

文章目录 前言实现方式MenuLaser实现步骤1.Laser和Cursor2.移植函数3.启动逻辑4.检测射线和UI的碰撞5.激活手柄射线6.更新手柄射线位置7.隐藏手柄射线8.添加手柄的Trigger监听完整节点如下:效果图前言 之前我写过一篇文章《Unreal5从入门到精通之如何在VR中使用3DUI》,其中讲…

Win11 22H2/23H2系统11月可选更新KB5046732发布!

系统之家11月22日报道&#xff0c;微软针对Win11 22H2/23H2版本推送了2024年11月最新可选更新补丁KB5046732&#xff0c;更新后&#xff0c;系统版本号升至22621.4541和22631.4541。本次更新后系统托盘能够显示缩短的日期和时间&#xff0c;文件资源管理器窗口很小时搜索框被切…

【数据结构】【线性表】【练习】反转链表

申明 该题源自力扣题库19&#xff0c;文章内容&#xff08;代码&#xff0c;图表等&#xff09;均原创&#xff0c;侵删&#xff01; 题目 给你单链表的头指针head以及两个整数left和right&#xff0c;其中left<right&#xff0c;请你反转从位置left到right的链表节点&…

【赵渝强老师】MySQL的慢查询日志

MySQL的慢查询日志可以把超过参数long_query_time时间的所有SQL语句记录进来&#xff0c;帮助DBA人员优化所有有问题的SQL语句。通过mysqldumpslow工具可以查看慢查询日志。 视频讲解如下&#xff1a; MySQL的慢查询日志 【赵渝强老师】MySQL的慢查询日志 下面通过具体的演示…

基于docker进行任意项目灵活发布

引言 不管是java还是python程序等&#xff0c;使用docker发布的优势有以下几点&#xff1a; 易于维护。直接docker命令进行管理&#xff0c;如docker stop、docker start等&#xff0c;快速方便无需各种进程查询关闭。环境隔离。项目代码任何依赖或设置都可以基本独立&#x…

Android 分区相关介绍

目录 一、MTK平台 1、MTK平台分区表配置 2、MTK平台刷机配置表 3、MTK平台分区表配置不生效 4、Super分区的研究 1&#xff09;Super partition layout 2&#xff09;Block device table 二、高通平台 三、展锐平台 四、相关案例 1、Super分区不够导致编译报错 经验…

数据库类型介绍

1. 关系型数据库&#xff08;Relational Database, RDBMS&#xff09;&#xff1a; • 定义&#xff1a;基于关系模型&#xff08;即表格&#xff09;存储数据&#xff0c;数据之间通过外键等关系相互关联。 • 特点&#xff1a;支持复杂的SQL查询&#xff0c;数据一致性和完整…

当产业经济插上“数字羽翼”,魔珐有言AIGC“3D视频创作大赛”成功举办

随着AI技术的飞速发展&#xff0c;3D数字人技术已成为驱动各行各业转型升级的重要力量。在这一背景下&#xff0c;2024山东3D数字人视频创作大赛应运而生&#xff0c;并在一番激烈的角逐后圆满落幕&#xff0c;为科技与创意的交融写下浓墨重彩的一笔。 11月20日&#xff0c;一…

经济增长初步

1.人均产出 人均产出&#xff0c;通常指的是一个国家、地区或组织在一定时期内&#xff0c;每个劳动人口平均创造的生产总值。它是衡量一个地区或国家经济效率和劳动生产率的重要指标。具体来说&#xff0c;人均产出可以通过以下公式计算&#xff1a; 人均产出总产出/劳动人口…

图像增强夜视仪行业全面而深入的分析

图像增强夜视设备&#xff08;I2ND 或 INVD&#xff09;是一种增强监视、安全和军事应用的微光可见度的技术。 它允许用户在非常弱的光线甚至完全黑暗的条件下看到东西。 一、市场研究 1. 市场规模与增长趋势 据QYResearch调研团队最新报告&#xff0c;预计2029年全球图像增强…