发布网友 发布时间:2022-04-26 14:37
共4个回答
热心网友 时间:2023-11-01 11:33
% function I=ImageRotate(filename,ang,isSameSize) %isSameSize代表是否是按原图像大小进行旋转
clear all;
ang=90; %旋转角度
rad=pi/180*ang;
oldimage=imread('lena.bmp');
imview(oldimage);
[n,r]=size(oldimage);
oldwidth=n;
oldheight=r;
% if(isSameSize==0)
%计算原图像的4个角的坐标(以图像中心为坐标系原点)
oldx1=-(oldwidth-1)/2;
oldy1=(oldheight-1)/2;
oldx2=(oldwidth-1)/2;
oldy2=(oldheight-1)/2;
oldx3=-(oldwidth-1)/2;
oldy3=-(oldheight-1)/2;
oldx4=(oldwidth-1)/2;
oldy4=-(oldheight-1)/2;
%计算新图像的4个角的坐标(以图像中心为坐标系原点)
newx1=oldx1*cos(rad)+oldy1*sin(rad);
newy1=-oldx1*sin(rad)+oldy1*cos(rad);
newx2=oldx2*cos(rad)+oldy2*sin(rad);
newy2=-oldx2*sin(rad)+oldy2*cos(rad);
newx3=oldx3*cos(rad)+oldy3*sin(rad);
newy3=-oldx3*sin(rad)+oldy3*cos(rad);
newx4=oldx4*cos(rad)+oldy4*sin(rad);
newy4=-oldx4*sin(rad)+oldy4*cos(rad);
%计算旋转后的图像宽度和高度
newwidth=round(max(abs(newx4-newx1),abs(newx3-newx2))+0.5);
newheight=round(max(abs(newy4-newy1),abs(newy3-newy2))+0.5);
%旋转前中心坐标
% a=round((oldwidth-1)/2+0.5);
% b=round((oldheight-1)/2+0.5);
% %旋转后的中心坐标
% c=round((newwidth-1)/2+0.5);
% d=round((newheight-1)/2+0.5);
% else
a=round((oldwidth-1)/2+0.5);
b=round((oldheight-1)/2+0.5);
c=a;
d=b;
newwidth=oldwidth;
newheight=oldheight;
% end
t1=[1 0 0;0 1 0;-a -b 1]; %平移矩阵
t2=[cos(rad) sin(rad) 0;-sin(rad) cos(rad) 0;0 0 1]; %旋转矩阵
t3=[1 0 0;0 1 0;c d 1]; %平移矩阵
T=t1*t2*t3;
tform=maketform('affine',T); %调用函数maketform创建仿射变换
%构建新坐标系的x和y的值
tx=zeros(newwidth,newheight);
ty=zeros(newwidth,newheight);
for i=1:newwidth
for j=1:newheight;
tx(i,j)=i;
end
end
for i=1:newwidth
for j=1:newheight;
ty(i,j)=j;
end
end
[w z]=tforminv(tform,tx,ty); %调用函数tforminv计算方向变换
NewImage=uint8(zeros(newwidth,newheight)); %给新图像像素点赋初值0
%给新图像各像素点赋值
for i=1:newwidth
for j=1:newheight
source_x=w(i,j);
source_y=z(i,j);
if(source_x>=oldwidth-1||source_y>=oldheight-1||double(uint16(source_x))<=0||double(uint16(source_y))<=0)
NewImage(i,j)=0; %新图像的点不在原图像中,直接赋值0
else
if(source_x/double(uint16(source_x))==1.0&source_y/double(uint16(source_y))==1.0)
NewImage(i,j)=oldimage(int16(source_x),int16(source_y)); %整数点位置,直接将原图像中的值赋给新图像
else
%不在整数点位置,采用双线性插值法给新图像赋值
a=double(uint16(source_x));
b=double(uint16(source_y));
x11=double(oldimage(a,b));
x12=double(oldimage(a,b+1));
x21=double(oldimage(a+1,b));
x22=double(oldimage(a+1,b+1));
NewImage(i,j)=uint8((b+1-source_y)*((source_x-a)*x21+(a+1-source_x)*x11)+(source_y-b)*((source_x-a)*x22+(a+1-source_x)*x12));
end
end
end
end
I=NewImage;
figure,imview(I);
经验证可行
热心网友 时间:2023-11-01 11:33
因为图像为一个方块矩阵,旋转后改变了矩阵的对角线位置,所以增加像素部分填充黑色。一般不能保持原图尺寸。但可以增加黑边宽度,使图像无用信息足够宽,旋转后在通过chop图像裁剪,可以得到与原图尺寸一致的选择图像。
热心网友 时间:2023-11-01 11:34
可以给原图加个白色大背景,旋转就行了。如果不喜欢旋转后的黑色,可以自己写循环代码将图中的每个黑色像素改为你喜欢的灰度值。追问主要是里面的比例尺寸变了。。。
热心网友 时间:2023-11-01 11:34
close all;
clear;
clc;
% 加载图像
original_image = imread('D:\head.jpg');
figure(1),imshow(original_image,[]),title("原图像");
% 旋转图像
transformed_image = imrotate(original_image, 45, 'crop'); % 此处的45可替换为其他角度
figure(2),imshow(transformed_image,[]),title("旋转后图像");