首页 > 其他分享 >使用Matlab进行图像的读写、显示和缩放(最近临插值和双线性内插值法)

使用Matlab进行图像的读写、显示和缩放(最近临插值和双线性内插值法)

时间:2022-11-28 23:34:53浏览次数:34  
标签:ima 缩放 插值法 sw sh 双线性 图像 ima2

上次我们开始进行数字图像处理这门课程的实验,直到现在才抽空出来写写文章,记录一下知识点。介绍一下,使用Matlab对数字图像的简单处理。

1、 读取与显示输入图像:

%输入图像和显示图像
function []=readShow()
ima=imread('test.jpg'); %输入图像
imshow(ima); %显示图像
end

显示输出图像 --> readShow()

输出结果如下:

使用Matlab进行图像的读写、显示和缩放(最近临插值和双线性内插值法)_缩放

2、点运算:

1) 图像的缩放代码,并显示缩放处理前后的图像

这里将讲解两种缩放图像的方法:

①最近临插值

把最近邻像素的灰度值赋给每个新位置,代码如下:

%Author: DreamBoy
%采用最近邻插值对图像进行缩放处理
%参数n表示缩放倍数
function []=scale1(n)
ima=imread('test.jpg');
imshow(ima);
title('输入图像');

ima=double(ima);
swh=size(ima); %得到原图像的宽高
sw=swh(:,2); %得到原图像的宽
sh=swh(:,1); %得到原图像的高
dw=ceil(sw * n); %得到
dh=ceil(sh * n);
resIma=zeros(dh,dw);
for i=1:dh
for j=1:dw
tx=round(i/n); %缩放后的图像坐标在原图像处的位置
ty=round(j/n);

if(tx < 1) %如果越界,则进行调整
tx = 1;
end
if(tx > sh)
tx = swh;
end
if(ty < 1)
ty = 1;
end
if(ty > sw)
ty = sw;
end
resIma(i,j)=ima(tx,ty); %将缩放后的图像坐标在原图像处的位置的灰度值赋值给缩放后的图像
end
end

resIma=uint8(resIma);
figure;
imshow(resIma);
title('输出图像');
end

放大到原图像的两倍 --> scale1(2^.5)

输入和输入出结果如下:

使用Matlab进行图像的读写、显示和缩放(最近临插值和双线性内插值法)_缩放

使用Matlab进行图像的读写、显示和缩放(最近临插值和双线性内插值法)_缩放_03

缩小到原图像的1/4倍 --> scale1(1/2)

输出结果如下:

使用Matlab进行图像的读写、显示和缩放(最近临插值和双线性内插值法)_双线性内插值法_04

②双线性插值

使用Matlab进行图像的读写、显示和缩放(最近临插值和双线性内插值法)_双线性内插值法_05

们先按要求缩放原图像,得出缩放后的坐标,再有缩放后的坐标(x,y)求出该坐标在原图像上的位置,即(x/n,y/n),即为上图所示的D点(+u,+v)。其中(u,v)表示小数部分的坐标。

设原图像中有4个点,分别为 (,), (,), (,), (,),其中这四点为相邻点,即

。而图中D点(+u,+v)为缩放图像所要插入的点。​

根据双线性插值的算法,先在x方向上进行线性插值,即有

使用Matlab进行图像的读写、显示和缩放(最近临插值和双线性内插值法)_缩放_06

使用Matlab进行图像的读写、显示和缩放(最近临插值和双线性内插值法)_数字图像处理_07

再在y方向上进行线性插值,即有

使用Matlab进行图像的读写、显示和缩放(最近临插值和双线性内插值法)_图像缩放_08

综上,有:

使用Matlab进行图像的读写、显示和缩放(最近临插值和双线性内插值法)_最近临插值_09

根据上述公式,使用Matlab编写程序,代码如下:

%采用双线性内插值对图像进行缩放处理
%参数n表示缩放的倍数
function []=scale2(n)
ima=imread('test.jpg'); %读取原图像
ima=double(ima); %二维矩阵转为双精度类型
swh=size(ima); %获取原图像的宽高
sh=swh(:,1); %获取原图像的高
sw=swh(:,2); %获取原图像的宽

%"加墙"
ima2=zeros(sh+2,sw+2);
ima2(1,2:sw+1)=ima(1,:); %原图像上边加墙,灰度值与边界一致
ima2(sh+2,2:sw+1)=ima(sh,:); %原图像下边加墙,灰度值与边界一致
ima2(2:sh+1,2:sw+1)=ima; %将原图像赋值给中心部分
ima2(:,1)=ima2(:,2); %原图像左边加墙,灰度值与边界一致
ima2(:,sw+2)=ima2(:,sw+1); %原图像右边加墙,灰度值与边界一致

dw=sw*n; %计算缩放后的图像的宽
dh=sh*n; %计算缩放后的图像的高

dw1=round((sw+2)*n); %计算加墙后缩放的图像的宽
dh1=round((sh+2)*n); %计算加墙后缩放的图像的高

resIma1=zeros(dh1,dw1); %创建原图像的矩阵

%从不是“墙”的位置开始计算缩放后的图像的各点灰度值
%考虑缩小图像时,输入的缩放倍数是小数,需进行取整
start=round(n+1);
endI=round(dh+n);
endJ=round(dw+n);

for i=start:endI
for j=start:endJ
tx=i/n; %缩放后的图像坐标在原图像处的位置
ty=j/n;
tdx=tx-floor(tx); %得到小数坐标
tdy=ty-floor(ty);
%确定临近四个角的坐标
%Q11点
Q11x=tx-tdx;
Q11y=ty-tdy;
%Q12点
Q12x=tx-tdx;
Q12y=Q11y+1;
%Q21点
Q21x=Q11x+1;
Q21y=Q11y;
%Q22点
Q22x=Q11x+1;
Q22y=Q11y+1;
%根据双线性内插算法,算出缩放后的图像在(i,j)点处的灰度值
resIma1(i,j)=tdx*tdy*ima2(Q11x,Q11y)+(1-tdx)*tdy*ima2(Q12x,Q12y)+tdx*(1-tdy)*ima2(Q21x,Q21y)+(1-tdy)*(1-tdx)*ima2(Q22x,Q22y);
end
end
resIma=resIma1(n+1:dh+n,n+1:dw+n); %截取除墙外的中心部分
resIma=uint8(resIma);
imshow(resIma); %显示缩放后的图像
end

缩小到原图像的1/4倍 --> scale2(1/2)

输出结果如下:

使用Matlab进行图像的读写、显示和缩放(最近临插值和双线性内插值法)_图像缩放_10

放大到原图像的两倍 --> scale2(2^.5)

输出结果如下:

使用Matlab进行图像的读写、显示和缩放(最近临插值和双线性内插值法)_数字图像处理_11

2) 剪切输入图像左上角的四分之一,并显示剪切前后的图像

代码如下:

%参数n表示剪切原图像的n
function []=cutIma(n)
ima=imread('test.jpg');
ima=double(ima);
swh=size(ima);
sh=swh(:,1);
sw=swh(:,2);
dh=round(sh*n);
dw=round(sw*n);
resIma=ima(1:dh,1:dw);
resIma=uint8(resIma);
imshow(resIma);

3、 对点运算结构图像的写入(如保存在桌面、扩展名为“.jpg”)

代码如下:

%Author: DreamBoy
%输入图像和显示图像
function []=write()
ima=imread('test.jpg'); %输入图像
imshow(ima); %显示图像
imwrite(ima,'output.jpg'); %保存图像到当前目录下,并命名为output
end

总结:

(1)锻炼自学能力,自己研究了两种缩放图像的方法:最近临插值和双线性插值。

(2)全程程序代码自行编写,锻炼Matlab的编程能力,提高对使用Matlab进行图像处理的能力。

(3)虽说自己按照了算法编写出了程序,但是以自己的水平来说,想当堂完成达到尽善尽美的程度仍稍显不足。此外,即便是课堂上听懂了老师讲解的知识,算法转化为代码也不是说可以立马进行转换。再者加上有时并没透彻理解知识点,课后又将时间花上了自学其他知识上,使得实验过程中有点稍显吃力,尽管相信自己去花时间研究一定能透彻理解。

标签:ima,缩放,插值法,sw,sh,双线性,图像,ima2
From: https://blog.51cto.com/u_15894233/5893794

相关文章

  • QT图片查看器封装-鼠标中心缩放、移动、截图、框选、切换播放
    Qt图片查看器目录1      简介...12      功能实现...22.1     图片以鼠标为中心放大缩小功能...22.2     图片移动功能...42.3   ......
  • 禁止鼠标滑轮缩放页面
    1、在页面挂载钩子中写入,全局App文件this.keepRatio()  window.addEventListener('resize',()=>{   this.keepRatio()  }); 2、定义禁止缩放函......
  • C#图片处理之:图片缩放和剪裁
    一、C#图片处理之:图片缩放和剪裁封装此代码是针对.netcore的使用如下:publicstaticvoidImgOne(){//Image//Bit......
  • WPF学习 - 用鼠标移动、缩放、旋转图片(1)
    原文网址:https://www.cnblogs.com/raynado/p/16704856.html1.需求其实我的需求很简单。就是想做一个图片查看器,可以通过鼠标来平移、缩放、旋转图片。2.解决思路:......
  • 第五章 k8s Pod水平自动缩放
    官网​​https://kubernetes.io/zh-cn/docs/tasks/run-application/horizontal-pod-autoscale/​​原理基本原理:HPA通过监控分析控制器控制的所有Pod的负载变化情况来确......
  • React可拖拽缩放组件react-rnd
    react-rnd是一个React组件库,可以提供一个可调整大小与可拖拽的组件。一、安装使用npmnpmi-Sreact-rnd使用yarnyarnaddreact-rnd二、使用方法基本用法<......
  • 背景缩放 background-size
    背景缩放background-sizebackground-size属性规定背景图像的尺寸background-size:背景图片宽度背景图片宽度;单位:长度I百分比lcoverlcontain;cover把背景图像扩......
  • 使用插值法公式组成数字电路进行计算的计算机
    使用插值法公式组成数字电路进行计算的计算机   使用插值法公式组成数字电路进行计算的计算机是一种可以使用插值法计算积分值,导数值,函数值的数字计算机,它由按键,液晶......
  • Andorid图片等比例缩放解决方案示例
    前言图片等比例缩放平时经常用到,网上也提供了很多种方式来解决。这里记录自己开发过程中用到的一种等比例缩放场景。AndroidimageViewadjustViewBounds属性设置,可以支持等......
  • JS_0069:禁止双指缩放触发浏览器缩放
    1,//禁止双指缩放触发浏览器缩放document.documentElement.addEventListener('touchstart',function(event){if(event.touches.length......