问题描述
您好,我只想使用三角函数来批准图像。
将“ q”假设为“ theta”
y'= x * sin(q)+ y(-tan(q / 2))* sin(q)+ y
x'= x + 2 y (-tan(q / 2))+ x sin(q)(-tan ^ 2(q / 2)) + y
x'和y'将成为我们的新x和y值。
在此示例中,“ theta”被认为是“ 30度”,但是我将开发代码,并将其用于任何其他度...
所以基本上,我希望您从我那里发现自己的错误,或者如果代码完全错误,请告诉我正确的方法。
im1=zeros(64*64);
subplot(1,2,1);
imshow(im1);
[x,y]=size(im1);
%Let theta=30 degrees
for i=1:64
for j=1:64
x2(i,j)=x+2*y*(-tand(15))+ x*sind(30)*(-tand(15).^2)+y;
y2(i,j)=x*sind(30)+y*(-tand(15))*sind(30)+y;
% i'm not sure about where to put i and j,but i prefer like this.
end
end
im2=[x2,y2];
subplot(1,2);
imshow(im2);
解决方法
使用三角函数旋转图像
可以使用三角函数通过分解旋转矩阵来旋转图像。旋转矩阵可以描述为矩阵和下面的相应代码段:
代码将通过评估原始图像中的相应点来迭代以填充旋转的图像。需要注意的一点是,需要使用零填充图像,以使旋转后图片不会被剪切。有关旋转矩阵的详细推导,请查看这篇文章:How do rotation matrice work?
代码段:
X_Displacement = Row - X_Midpoint;
Y_Displacement = Column - Y_Midpoint;
X_Prime = X_Displacement*cosd(Angle) + Y_Displacement*sind(Angle);
Y_Prime = -X_Displacement*sind(Angle) + Y_Displacement*cosd(Angle);
在上面的代码段中,使用cosd()
和sind()
使得角度可以接受。如果您想交替使用弧度,请使用标准的cos()
和sin()
函数。当使用round()
时,将应用最近邻插值。这是由于旋转图像的性质。一个小箱子正在旋转3 x 3的图像。这就引出了一个问题,在这种情况下,您实际上只能以9种不同的方式旋转围绕中心像素的像素,而这些方式并不能代表所有可能的角度。
导出的图像具有透明度:
对于灰度图像:
clear;
Angle = 30;
[Original_Image] = imread("cameraman.tif");
subplot(1,2,1); imshow(Original_Image);
title("Original Image");
[Image_Height,Image_Width] = size(Original_Image);
%Padding Image%
Padding_Bottom_And_Top = zeros(round(Image_Height/2),Image_Width);
Side_Padding = zeros(Image_Height+2*size(Padding_Bottom_And_Top,1),Image_Width/2);
Padded_Image = [Padding_Bottom_And_Top; Original_Image];
Padded_Image = [Padded_Image; Padding_Bottom_And_Top];
Padded_Image = [Side_Padding Padded_Image];
Padded_Image = [Padded_Image Side_Padding];
[Padded_Image_Height,Padded_Image_Width] = size(Padded_Image);
Rotated_Image = zeros(Image_Height,Image_Width);
%Finding the centre points%
X_Midpoint = Padded_Image_Height/2;
Y_Midpoint = Padded_Image_Width/2;
for Row = 1: Padded_Image_Height
for Column = 1: Padded_Image_Width
X_Displacement = Row - X_Midpoint;
Y_Displacement = Column - Y_Midpoint;
X_Prime = X_Displacement*cosd(Angle) + Y_Displacement*sind(Angle);
Y_Prime = -X_Displacement*sind(Angle) + Y_Displacement*cosd(Angle);
X_Prime = round(X_Prime + X_Midpoint);
Y_Prime = round(Y_Prime + Y_Midpoint);
if(X_Prime >= 1 && Y_Prime >= 1 && X_Prime <= Padded_Image_Height && Y_Prime <= Padded_Image_Width)
Rotated_Image(Row,Column) = Padded_Image(X_Prime,Y_Prime);
end
end
end
Rotated_Image = uint8(Rotated_Image);
subplot(1,2); imshow(Rotated_Image);
title("Rotated Image");
%Saving rotated image with transparency%
Transparent_Region = (Rotated_Image ~= 0);
Transparent_Region = uint8(255.*Transparent_Region);
imwrite(Rotated_Image,'Rotated.png','Alpha',Transparent_Region);
导出具有透明度的彩色图像:
对于彩色图像:
clear;
Angle = 30;
[Original_Image] = imread("peppers.png");
subplot(1,Image_Width,~] = size(Original_Image);
%Padding Image%
Padding_Bottom_And_Top = zeros(round(Image_Height/2),3);
Side_Padding = zeros(Image_Height+2*size(Padding_Bottom_And_Top,Image_Width/2,3);
Padded_Image = [Padding_Bottom_And_Top; Original_Image];
Padded_Image = [Padded_Image; Padding_Bottom_And_Top];
Padded_Image = [Side_Padding Padded_Image];
Padded_Image = [Padded_Image Side_Padding];
[Padded_Image_Height,Padded_Image_Width,~] = size(Padded_Image);
Rotated_Image = zeros(Image_Height,3);
%Finding the centre points%
X_Midpoint = Padded_Image_Height/2;
Y_Midpoint = Padded_Image_Width/2;
for Row = 1: Padded_Image_Height
for Column = 1: Padded_Image_Width
X_Displacement = Row - X_Midpoint;
Y_Displacement = Column - Y_Midpoint;
X_Prime = X_Displacement*cosd(Angle) + Y_Displacement*sind(Angle);
Y_Prime = -X_Displacement*sind(Angle) + Y_Displacement*cosd(Angle);
X_Prime = round(X_Prime + X_Midpoint);
Y_Prime = round(Y_Prime + Y_Midpoint);
if(X_Prime >= 1 && Y_Prime >= 1 && X_Prime <= Padded_Image_Height && Y_Prime <= Padded_Image_Width)
Rotated_Image(Row,Column,:) = Padded_Image(X_Prime,Y_Prime,:);
end
end
end
Rotated_Image = uint8(Rotated_Image);
subplot(1,2); imshow(Rotated_Image);
title("Rotated Image");
%Saving rotated image with transparency%
Transparent_Region = (Rotated_Image(:,:,1) ~= 0);
Transparent_Region = uint8(255.*Transparent_Region);
imwrite(Rotated_Image,Transparent_Region);
使用MATLAB R2019b运行