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

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

目录

一,概念

二,题目及matlab实现

1,解题思路

2,matlab实现 

1)matlab思路

2)完整代码

三,放大图像及matlab实现 


一,概念

通过上一篇,我已经学习了使用最邻近插值法来缩小图像

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

依旧需要使用到如下公式(因为在上一篇文章已经学习过,所以这里不赘诉):

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

和使用最邻近插值法缩小图像不同。如果要使用最邻近插值法放大图像,则需要将原始图像的每行 i 和每列 j 都乘上对应的放大倍数  k ,得到原始图像中像素值的像素点(即像素值的坐标)的最大分布。

例如,有一个原始图像矩阵 f 尺寸大小为 M\times N,将其放大 k1 \times k2 倍 ,可得到尺寸大小为 k1 \cdot M\times k2 \cdot N 的放大图像矩阵 g

接着将原始图像矩阵的第一个元素的坐标(i,j),分别乘上对应的放大倍数(如果是非等比例放大则k有两个不同的取值:k1 和 k2 ),此时原始图像第 1 行第 1 列的像素值会跑到放大图像的第

1 \times k1 行第1 \times k2 列,并且放大图像从  1 \rightarrow 1 \times k1 行 及1 \rightarrow 1 \times k2 列之间的像素值都用原始图像的第 1 行第 1 列的像素值来填充。如果放大倍数是小数,则计算后按照四舍五入法取值。接下来可以通过题目来加深使用最邻近插值法放大图像的具体过程。

二,题目及matlab实现

下面是一个简单的例子。给出一个原始图像矩阵 f  大小为 3\times 3 

f=\begin{bmatrix} 1 & 4&7 \\ 2& 5 & 8\\ 3& 6 &9 \end{bmatrix}

将其放大:

  1. 高(行)放大的倍数为 k1=1.2
  2. 宽(列)的放大倍数为 k2=2.5 

求对其放大后的图像矩阵 g

% 可以试着先自己做一做,如果解出来的g如下:

g=\begin{bmatrix} 1 & 1 & 1 & 4 & 4 & 7 & 7 & 7 \\ 2 & 2 & 2 & 5 & 5& 8 & 8 & 8 \\ 3 & 3 & 3 & 6 & 6 & 9 & 9 & 9 \\ 3 & 3 & 3 & 6 & 6 & 9 & 9 & 9 \\ \end{bmatrix}

则思路正确,直接用自己的思路编写matlab程序去处理读取的图像,下面的解题思路可以选择跳过。

1,解题思路

从之前的概念中就已经可以用手算出g。

例如:

  1. 首先根据放大原始图像 f 的行列倍数创建一个放大后的图像矩阵 g 

  2. 原始图像 f 第 1 行第 1 列的像素值会跑到放大图像 g 的第 1 行第1 \times k2=1 \times 2.5 \approx3 列,并且放大图像 g 从  1 \rightarrow 1 行 及1 \rightarrow3 列之间的像素值都用原始图像 f 的第 1 行第 1 列的像素值来填充,如下👇

  3. 原始图像 f 第 1 行第 2 列的像素值会跑到放大图像 g 的第 1 行第5 列,并且放大图像 g 从  1 \rightarrow 1 行 及4 \rightarrow5 列之间的像素值都用原始图像的第 1 行第 2 列的像素值来填充,如下👇

    可以看到,填充 g 时的起始位置跟上一次的填充的列结束位置有关,例如,上一次的填充在 j=3 结束,那么这一次的填充从 j+1=4 开始,一直填充到 j=5 为止。原始图像 f 第 1 行第 3 列的像素值操作一样。

  4. 原始图像 f 第 2 行第 1 列的像素值会跑到放大图像 g 的第 2 行第3 列,并且放大图像 g 从  2 \rightarrow 2 行 及1 \rightarrow3 列之间的像素值都用原始图像的第 2 行第 1 列的像素值来填充,如下👇

    可以看到,填充 g 时的起始位置跟上一次的填充的行结束位置有关,例如,上一次的填充在 i=1 结束,那么这一次的填充从 i+1=2 开始,一直填充到 i=2 \times 1.2=2.4 \approx 2  为止。

  5. 后面的操作类似,这里不赘诉,最后得到的放大矩阵g如下👇

2,matlab实现 

1)matlab思路

在通过解题思路中,可以看到在填充过程中,不变的是原始图像矩阵中的每一个像素放大后的对应像素点(像素的坐标,i,j),因此, 读取图像形成矩阵 f 和产生全零的放大矩阵 g 之后,可以先将原始图像矩阵的每一行每一列放大后在放大图像矩阵中的位置分别用数组存储起来:

  • 数组 ia ,存储原始图像矩阵的每一行放大后在放大图像矩阵中的最大位置。
  • 数组 ja,存储原始图像矩阵的每一列放大后在放大图像矩阵中的最大位置。

虽然matlab在声明一维数组时可以不用声明一维数组的类型及指定一维数组的大小,但至少得有一个数组元素。例如,ia=[1];  % 数组ia中有一个元素 1

 于是,需要在matlab中写下如下语句,创建数组ia和数组ja:

ia=[1];  %之所以给定元素1,是因为在matlab中索引是从1开始,不管是遍历原始图像矩阵的行列,还是填充放大图像矩阵的行列,它们的第一个元素的行都是从1开始,列也是从1开始,即第一个元素的坐标为(1,1)
ja=[1];
for i=1:h  % 原始图像的高(行数)ia(end+1)=round(i*k1)+1;  % 创建存储原始图像矩阵的每一行放大后在放大图像矩阵中的最大位置的数组
% ia(end+1)可以在数组ia的已有元素末尾添加新的数组元素
end
for j=1:w % 原始图像的宽(列数)ja(end+1)=round(j*k2)+1;  % 创建存储原始图像矩阵的每一列放大后在放大图像矩阵中的最大位置的数组
end

 上述创建数组的代码也可以简化成如下形式(如果后面嵌套多的话就需要用到简化)👇:

ia = round((0:h) * k1) + 1;  
% 之所以要加1,是因为原始图像矩阵在当前行或列在放大时,得到的就是在放大图像矩阵中的最大位置
% 而下一个填充的行或列的填充位置需要上一个位置加1,为了方便起见,都将结果加1,之后遍历的时候再进行相应的处理。
ja = round((0:w) * k2) + 1;

接下来就开始遍历原始图像矩阵,为了后期让这个代码也可以应用到图像处理中,因此,还需要加上用来遍历像素值的颜色通道变量 c(在获取原始图像矩阵 f 时,获取到该图像的颜色通道数dim,之后在创建放大图像矩阵 g 时,也需要传入颜色通道数 dim)。像给出的题目中的图像矩阵 f 很简单,所以也不包含颜色,不是彩色图像,因此,是灰度图像,它的颜色通道数 dim=1

我通过最邻近插值法的相关概念和解题思路,可以知道,放大图像被填充的像素值与上一次的填充有关,而相关的坐标已经用数组 ia 和 ja 存储:

  1. 例如:原始图像 f 只有两行,所产生的数组ia只有3个元素:1;1*k1+1;2*k1+1。数组ja也只有三个元素:1;1*k2+1;2*k2+1。
  2. 如果想要遍历整个数组ia,只需要循环两次就行,因为通过观察,可以发现遍历数组ia 和 ja 的循环次数分别与原始图像矩阵的行数和列数一样。
  3. 我一般喜欢按照将变量名命名成与之相关的其它变量。例如,如果想要遍历原始图像 f 的行 h ,我就会用 fi 表示原始图像 f 的每一行。fj 表示原始图像 f 的每一列。
  4. 在填充的过程中,放大图像 g 的像素值的行 gi 和列 gj 都会变化:起始位置对应数组的当前元素,结束位置为对应数组的下一个元素的值减一。
    【可以自己选择带入个别的值来验证】

根据上述写出的代码如下👇

for c=1:dimfor fi=1:hfor fj=1:wfor gi=ia(fi):ia(fi+1)-1for gj=ja(fj):ja(fj+1)-1g(gi,gj,c)=f(i,j,c);endendendend
end

由于嵌套过多,会导致运算出现问题,因此,可以将最里面的两个循环语句简化,如下:

for c = 1:dimfor fi = 1:hfor fj = 1:wg(ia(fi):(ia(fi+1)-1), ja(fj):(ja(fj+1)-1), c) = f(fi,fj,c);endend
end

2)完整代码

clear all; clear; clc;% 清空工作空间
f = [1, 4, 7; 2, 5, 8; 3, 6, 9];   
[h,w,dim] = size(f);
k1 = 1.2;  
k2 = 2.5;
nh = round(k1 * h);
nw = round(k2 * w);  
g = zeros(nh, nw, dim, 'uint8'); 
ia = round((0:h) * k1) + 1;
ja = round((0:w) * k2) + 1;
for c = 1:dimfor fi = 1:hfor fj = 1:wg(ia(fi):(ia(fi+1)-1), ja(fj):(ja(fj+1)-1), c) = f(fi,fj,c);endend
end
% 显示结果
disp('输入矩阵 f:');
disp(f); 
disp('输出矩阵 g:');
disp(g);

运行后的结果和之前通过做题得到的结果一样:

三,放大图像及matlab实现 

clear all; clear; clc; % 清空工作空间
f = imread('01.jpg');  
[h,w,dim] = size(f);
k1 = 1.2;  
k2 = 2.5;
nh = round(k1 * h);
nw = round(k2 * w);  
g = zeros(nh, nw, dim, 'uint8'); 
ia = round((0:h) * k1) + 1;
ja = round((0:w) * k2) + 1;for c = 1:dimfor fi = 1:hfor fj = 1:wfv = f(fi, fj, c);g(ia(fi):(ia(fi+1)-1), ja(fj):(ja(fj+1)-1), c) = fv;endend
end
disp('图像处理完成。');
figure;
subplot(121);
imshow(f);
title(['分辨率为:', num2str(size(f, 1)), '×', num2str(size(f, 2)), '的原图像']);
subplot(122);
imshow(g);
title(['分辨率为:', num2str(size(g, 1)), '×', num2str(size(g, 2)), '的放大图像']);
imwrite(g, 'D:\myMatlab\img\01near_increase.jpg');

如果想要等比例放大图像,可以将放大倍数k1和k2设置一样的数值。如下就是等比例放大6倍的图像👇 

一般来说,很少用最邻近插值法来放大图像,基本使用的时双线性插值法来放大图像,之所以我要写这篇文章,主要是因为刚刚好学了,想着雁过留痕,就将自己的学习记录下来,往后还可以再看看。

如果有兴趣的话,可以关注专栏,之后会持续更新有关数字图像处理相关的内容及知识点。

如下就是双线性插值法的核心图:通过邻近四点,求得缩放图像的 像素值 g(i,j) 👇

如果对文章的内容有问题或者是有更好的建议请在评论区留言或者是私信我,回复时间不超过一天。  

相关文章:

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

目录 一,概念 二,题目及matlab实现 1,解题思路 2,matlab实现 1)matlab思路 2)完整代码 三,放大图像及matlab实现 一,概念 通过上一篇,我已经学习了使用最邻近插…...

pip安装库时报错(请求超时)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...

XPath表达式详解及其在Web开发中的应用

XPath(XML Path Language)是一种强大的查询语言,用于在XML文档中选择节点。由于HTML可以被视为一种特殊的XML,因此XPath同样适用于HTML文档。XPath允许开发者通过元素的层级结构和属性来选择节点或节点集合,这使得它成…...

Qt中Socket网络编程

文章目录 Qt中Socket网络编程服务器端客户端 Qt中Socket网络编程 这里就拿b站上爱编程的小丙的demo来做总结吧,首先要感谢成功带我入门的人:爱编程的小丙和程序员长风,这两个人是讲Socket编程我听懂的课555,接下来就总结一下Qt中…...

【05】Selenium+Python 两种文件上传方式(AutoIt)

上传文件的两种方式 一、input标签上传文件 可以用send_keys方法直接上传文件 示例代码 input标签上传文件import time from selenium import webdriver from chromedriver_py import binary_path # this will get you the path variable from selenium.webdriver.common.by i…...

Python网络编程

网络编程 Socket(套接字) socket 位于 网络协议中的 数据传输层、 该层 主要 可以通过 UDP 或者 TCP协议 实现 数据的传输 TCP 协议 VS UDP协议 tcp : 是一个 可靠的 ,面向 连接的协议。 数据在网络传输中 是安全的,不易丢失的。 TCP连接 在建立的时候&…...

openssl生成ca证书

常见CA文件夹 1、生成CA钥匙 openssl genrsa -out ./private/cakey.pem 2、生成CA自签名 openssl req -new -x509 -key ./private/cakey.pem -out ./cacert.crt -days 3650 3、生成http服务器私钥 openssl genrsa -out ./data/frontt.project.com.key 2048 4、CA给http服务器…...

Oracle RAC 环境下数据文件误建在本地目录的处理过程

问题描述 在 Oracle RAC 环境中,有时会误将数据文件创建在本地目录,导致其他节点无法访问该数据文件,从而报出 ORA-01157 和 ORA-01110 错误。 问题分析 错误日志 Mon Nov 16 19:02:38 2021 Errors in file /u01/app/oracle/diag/rdbms/orc…...

新质驱动·科东软件受邀出席2024智能网联+低空经济暨第二届湾区汽车T9+N闭门会议

为推进广东省加快发展新质生产力,贯彻落实“百县千镇万村高质量发展工程”,推动韶关市新丰县智能网联新能源汽车、低空经济与数字技术的创新与发展,充分发挥湾区汽车产业链头部企业的带动作用。韶关市指导、珠三角湾区智能网联新能源汽车产业…...

windows11 使用体验记录

好的地方: UI上字体风格貌似更好看了,文件夹增加了多个标签,类似于浏览器既可以打开多个窗口,也可以在同一个窗口中打开多个标签页 不好的地方: 桌面右下角点击日期时间,显示日期,时间呢&…...

202页MES项目需求方案深入解读,学习MES系统设计规划

202页MES项目需求方案深入解读,学习MES系统设计规划 MES项目需求方案旨在实现制造执行、效率提升、精细化管理等多个方面的功能。整体结构分为七大部分,包括制造执行、效率、精细化、品质在线、设备、用户思想和数据互联。制造执行部分关注订单、品质数据…...

前端css实例

前端css实例 一、带条纹的表格 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>条纹样式的表格<…...

YOLO的框架及版本迭代

YOLO&#xff08;You Only Look Once&#xff09;是一种非常流行的实时目标检测算法&#xff0c;其特点是将目标检测任务转换为一个回归问题&#xff0c;通过一次前向传播就可以同时完成目标的分类和定位。以下是YOLO框架的整体架构和工作原理&#xff1a; 一、YOLO的基本框架…...

PotPlayer 最新版本支持使用 Whisper 自动识别语音生成字幕

PotPlayer 最新版本支持使用 Whisper 自动识别语音生成字幕 设置使用下载地址 设置 使用 下载地址 https://www.videohelp.com/software/PotPlayer...

JavaScript零基础入门速通(中)

目录 1. 函数 1.1 函数声明 1.2 返回值 1.3 匿名函数 1.4 箭头函数 2. 对象 2.1 创建对象 2.2 访问和修改对象的属性 2.3 对象方法 3. 数组 3.1 创建数组 3.2 数组方法 3.3 遍历数组 4. 作用域 4.1 全局作用域 4.2 局部作用域 4.3 块级作用域 5. 事件处理 5…...

【Yarn Bug】 yarn 安装依赖出现的网络连接问题

最近&#xff0c;在初始化 Ant Design Pro 前端脚手架过程中&#xff0c;使用 yarn 安装依赖时遇到了网络连接问题&#xff0c;具体错误信息提示为 info There appears to be trouble with your network connection. Retrying...。通过百度查询&#xff0c;得知出现这种问题的原…...

字节青训Marscode_5:寻找最大葫芦——最新题解

步骤1&#xff1a;问题定义与分析 输入条件&#xff1a; 整数n&#xff1a;牌的数量整数max&#xff1a;葫芦牌面值之和的上限数组array&#xff1a;n张牌的牌面值 输出条件&#xff1a; 两个整数组成的数组[a,b]&#xff1a; a表示三张相同牌的牌面值b表示两张相同牌的牌面值如…...

MySQL —— MySQL 程序

目录 前言 一、MySQL 程序简介 二、mysqld -- MySQL 服务器 三、mysql -- MySQL 客户端 1. mysql 客户端简介 2. mysql 客户端选项 &#xff08;1&#xff09;指定选项的方式 &#xff08;2&#xff09;mysql 客户端命令常用选项 &#xff08;3&#xff09;在命令行中使…...

LLamafactory API部署与使用异步方式 API 调用优化大模型推理效率

文章目录 背景介绍第三方大模型API 介绍LLamafactory 部署API大模型 API 调用工具类项目开源 背景介绍 第三方大模型API 目前&#xff0c;市面上有许多第三方大模型 API 服务提供商&#xff0c;通过 API 接口向用户提供多样化的服务。这些平台不仅能提供更多类别和类型的模型…...

不玩PS抠图了,改玩Python抠图

网上找了两个苏轼的印章图片&#xff1a; 把这两个印章抠出来的话&#xff0c;对于不少PS高手来说是相当容易&#xff0c;但是要去掉其中的水印&#xff0c;可能要用仿制图章慢慢描绘&#xff0c;图章的边缘也要慢慢勾画或者用通道抠图之类来处理&#xff0c;而且印章的红色也不…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...