这是imrotate 的结果。当您旋转图像时,图像会用零填充结果中未包含的像素。但是,我可以建议的一件事是,您可以填充未包含在恒定值中的任何像素……例如图像的平均强度,前提是您的图像是灰度的。
我在这篇文章中做了类似的事情:Convert angle quantitative data into qualitative images
我得到了一个基本图像,我必须在给定角度列表的情况下旋转图像。当我旋转图像时,我必须用白色像素填充背景。
因此,一个很好的方法是提供一个全为logical true 的图像,它与原始图像的大小相同。您将也旋转此图像,使旋转后的图像具有false 像素,这表示旋转中不包含这些像素,true 像素表示包含这些像素。您将反转此蒙版,以便找到最终图像中未包含在旋转结果中的所有像素。您可以使用此掩码对旋转图像进行索引,并将零像素替换为平均强度。但是,因为您要查找不同图像之间的 PSNR,您可能希望旋转后的图像具有与原始图像相同的尺寸,因此请确保在旋转时指定 'crop' 标志。不幸的是,这会在旋转后移除一些像素,但这是为了保持图像的尺寸与原始图像相同。
因此,假设您的图像存储在A,并且您希望将图像旋转角度theta,请执行以下操作:
%// Define mask
mask = true(size(A));
%// Rotate original image
B = imrotate(A, theta, 'crop');
%// Rotate the mask and invert
maskR = ~imrotate(mask, theta, 'crop');
%// Find mean intensity of original image
meanI = mean(A(:));
%// Assign values in rotated result that are not included
%// with mean intensity
B(maskR) = meanI;
%// Show the images
figure;
subplot(1,3,1); imshow(A); title('Original Image');
subplot(1,3,2); imshow(maskR); title('Rotated Mask');
subplot(1,3,3); imshow(B); title('Rotated Image');
让我们测试一下。我将使用cameraman.tif 图像,它是 MATLAB 图像处理工具箱的一部分。这是它的样子:
因此,定义逆时针旋转 30 度的角度:
A = imread('cameraman.tif');
theta = 30;
结果如下: