《数字图像处理》实验之对图像进行双线性(bilinear)插值缩放

news/2024/12/23 2:28:18/

 最近数字图像处理的实验课,老师让我们实现对图像进行双线性(bilinear)插值缩放,以下是原理和代码。

一、双线性插值缩放

1、图像几何变换的一般流程:

①确定变换后新图像的大小

②对新图像的每一个像素,确定其在旧图像坐标中的对应位置(逆变换)

③确定旧图像中该位置的像素值(nearest,bilinear,bicubic,...)

④将确定的像素值作为新图像的像素值

 

 

 

 

 

由于该方法在水平、垂直两个方向上分别进行线性插值来得到最终结果,故称之为双线性插值法

总结:

二、不用 imresize , 利用循环自行编程将Lena图像以bilinear方式缩放p倍并显示。p是任一大于0的实数

%  Step1导入图像

img=imread('Lena.bmp');%导入lena图像
p=input('请输入缩放倍数(大于0的任意正实数):'); 

% Step2 通过原始图像和缩放因子得到新图像的大小,并创建新图像
[H,W,D]=size(img);%把二维矩阵当作第三维为D的三维矩阵。H是行数  W是列数
new_height=round(H*p);%算出缩放后的图像高度,最近取整
new_width=round(W*p);%算出缩放后的图像宽度,最近取整
new_img=zeros(new_height,new_width,D);%缩放之后新的矩阵大小

% Step3 扩展原始图像矩阵的边缘

img_scale=zeros(H+2,W+2,D);%将输入图像上下左右各加一列(行),这一步为了后面边缘像素的插值操作% 为扩展而来的各边赋值。为解决边界溢出问题,扩大原图像的四边边缘,将原矩形赋值给新的矩形
img_scale(2:H+1, 2:W+1, :)=img;%  为四周各添加的一行或列做值的初始化
img_scale(1, 2:W+1, :)=img(1,:,:);%矩形上边界(行)
img_scale(H+2, 2:W+1,:)=img(H,:,:);%矩形下边界,从第二列,到W+1列,长度W
img_scale(2:H+1,1,:)=img(:,1,:);%矩形左边界(列),从第二行,到H+1行,长度H
img_scale(2:H+1,W+2,:)=img(:,W,:);%矩形右边界(列),从第二行,到H+1行,长度H% 用原图的4个顶点为扩展而来的4个顶点赋值
img_scale(1,1,:)=img(1,1,:);
img_scale(1,W+2,:)=img(1,W,:);
img_scale(H+2,1,:)=img(H,1,:);
img_scale(H+2,W+2,:)=img(H,W,:);

%step4 新图的某个像素(i j)映射到原图(ox oy)上,并双线性插值算出新图该矩阵的灰度值

for j=1:new_heightfor i=1:new_widthox=(i-1)/p; oy=(j-1)/p;%用新的大图映射到小图的位置上x=floor(ox); y=floor(oy);% 原图坐标(ox,oy)不一定是整数,所以向下取整得到整数x,y%接下来带入公式即可u=ox-x;% 得到在原图中坐标的小数部分v=oy-y;x=x+1; y=y+1; %因为img_scale中多加了一行一列%这个是公式,可以在书上找到new_img(i,j,:)=u*v*img_scale(x+1,y+1,:)+v*(1-u)*img_scale(x,y+1,:)+(1-v)*u*img_scale(x+1,y,:)+(1-u)*(1-v)*img_scale(x,y,:);end
endnew_img = uint8(new_img);
%输出原图和更改后的图
figure;imshow(img);
axis on %恢复对坐标轴的一切设置
title(['原图像(大小: ',num2str(H),'X',num2str(W),'X',num2str(D),')']);%num2str:将数字转换为字符数组
figure;imshow(new_img);
axis on
title(['缩放后的图像(大小: ',num2str(new_height),'X',num2str(new_width),'X',num2str(D),')']);

 效果图:

三、不用 imresize , 修改上述代码,编程将将任一灰度图像以bilinear方式行缩放p倍,列缩放q倍。p、q是任一大于0的实数

image_2 = input('请输入缩放图像名字(例如:Lena.bmp):','s');%导入图片的路径

%输入的数目必须是2的整数倍
p= input('请输入行缩放倍数(大于0的任意正实数):');
q= input('请输入列缩放倍数(大于0的任意正实数):');
image_original= imread(image_2); 

% Step2 通过原始图像和缩放因子得到新图像的大小,并创建新图像
[H,W,D]=size(image_original);%算出图像的大小,返回 image_original 的查询维度的长度。
new_height=round(H*p);%算出缩放后的图像高度,最近取整
new_width=round(W*q);%算出缩放后的图像宽度,最近取整
new_image2=zeros(new_height,new_width,D);%缩放之后新的矩阵大小


% 为扩展而来的各边赋值
img_scale(2:H+1, 2:W+1, :)=image_original;
img_scale(1, 2:W+1, :)=image_original(1,:,:);
img_scale(H+2, 2:W+1,:)=image_original(H,:,:);
img_scale(2:H+1,1,:)=image_original(:,1,:);
img_scale(2:H+1,W+2,:)=image_original(:,W,:);

% 用原图的4个顶点为扩展而来的4个顶点赋值
img_scale(1,1,:)=image_original(1,1,:);
img_scale(1,W+2,:)=image_original(1,W,:);
img_scale(H+2,1,:)=image_original(H,1,:);
img_scale(H+2,W+2,:)=image_original(H,W,:);

%step4 新图的某个像素(i j)映射到原图(ox oy)上,并双线性插值算出新图该矩阵的灰度

for j=1:new_heightfor i=1:new_widthox=(i-1)/p; oy=(j-1)/q;%用新的大图映射到小图的位置上x=floor(ox); y=floor(oy);% 原图坐标(ox,oy)不一定是整数,所以向下取整得到整数x,y%接下来带入公式即可u=ox-x;% 得到在原图中坐标的小数部分v=oy-y;x=x+1; y=y+1; %因为img_scale中多加了一行一列new_image2(i,j,:)=u*v*img_scale(x+1,y+1,:)+v*(1-u)*img_scale(x,y+1,:)+(1-v)*u*img_scale(x+1,y,:)+(1-u)*(1-v)*img_scale(x,y,:);end
endnew_image2 = uint8(new_image2);%输出原图和更改后的图
figure;imshow(image_original);
axis on %恢复对坐标轴的一切设置
title(['原图像(大小: ',num2str(H),'X',num2str(W),'X',num2str(D),')']);%num2str:将数字转换为字符数组
figure;imshow(new_image2);
axis on
title(['缩放后的图像(大小: ',num2str(new_height),'X',num2str(new_width),'X',num2str(D),')']);

要在command window里面根据提示:输入缩放图像名字行、列缩放倍数

例如我输入的是Lena.bmp,2 ,2

效果图:

如果有错误的话,欢迎纠正
 


http://www.ppmy.cn/news/67223.html

相关文章

数电实验:Quartus II 软件使用 (八进制计数器和全加器)

一、实验目的: 1.熟悉可编程逻辑器件的设计工具Quartus II 软件的使用。 2.熟悉FPGA开发实验系统的软件环境,掌握各个菜单和图标的作用和功能。 二、实验内容 (1)以74160实现八进制计数器为例,学Quartus II 软件的…

Java面向对象继承

目录 继承的概念 继承的作用 继承关键字 extends关键字 implements关键字 super 与 this 关键字 继承类型 类的继承格式 继承的概念 继承是面向对象编程中的一个概念,它允许一个类(称为子类或派生类)继承另一个类(称为父…

ros2 foxy创建一个包和节点-ubuntu20.04

文章目录 创建工作区目录创建包和节点colcon build编译CMakeLists.txt文件find_packageadd_executable package.xml面相过程的方式生命一个节点以面向对象的方式创建一个节点 创建工作区目录 mkdir -p ~/ros2_ws/src cd ~/ros2_ws我们创建了两个目录,ros2_ws和在他…

学生电费管理系统

随着现代化的发展和科技的进步,各种智能化的系统应运而生。其中,学生电费管理系统是一个非常实用的系统,它可以帮助学校管理电费,提高学生的电费管理意识,减少学校的电费支出。本文将着重介绍该系统的作用、特点以及优…

薅羊毛 京豆 全网最全脚本库 青龙面板 目前最新脚本库(11/7日更新)

想必大家对青龙面板这个面板并不陌生吧!既然大家能找到这里,我也就不再赘述如何拉库了! 直接上脚本库了! YYDSPure 拉库前请打开青龙面板-配置文件 第18行 GithubProxyUrl"" 双引号中的内容删除。 代理问题&#xf…

什么是FIFO?

同步FIFO和异步FIFO 1、FIFO定义 FIFO是英文First In First Out的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序的读出数据&am…

细数N个获取天气信息的免费 API ,附超多免费可用API 推荐(三)

前言 市面上有 N 多个查询天气信息的软件、小程序以及网页入口,基本都是通过调用天气查询 API 去实现的。 今天整理了一下多种场景的天气预报API 接口分享给大家,有需要赶紧收藏起来。 天气预报查询 天气预报查询支持全国以及全球多个城市的天气查询…

Python3:我低调的只用一行代码,就导入Python所有库!

一行代码导入python所有库 1、引言2、Pyforest2.1 Pyforest 介绍2.2 Pyforest 安装与使用2.2.1 安装2.2.2 使用 3、总结 1、引言 今天我们来分享一个懒人库:Pyforest。 小屌丝:鱼哥,今天啥情况,你突然分享这个库? 小鱼…