您的位置:首页 > 编程语言 > MATLAB

Matlab图像的几何变换之图像缩放

2017-12-13 13:07 1396 查看
Matlab图像缩放

Matlab实现函数代码如下:

clc
I=rgb2gray(imread('Campus-scenery2sk.JPG'));
figure,imshow(I);
title('原图');
reduceI=imresize(I,0.5);     %原图像I缩小0.5倍
figure,imshow(reduceI);
title('缩小后的图像');
enlargeI=imresize(I,1.5);   %原图像I放大1.5倍
figure,imshow(enlargeI);
title('放大后的图像');
MI=size(I)                  %求出原图像I的行列并在命令窗口显示
MreduceI=size(reduceI)      %求出原图像I缩小后的图像的行列并在命令窗口显示
MenlargeI=size(enlargeI)    %求出原图像I放大后的图像的行列并在命令窗口显示


函数运行的结果如下图所示:

-


程序中的函数说明:

B=imresize(A,scale,method);

A为要进行缩放的图片,scale为缩放的倍数,可选项method为缩放时采用的插值方法,默认值为最近邻插值。

设(x0,y0)为原图像上的一点,我们对其进行缩放处理,设x方向的缩放倍数为Sx,设y方向的缩放倍数为Sy,(x1,y1)为缩放后的像素点坐标,用矩阵变换表示为:

[x1y11]=[x0y01]⎡⎣⎢Sx000Sy0001⎤⎦⎥=[x0∗Sxy0∗Sy1];

其逆运算为:

[x0y01]=[x1y11]⎡⎣⎢1/Sx0001/Sy0001⎤⎦⎥=[x1/Sxy1/Sy1];

从其逆运算我们可知根据缩放公式计算得到的缩放图像中,某些映射源坐标可能不是整数,从而找不到对应像素的位置,比如:当Sx=Sy=2时,图像放大两倍,放大图像中的(1,0)像素对应于原图中的(0.5,0),这个坐标不是整数坐标位置,自然也就无法提取其灰度值。所以我们要对坐标进行近似处理,比如imresize()函数默认的插值方法最近邻插值。

我自己根据自己理解的双线性插值编写了图像的缩放函数imscale(),代码如下:

function A = imscale(B,S)   %定义缩放函数,B为源图像,A为目标图像,S为缩放倍数
[r,c] = size(B);
nr= round(r*S);             %根据放大倍数乘原行数的结果,取其四舍五入的值作为新的行
nc= round(c*S);             %根据放大倍数乘原列数的结果,取其四舍五入的值作为新的列
A = zeros(nr,nc);           %用新的行列生成目标图像矩阵
SB = zeros(r+1,c+1);        %新建一个矩阵SB,大小在B的基础上行列都加1
%%%%%处理SB边界%%%%%
SB(2:r+1,2:c+1)=B;
SB(2:r+1,1)=B(:,1);
SB(1,2:c+1)=B(1,:);
SB(1,1)=B(1,1);
%%%%%处理SB边界%%%%%
for Ai=1:nr
for Aj=1:nc
Bi=(Ai-1)/S;       %求出Ai对应的Bi坐标,Ai是由Bi先缩放S倍,再在竖直方向正向平移1得到
Bj=(Aj-1)/S;       %求出Aj对应的Bj坐标,Aj是由Bj先缩放S倍,再在水平方向正向平移1得到
i=fix(Bi);         %向零方向取整,求出坐标Bi的整数部分
j=fix(Bj);         %向零方向取整,求出坐标Bj的整数部分
u=Bi-i;            %求出坐标Bi的小数部分
v=Bj-j;            %求出坐标Bj的小数部分
i=i+1;             %这是在矩阵SB上计算的,不是在矩阵B上计算的,竖直方向上有平移量,加1对应B上的i值
j=j+1;             %这是在矩阵SB上计算的,不是在矩阵B上计算的,水平方向上有平移量,加1对应B上的j值
A(Ai,Aj)=(1-u)*(1-v)*SB(i,j)+u*v*SB(i+1,j+1)+u*(1-v)*SB(i+1,j)+(1-u)*v*SB(i,j+1);%双线性插值法计算A(Ai,Aj)
end
end
end


然后调用函数即可:

clc
I=rgb2gray(imread('cakesk.jpg'));
figure,imshow(I);
Dst=imscale(I,1.5);        %调用imscale()函数
figure,imshow(uint8(Dst));
imwrite(Dst,'ims1.5.jpg');  %存储缩放后的图像Dst,文件名命名为ims1.5.jpg


结果如下:



新建矩阵以及矩阵边界操作:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  matlab