我们可以在 MATLAB 中旋转充满原始图像背景颜色的图像吗?

Can we rotate an image in MATLAB filled with background color of original image?

默认情况下,MATLAB 函数 imrotate 旋转图像,旋转部分填充黑色。看到这里,http://in.mathworks.com/help/examples/images_product/RotationFitgeotransExample_02.png

我们也可以用 white background 旋转图像。

问题是,我们可以旋转一个充满原始图像背景的图像(使用或不使用 imrotate)吗?

针对我的问题:旋转角度非常小的彩色图像(<=5 度)

您可以使用带有 'replicate''both' 选项的 padarray() 函数来插入图像。然后你可以使用imrotate()函数。

在下面的代码中,我使用 ceil(size(im)/2) 作为 pad 大小;但您可能需要更大的焊盘尺寸来消除黑色部分。我还使用 sS(写作 imR(S(1)-s(1):S(1)+s(1), S(2)-s(2):S(2)+s(2), :))来裁剪图像,您可以在其中提取更大的图像部分,只是扩展我在下面用于 imR 的索引边界.

试试这个:

im  = imread('cameraman.tif'); %// You can also read a color image 
s   = ceil(size(im)/2);
imP = padarray(im, s(1:2), 'replicate', 'both');
imR = imrotate(imP, 45);
S   = ceil(size(imR)/2);
imF = imR(S(1)-s(1):S(1)+s(1)-1, S(2)-s(2):S(2)+s(2)-1, :); %// Final form
figure, 
subplot(1, 2, 1)
imshow(im); 
title('Original Image')
subplot(1, 2, 2)
imshow(imF);
title('Rotated Image')

这给出了以下输出:

不太好但比黑色的东西好..

这是一个简单的方法,我们简单地将相同的旋转应用到蒙版上,并只获取旋转图像中与变换后的蒙版相对应的部分。然后我们只是将这些像素叠加在原始图像上。 我忽略了边界上可能的混合。

A = imread('cameraman.tif');
angle = 10;
T = @(I) imrotate(I,angle,'bilinear','crop');
%// Apply transformation
TA = T(A);
mask = T(ones(size(A)))==1;
A(mask) = TA(mask);
%%// Show image
imshow(A);