使用Matlab进行图像的读写、显示和缩放(最近临插值和双线性内插值法)
2015-10-18 14:40
387 查看
上次我们开始进行数字图像处理这门课程的实验,直到现在才抽空出来写写文章,记录一下知识点。介绍一下,使用Matlab对数字图像的简单处理。
1、 读取与显示输入图像:
显示输出图像 --> readShow()
输出结果如下:
2、点运算:
1) 图像的缩放代码,并显示缩放处理前后的图像
这里将讲解两种缩放图像的方法:
①最近临插值
把最近邻像素的灰度值赋给每个新位置,代码如下:
放大到原图像的两倍 --> scale1(2^.5)
输入和输入出结果如下:
缩小到原图像的1/4倍 --> scale1(1/2)
输出结果如下:
②双线性插值
我们先按要求缩放原图像,得出缩放后的坐标,再有缩放后的坐标(x,y)求出该坐标在原图像上的位置,即(x/n,y/n),即为上图所示的D点(
+u,
+v)。其中(u,v)表示小数部分的坐标。
设原图像中有4个点,分别为
(
,
),
(
,
),
(
,
),
(
,
),其中这四点为相邻点,即
。而图中D点(
+u,
+v)为缩放图像所要插入的点。
根据双线性插值的算法,先在x方向上进行线性插值,即有
再在y方向上进行线性插值,即有
综上,有:
根据上述公式,使用Matlab编写程序,代码如下:
缩小到原图像的1/4倍 --> scale2(1/2)
输出结果如下:
放大到原图像的两倍 --> scale2(2^.5)
输出结果如下:
2) 剪切输入图像左上角的四分之一,并显示剪切前后的图像
代码如下:
3、 对点运算结构图像的写入(如保存在桌面、扩展名为“.jpg”)
代码如下:
总结:
(1)锻炼自学能力,自己研究了两种缩放图像的方法:最近临插值和双线性插值。
(2)全程程序代码自行编写,锻炼Matlab的编程能力,提高对使用Matlab进行图像处理的能力。
(3)虽说自己按照了算法编写出了程序,但是以自己的水平来说,想当堂完成达到尽善尽美的程度仍稍显不足。此外,即便是课堂上听懂了老师讲解的知识,算法转化为代码也不是说可以立马进行转换。再者加上有时并没透彻理解知识点,课后又将时间花上了自学其他知识上,使得实验过程中有点稍显吃力,尽管相信自己去花时间研究一定能透彻理解。
1、 读取与显示输入图像:
%输入图像和显示图像 function []=readShow() ima=imread('test.jpg'); %输入图像 imshow(ima); %显示图像 end
显示输出图像 --> readShow()
输出结果如下:
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)
输入和输入出结果如下:
缩小到原图像的1/4倍 --> scale1(1/2)
输出结果如下:
②双线性插值
我们先按要求缩放原图像,得出缩放后的坐标,再有缩放后的坐标(x,y)求出该坐标在原图像上的位置,即(x/n,y/n),即为上图所示的D点(
+u,
+v)。其中(u,v)表示小数部分的坐标。
设原图像中有4个点,分别为
(
,
),
(
,
),
(
,
),
(
,
),其中这四点为相邻点,即
。而图中D点(
+u,
+v)为缩放图像所要插入的点。
根据双线性插值的算法,先在x方向上进行线性插值,即有
再在y方向上进行线性插值,即有
综上,有:
根据上述公式,使用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)
输出结果如下:
放大到原图像的两倍 --> scale2(2^.5)
输出结果如下:
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)虽说自己按照了算法编写出了程序,但是以自己的水平来说,想当堂完成达到尽善尽美的程度仍稍显不足。此外,即便是课堂上听懂了老师讲解的知识,算法转化为代码也不是说可以立马进行转换。再者加上有时并没透彻理解知识点,课后又将时间花上了自学其他知识上,使得实验过程中有点稍显吃力,尽管相信自己去花时间研究一定能透彻理解。
相关文章推荐
- matlab初学笔记(二)
- MATLAB GUI设计手写输入板
- matlab配置Libsvm 防止备忘录
- 花了一天,解决java调用matlab
- matlab 产生向量
- Matlab转c与c++代码
- matlab操作
- pgm格式文件及其在matlab中的读取存储方法(1)
- matlab GUI程序转换成exe可执行文件
- 将Matlab GUI 文件打包成独立运行的exe程序的步骤
- 机器学习(六)梯度下降的优化算法和matlab/octave中的应用
- matlab中的eps功能
- matlab中由size函数引发的问题
- EKF-SLAM matlab仿真(2)
- 基于小波包变换和高阶统计量的高斯判别准则的红外小目标的分割程序V2.0-MATLAB版
- Matlab 周期方波信号傅里叶级数展开
- MATLAB中feval函数的用法
- Matlab实现单变量线性回归
- MATLAB读取txt的一些方法简单记录
- Matlab的libsvm-3.20的安装