【20200415】数字图像处理DIP课程课业打卡六之图像的旋转——反变换MATLAB代码理解
叮嘟!这里是小啊呜的学习课程资料整理。好记性不如烂笔头,今天也是努力进步的一天。一起加油进阶吧!
一、DIP课程课业打卡六
1、阅读下面代码并回答相应问题:
function [im]=rot3_inv(I,delta_ang)
[M,N,K] = size(I);
a=delta_ang*pi/180; %%----------(a行)
x1=1; x2=M;x3=M;x4=1; %%----------(b行)
y1=1; y2=1;y3=N;y4=N;
x=[x1,x2,x3,x4];
y=[y1,y2,y3,y4];
x_2 = round(x*cos(a)-y*sin(a));
y_2 = round(x*sin(a)+y*cos(a));%%----------(c行)
xmin=min(x_2);
xmax=max(x_2);
ymin=min(y_2);
ymax=max(y_2);
if xmin<=0 %%-------(d行)
deltaX = abs(xmin)+1;
else
deltaX = 0;
end %%-------(e行)
if ymin<=0
deltaY = abs(ymin)+1;
else
deltaY = 0;
end
M_2 =xmax- xmin+1; %%-------(f行)
N_2 =ymax- ymin+1;
im = ones(M_2,N_2,K)*-1; %%-------(g行)
for i=1:M_2
for j=1:N_2
x = round((i-deltaX)*cos(a)+(j-deltaY)*sin(a));
y = round(-(i-deltaX)*sin(a)+(j-deltaY)*cos(a));
if(x>0 && x<=M && y>0 && y<=N) %%-------(h行)
im(i,j,:)=I(x,y,:);
end %%-------(i行)
end
end
im=uint8(im );
(1) [单选题]
解释第a行代码的作用
A、将旋转的弧度转化为角度
B、将旋转的角度转化为弧度
C、计算四个顶点旋转之后的坐标
正确答案:B
(2) [单选题]
解释第b行到第c行代码的作用:
A、计算四个顶点旋转的弧度
B、计算四个顶点旋转的角度
C、计算四个顶点旋转之后的坐标
正确答案:C
(3) [单选题]
解释第d行到第e行代码的作用:
A、计算行的方向上的偏移量
B、计算新的图像有几行
C、计算新的图像有几列
正确答案:A
(4) [单选题]
解释第f行到第g行代码的作用:
A、计算新的图像有几行、几列,并得到新的图像
B、计算新的图像有几行、几列,并初始化新的图像
C、计算新的图像有几列
正确答案:B
(5) [单选题]
解释第h行到第i行代码的作用:
A、新图像的行列坐标i和j,经过旋转逆变换后的坐标为x、y,如果x、y在原图像的合法范围内,就将原图像x、y处的像素值赋给新图像i、j处的像素
B、原图像的行列坐标i和j,经过旋转变换后的坐标为x、y,将原图像i、j处的像素值赋给新图像x、y处的像素
正确答案:A
二、知识巩固
1、关于图像的旋转——反变换【效果最好】
反变换方法就是从新图形的像素坐标反过来计算对应原图像坐标点的坐标。
即将 图像的旋转计算公式:
x1 =x0 cos(a)-y0 sin(a);
y1 =x0 sin(a)+y0 cos(a);
改写为:
x0 =x1 cos(a)+y1 sin(a);
y0 =-x1 sin(a)+y1 cos(a);
2、图像旋转方法3之反变换法伪代码
输入参数:图像矩阵F,旋转角度a
输出参数:旋转后的图像矩阵G
处理:
1、获得图像尺寸,计算图像的四个顶点坐标。
2、根据旋转公式:x_2 = round(x*cos(a)-y*sin(a));
y_2 = round(x*sin(a)+y*cos(a)),计算图像的四个顶点旋转后的坐标。
(x、y为原始图像的坐标,x_2、y_2为对应点旋转后的坐标)
3、根据四个顶点旋转后的坐标,计算画布扩展后的大小M2、N2,并计算x和y方向的偏移量。初始化新图像G
4、对新图像G的每一行for i=1:M_2
5、对新图像G的每一列for j=1:N_2
5.1 根据旋转反变换公式和x、y方向的偏移量,计算新图像的像素点G(i,j,:)旋转前在原图像F中对应的坐标x、y。
5.2 如果(x>0 && x<=M && y>0 && y<=N),则将F(x,y,:)的像素值采样并且赋给G(i,j,:)
3、图像旋转方法3之反变换法代码实现
function [im]=rot3_inv(I,delta_ang)
[M,N,K] = size(I);
a=delta_ang*pi/180;
x1=1; x2=M;x3=M;x4=1;
y1=1; y2=1;y3=N;y4=N;
x=[x1,x2,x3,x4];
y=[y1,y2,y3,y4];
x_2 = round(x*cos(a)-y*sin(a));
y_2 = round(x*sin(a)+y*cos(a));
xmin=min(x_2);
xmax=max(x_2);
ymin=min(y_2);
ymax=max(y_2);
if xmin<=0
deltaX = abs(xmin)+1;
else
deltaX = 0;
end
if ymin<=0
deltaY = abs(ymin)+1;
else
deltaY = 0;
end
M_2 =xmax- xmin+1;
N_2 =ymax- ymin+1;
im = ones(M_2,N_2,K)*-1;
for i=1:M_2
for j=1:N_2
x = round((i-deltaX)*cos(a)+(j-deltaY)*sin(a));
y = round(-(i-deltaX)*sin(a)+(j-deltaY)*cos(a));
if(x>0 && x<=M && y>0 && y<=N)
im(i,j,:)=I(x,y,:);
end
end
end
im=uint8(im );
imshow(I);title('原图');figure;
imshow(im);title('转置后');
函数调用:
//此处旋转角度为60度;
>> I = imread('football.jpg');
>> [im]=rot3_inv(I,60);
效果展示:
Ending!
更多课程知识学习记录随后再来吧!
就酱,嘎啦!
注:
人生在勤,不索何获。