用三角函数旋转图像

问题描述

您好,我只想使用三角函数来批准图像。

将“ 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);

解决方法

使用三角函数旋转图像

可以使用三角函数通过分解旋转矩阵来旋转图像。旋转矩阵可以描述为矩阵和下面的相应代码段:

Rotattion Matrix

代码将通过评估原始图像中的相应点来迭代以填充旋转的图像。需要注意的一点是,需要使用零填充图像,以使旋转后图片不会被剪切。有关旋转矩阵的详细推导,请查看这篇文章: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种不同的方式旋转围绕中心像素的像素,而这些方式并不能代表所有可能的角度。

Rotated Image Figure 1 导出的图像具有透明度:

Exported Image with Transparency

对于灰度图像:

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);

Rotated Image Figure 2 导出具有透明度的彩色图像:

Exported Colour Image with Transparency

对于彩色图像:

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运行