在不使用imrotate函数的前提下,用matlab写一份完整的读取体育场的灰度图像文件“campusgray.jpg”, 进行旋转操作,分别旋转45度,100度 和 670度,并图像显示,并对生成的图像中空值进行双线性插值填充,并图像显示的代码
时间: 2024-10-09 09:01:45 浏览: 11
在MATLAB中,我们可以使用`imrotate`函数来旋转图像,但如果要避开`imrotate`,我们可以手动编写旋转矩阵并使用`imgaussfilt`函数进行平滑处理,避免边界像素值为NaN的情况。以下是完整的代码示例:
```matlab
% 读取灰度图像
img = imread('campusgray.jpg', '_GRAYSCALE');
% 创建旋转角度数组
angles = [45; 100; 670];
% 初始化用于存储旋转结果的矩阵
rotated_imgs = zeros(size(img));
% 对于每个旋转角度
for i = 1:length(angles)
% 计算旋转矩阵
rot_matrix = getRotationMatrix(angles(i), size(img));
% 手动旋转
rotated_img_temp = interp2(img, rot_matrix(1,:), rot_matrix(2,:), 'bilinear');
% 确保旋转后边缘不出现空值
rotated_img_temp = imgaussfilt(rotated_img_temp, 1); % 使用高斯滤波填充空值
% 存储结果
rotated_imgs(:,:,i) = rotated_img_temp;
end
% 显示原图和旋转后的图像
figure;
subplot(2,2,1);
imshow(img, []);
title('Original Image');
subplot(2,2,2);
imshow(rotated_imgs(:,:,1), []);
title(['Rotated by 45°']);
subplot(2,2,3);
imshow(rotated_imgs(:,:,2), []);
title(['Rotated by 100°']);
subplot(2,2,4);
imshow(rotated_imgs(:,:,3), []);
title(['Rotated by 670°']);
function rot_matrix = getRotationMatrix(angle, size_image)
angle_rad = deg2rad(angle);
cos_angle = cos(angle_rad);
sin_angle = sin(angle_rad);
rot_matrix = [cos_angle, -sin_angle; sin_angle, cos_angle];
rot_matrix = reshape(rot_matrix, [size_image(2), size_image(1), 2]);
end
```
在这个例子中,我们创建了一个旋转矩阵,然后用它与原始图像的像素坐标做双线性插值。注意,由于插值可能会引入噪声,所以最后使用了高斯滤波进行平滑处理。每完成一次旋转后,我们将结果存储在`rotated_imgs`矩阵中,并通过subplot显示原始图像和旋转后的图像。
阅读全文