MATLAB图像旋转源代码
2017-12-18 20:36
344 查看
代码如下:
clear;
clc;
jiaodu=input('请输入角度:'); %要旋转的角度,旋转方向为顺时针
[filename,pathname]=uigetfile({'*jpg;*.bmp;*.jpeg;*.png;'},'load?image');
fpath=fullfile(pathname,filename);
img=imread(fpath);
img=rgb2gray(img);
imshow(img); %这里y为变换后图像的高度,x为变换后图像的宽度
[h w]=size(img);
theta=jiaodu/180*pi;
rot=[cos(theta) -sin(theta) 0;sin(theta) cos(theta) 0;0 0 1];
pix1=[1 1 1]*rot; %变换后图像左上点的坐标
pix2=[1 w 1]*rot; %变换后图像右上点的坐标
pix3=[h 1 1]*rot; %变换后图像左下点的坐标
pix4=[h w 1]*rot; %变换后图像右下点的坐标
height=round(max([abs(pix1(1)-pix4(1))+0.5 abs(pix2(1)-pix3(1))+0.5])); %变换后图像的高度
width=round(max([abs(pix1(2)-pix4(2))+0.5 abs(pix2(2)-pix3(2))+0.5])); %变换后图像的宽度
imgn=zeros(height,width);
delta_y=abs(min([pix1(1) pix2(1) pix3(1) pix4(1)])); %取得y方向的负轴超出的偏移量
delta_x=abs(min([pix1(2) pix2(2) pix3(2) pix4(2)])); %取得x方向的负轴超出的偏移量
for i=1-delta_y:height-delta_y
for j=1-delta_x:width-delta_x
pix=[i j 1]/rot; %用变换后图像的点的坐标去寻找原图像点的坐标,
%否则有些变换后的图像的像素点无法完全填充
float_Y=pix(1)-floor(pix(1));
float_X=pix(2)-floor(pix(2));
if pix(1)>=1 && pix(2)>=1 && pix(1) <= h && pix(2) <= w
pix_up_left=[floor(pix(1)) floor(pix(2))]; %四个相邻的点
pix_up_right=[floor(pix(1)) ceil(pix(2))];
pix_down_left=[ceil(pix(1)) floor(pix(2))];
pix_down_right=[ceil(pix(1)) ceil(pix(2))];
value_up_left=(1-float_X)*(1-float_Y); %计算临近四个点的权重
value_up_right=float_X*(1-float_Y);
value_down_left=(1-float_X)*float_Y;
value_down_right=float_X*float_Y;
imgn(i+delta_y,j+delta_x)=value_up_left*img(pix_up_left(1),pix_up_left(2))+ ...
value_up_right*img(pix_up_right(1),pix_up_right(2))+ ...
value_down_left*img(pix_down_left(1),pix_down_left(2))+ ...
value_down_right*img(pix_down_right(1),pix_down_right(2));
end
end
end
figure,
subplot(121);
imshow(img);
subplot(122);
imshow(uint8(imgn))
结果如下:
clear;
clc;
jiaodu=input('请输入角度:'); %要旋转的角度,旋转方向为顺时针
[filename,pathname]=uigetfile({'*jpg;*.bmp;*.jpeg;*.png;'},'load?image');
fpath=fullfile(pathname,filename);
img=imread(fpath);
img=rgb2gray(img);
imshow(img); %这里y为变换后图像的高度,x为变换后图像的宽度
[h w]=size(img);
theta=jiaodu/180*pi;
rot=[cos(theta) -sin(theta) 0;sin(theta) cos(theta) 0;0 0 1];
pix1=[1 1 1]*rot; %变换后图像左上点的坐标
pix2=[1 w 1]*rot; %变换后图像右上点的坐标
pix3=[h 1 1]*rot; %变换后图像左下点的坐标
pix4=[h w 1]*rot; %变换后图像右下点的坐标
height=round(max([abs(pix1(1)-pix4(1))+0.5 abs(pix2(1)-pix3(1))+0.5])); %变换后图像的高度
width=round(max([abs(pix1(2)-pix4(2))+0.5 abs(pix2(2)-pix3(2))+0.5])); %变换后图像的宽度
imgn=zeros(height,width);
delta_y=abs(min([pix1(1) pix2(1) pix3(1) pix4(1)])); %取得y方向的负轴超出的偏移量
delta_x=abs(min([pix1(2) pix2(2) pix3(2) pix4(2)])); %取得x方向的负轴超出的偏移量
for i=1-delta_y:height-delta_y
for j=1-delta_x:width-delta_x
pix=[i j 1]/rot; %用变换后图像的点的坐标去寻找原图像点的坐标,
%否则有些变换后的图像的像素点无法完全填充
float_Y=pix(1)-floor(pix(1));
float_X=pix(2)-floor(pix(2));
if pix(1)>=1 && pix(2)>=1 && pix(1) <= h && pix(2) <= w
pix_up_left=[floor(pix(1)) floor(pix(2))]; %四个相邻的点
pix_up_right=[floor(pix(1)) ceil(pix(2))];
pix_down_left=[ceil(pix(1)) floor(pix(2))];
pix_down_right=[ceil(pix(1)) ceil(pix(2))];
value_up_left=(1-float_X)*(1-float_Y); %计算临近四个点的权重
value_up_right=float_X*(1-float_Y);
value_down_left=(1-float_X)*float_Y;
value_down_right=float_X*float_Y;
imgn(i+delta_y,j+delta_x)=value_up_left*img(pix_up_left(1),pix_up_left(2))+ ...
value_up_right*img(pix_up_right(1),pix_up_right(2))+ ...
value_down_left*img(pix_down_left(1),pix_down_left(2))+ ...
value_down_right*img(pix_down_right(1),pix_down_right(2));
end
end
end
figure,
subplot(121);
imshow(img);
subplot(122);
imshow(uint8(imgn))
结果如下:
相关文章推荐
- matlab旋转图像任意角度
- Matlab 关于彩色图像的平移、旋转以及对称处理
- 图像数字水印Matlab源代码
- 基于SIFT特征的图像配准(附Matlab源代码)
- matlab 图像几何变换 平移、旋转、缩放
- matlab 对一个文件夹里的所有图像进行批量旋转90度并保存
- 图像旋转-不同插值法比较——MATLAB
- 使用 matlab 数字图像处理(三)—— 实现图像的旋转(不使用 imrotate)
- matlab中简单的图像旋转算法
- [转] MATLAB图像实用源代码
- MATLAB图像处理实用源代码
- Matlab图像几何变换之图像旋转
- matlab deeplearning用于图像分类的源代码理解
- 我写的 matlab 二次差值 图像 旋转
- Matlab图像几何变换之图像旋转
- opencv 旋转图像函数实现 等同于matlab里的rotate() (注:旋转后图像变大,超出部分填为黑色)
- matlab实现图像的平移、旋转、缩放
- 图像旋转 matlab程序
- Matlab 图像平移、旋转、缩放、镜像
- 基于小波变换的多尺度图像边缘检测matlab源代码(在Matlab7.0下运行)