旋转实验: a、利用imrotate,实现图像的旋转 b、不使用imrotate,定义文件myrotate.m,其中直接定义一个旋转矩阵,逐像素的实现图像的旋转。给出代码
时间: 2023-05-29 20:02:21 浏览: 260
imrotate_my.rar_imrotate_变换中心_图像旋转_旋转 边界_灰度值置零
a) 利用imrotate,实现图像的旋转
```matlab
% 读入原始图片
img = imread('lena.jpg');
% 显示原始图片
imshow(img);
% 逆时针旋转45度,并按原图大小裁剪
rotated_img = imrotate(img, -45, 'bilinear', 'crop');
% 显示旋转后的图片
imshow(rotated_img);
```
b) 不使用imrotate,定义文件myrotate.m,其中直接定义一个旋转矩阵,逐像素的实现图像的旋转
```matlab
function rotated_img = myrotate(img, angle)
% img: 原始图像
% angle: 旋转角度,逆时针为正
% rotated_img: 旋转后的图像
% 将角度转换为弧度
theta = deg2rad(angle);
% 计算旋转矩阵
rot_matrix = [cos(theta) -sin(theta); sin(theta) cos(theta)];
% 计算旋转后图像的大小和中心点位置
[height, width] = size(img);
max_dist = ceil(sqrt(height^2 + width^2));
center_x = floor(width/2)+1;
center_y = floor(height/2)+1;
% 初始化旋转后的图像
rotated_img = uint8(zeros(2*max_dist));
% 遍历旋转后的每一个像素,并计算对应原图像的坐标
for i = 1:size(rotated_img, 1)
for j = 1:size(rotated_img, 2)
% 计算当前像素到中心点的距离和对应的角度
dist = sqrt((i-max_dist)^2 + (j-max_dist)^2);
theta = atan2((i-max_dist), (j-max_dist));
% 计算原图像上对应的坐标
origin_x = round(center_x + dist*cos(theta+angle));
origin_y = round(center_y + dist*sin(theta+angle));
% 如果坐标在原图像范围内,则将原图像坐标处的像素值赋给当前像素
if (origin_x > 0 && origin_x <= width && origin_y > 0 && origin_y <= height)
rotated_img(i,j) = img(origin_y, origin_x);
end
end
end
% 裁剪旋转后的图像
rotated_img = rotated_img(max_dist-height:max_dist+height-1, max_dist-width:max_dist+width-1);
end
```
测试代码:
```matlab
% 读入原始图片
img = imread('lena.jpg');
% 显示原始图片
imshow(img);
% 逆时针旋转45度,并按原图大小裁剪
rotated_img = myrotate(img, 45);
% 显示旋转后的图片
imshow(rotated_img);
```
阅读全文