我们可以在MATLAB中旋转一个填充了原始图像背景色的图像吗?

我们可以在MATLAB中旋转一个填充了原始图像背景色的图像吗?,matlab,rotation,image-rotation,Matlab,Rotation,Image Rotation,默认情况下,MATLAB函数imrotate旋转图像,旋转部分填充黑色。看这个, 我们也可以旋转图像 问题是,我们可以使用或不使用填充了原始图像背景的imrotate来旋转图像吗 针对我的问题:旋转角度非常小的彩色图像您可以使用带有“复制”和“两者”选项的函数来插值图像。然后可以使用imrotate函数 在下面的代码中,我使用了ceilsizeim/2作为焊盘大小;但您可能需要更大的焊盘尺寸来消除黑色部分。我还使用s和s编写了imRS1-s1:s1+s1,S2-S2:S2+S2,:裁剪图像,您可

默认情况下,MATLAB函数imrotate旋转图像,旋转部分填充黑色。看这个,

我们也可以旋转图像

问题是,我们可以使用或不使用填充了原始图像背景的imrotate来旋转图像吗

针对我的问题:旋转角度非常小的彩色图像您可以使用带有“复制”和“两者”选项的函数来插值图像。然后可以使用imrotate函数

在下面的代码中,我使用了ceilsizeim/2作为焊盘大小;但您可能需要更大的焊盘尺寸来消除黑色部分。我还使用s和s编写了imRS1-s1:s1+s1,S2-S2:S2+S2,:裁剪图像,您可以提取图像的更大部分,只需扩展我下面用于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')
这将产生以下输出:

不太好,但比黑色的东西好。

您可以使用带有“复制”和“两者”选项的函数对图像进行插值。然后可以使用imrotate函数

在下面的代码中,我使用了ceilsizeim/2作为焊盘大小;但您可能需要更大的焊盘尺寸来消除黑色部分。我还使用s和s编写了imRS1-s1:s1+s1,S2-S2:S2+S2,:裁剪图像,您可以提取图像的更大部分,只需扩展我下面用于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);

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

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);


那么,你将如何定义这幅图像的背景色?@knedlsepp:我想用原始图像的背景填充它。那么你应该重新表述你的问题。填充原始图像的背景色。与不相同:背景应为原始图像。@knedlsepp:已指定它。请检查。那么您将如何定义此图像的背景颜色?@knedlsepp:我想用原始图像的背景填充它。然后您应该重新制定您的问题。填充原始图像的背景色。与不相同:背景应为原始图像。@knedlsepp:已指定它。请检查。如果是彩色图像怎么办?最终图像的大小与原始图像相差2-3像素。我们能控制它吗?@user11659-当然可以。但问题是,如果你希望最终图像的大小与原始图像相同,你应该意识到你会丢失相同的细节,尤其是在角落部分。提取旋转图像的中间部分会导致每个边缘有1个像素的差异。你知道,元素个数的公式是finalValue initialValue/increment-1,根据这个公式,在我的代码中,缺少负一。。我会编辑我的答案。祝你好运…非常感谢你的回答。如果原始图像中的高度/宽度像素数为奇数,则最终图像的静态大小与1像素的差异不完全相同。如果是彩色图像,则情况如何?最终图像的大小与原始图像的2-3像素差异几乎不相同。我们能控制它吗?@user11659-当然可以。但问题是,如果你希望最终图像的大小与原始图像相同,你应该意识到你会丢失相同的细节,尤其是在角落部分。提取旋转图像的中间部分会导致每个边缘有1个像素的差异。你知道,元素个数的公式是finalValue initialValue/increment-1,根据这个公式,在我的代码中,缺少负一。。我会编辑我的答案。祝你好运…非常感谢你的回答。如果原始图像中的高度/宽度像素数为奇数,则最终图像的静态大小与1像素的差异不完全相同。谢谢您的回答。您的代码提供了与原始图像相同大小的图像,并且似乎在小角度旋转时运行良好。我们如何在不同类型的变换(例如剪切)上实现相同的效果?感谢您的回答。您的代码提供了与原始图像相同大小的图像,并且似乎在小角度旋转时工作良好。我们如何在不同类型的变换(例如剪切)上实现相同的效果?