在MATLAB

时间:2016-04-16 05:16:47

标签: image matlab image-processing rotation

我将用图片解释,以便您可以获得更好的理解,如下所示:

Final Result

根据上述结果,一切都显得正常。我有一些图像,我尝试用imrotate旋转此图像。在这种情况下,我使用45度逆时针旋转。然而,当我尝试反向旋转时(我的目的是在没有旋转的情况下获得图像的正常位置),一切都变得奇怪 - 特别是在图像分辨率时。图像分辨率会降低,图像尺寸会因图片中的许多噪点而改变,如上图所示。

其他信息

  • 真实图片信息:

    1. 宽度:512
    2. 身高:384
  • 裁剪图像信息:

    1. 宽度:513
    2. 身高:385

我的问题如下:如何获得像原始图像一样干净漂亮的图像?

我的代码如下所示:

clc;
close all;  % Close all figure windows except those created by imtool.
imtool close all;
clearvars; % Get rid of variables from prior run of this m-file.
workspace;  % Make sure the workspace panel is showing.

Rotation=45;

%Read the image
imagepad = imread('peppers.png');

%% Image Source Information
info1=size(imagepad);
fprintf('Real Image Information : \n'); % Message sent to command window.
fprintf(' Width  : %d\n',info1(2)); % Message sent to command window.
fprintf(' Height : %d\n',info1(1)); % Message sent to command window.
fprintf('------------------------');

%%Try Rotate 45 degree
imRotate = imrotate(imagepad,Rotation);

%%
figure;
subplot(121);
imshow(imagepad);
caption = sprintf('Real Image');
title(caption, 'FontSize', 13);
subplot(122);
imshow(imRotate);
caption = sprintf('Rotate 45 degree result');
title(caption, 'FontSize', 13);

%%try to return the image position
imReturn = imrotate(imRotate,-Rotation);

%%Try to return the size of image
%% find pixel
%im = imread('im.png');      %# load image
[y,x] = find(all(imReturn>0, 3)); %# find black pixels
position = [x,y];           %# display them
[x1]=min(position);
[x2]=max(position);

%%Normal Size
Im2 = imcrop(imReturn,[x1(1) x1(2) (x2(1)-x1(1)) (x2(2)-x1(2))]);
figure, imshow(Im2);
caption = sprintf('Last Result image size');
title(caption, 'FontSize', 13);

%%
figure;
subplot(221);
imshow(imagepad);
caption = sprintf('Real Image');
title(caption, 'FontSize', 13);
subplot(222);
imshow(imRotate);
caption = sprintf('Rotate 45 degree result');
title(caption, 'FontSize', 13);
subplot(223);
imshow(imReturn);
caption = sprintf('Inverse Rotate 45 degree result');
title(caption, 'FontSize', 13);
subplot(224);
imshow(Im2);
caption = sprintf('Crop result');
title(caption, 'FontSize', 13);

%%Different Resolution
subplot(121);
imshow(imagepad);
caption = sprintf('Real Image');
title(caption, 'FontSize', 13);
subplot(122);
imshow(Im2);
caption = sprintf('Crop result');
title(caption, 'FontSize', 13);


%% Image Source Information
info2=size(Im2);
fprintf('Return Image Information : \n'); % Message sent to command window.
fprintf(' Width  : %d\n',info2(2)); % Message sent to command window.
fprintf(' Height : %d\n',info2(1)); % Message sent to command window.
fprintf('------------------------');

1 个答案:

答案 0 :(得分:3)

我不确定图像尺寸有什么问题。旋转图像时,由于图像的角度超出图像尺寸,因此必须填充图像以便适应旋转。使用旋转的图像旋转图像后,图像尺寸将保持不变,这就是您需要裁剪图像以获得最终结果的原因。

但是,您遇到锯齿状噪声错误,因为默认插值算法是最近邻居。这意味着当您旋转图像时,孔中会填充来自附近邻居的像素。这导致了噪音"因为这些孔理论上应该被原始图像中的分数位置填充,因此这将促进离开和进入孔的平滑过渡。因此,您必须为A选择不同的插值算法。改为使用双线性或双三次插值。

因此,您需要更改imrotate次调用以使用不同的插值算法。我会在这里使用bicubic。首先旋转时,请将代码更改为:

imrotate

同样向后旋转时:

%%//Try Rotate 45 degree
imRotate = imrotate(imagepad,Rotation,'bicubic');

当我现在运行你的代码时,我在比较原始和旋转的前后图像时得到了这个:

enter image description here

您会发现没有任何"锯齿状边缘"因为插值算法。虽然涉及一些平滑,但这是双三次插值算法的结果。