Matlab图像的几何变换之图像缩放
2017-12-13 13:07
1396 查看
Matlab图像缩放
Matlab实现函数代码如下:
函数运行的结果如下图所示:
-
程序中的函数说明:
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(),代码如下:
然后调用函数即可:
结果如下:
新建矩阵以及矩阵边界操作:
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图像的几何变换之图像缩放
- matlab 图像几何变换 平移、旋转、缩放
- matlab 图像几何变换 平移、旋转、缩放
- 【OpenCV】图像几何变换:旋转,缩放,斜切
- 使用matlab对图像进行缩放
- OpenCV 几何变换-图像缩放
- 图像几何变换(缩放、旋转)中的插值算法
- Matlab图像的几何变换之图像转置
- Matlab图像几何变换之图像旋转
- matlab图像缩放算法简单原理
- matlab 图像的几何变换
- matlab实现图像的平移、旋转、缩放
- OpenCV 图像几何变换:旋转,缩放,斜切
- Matlab图像的几何变换之图像平移
- Matlab图像几何变换之图像旋转
- matlab之原始处理图像几何变换
- 在Matlab中实现图像的几何变换
- matlab之原始处理图像几何变换
- Matlab图像的几何变换之图像平移
- OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(2)