2016-04-16 2 views
3

поясню с изображением, так что вы можете получить лучшее понимание, как показано ниже:Проблемы с задним ходом повернутого изображения в MATLAB

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

ответ

3

я не уверен, что это неправильно с размером изображения. Когда вы поворачиваете изображение, потому что углы изображения выходят за пределы размеров изображения, вы должны прокладывать изображение таким образом, чтобы вы могли приспособиться к вращению. После поворота изображения с помощью повернутого изображения размеры изображения останутся неизменными, поэтому вам нужно обрезать изображение, чтобы получить окончательный результат.

Тем не менее, вы испытываете зубчатые шумовые ошибки, поскольку алгоритм интерполяции по умолчанию является ближайшим соседом. Это означает, что при повороте изображения отверстия заполняются пикселями соседних соседей. Это приводит к «шуму», потому что теоретически отверстия должны быть заполнены дробными положениями исходного изображения, и это будет способствовать плавному переходу, выходящему и входящему в отверстия. Таким образом, вам нужно выбрать другой интерполяционный алгоритм для imrotate. Вместо этого используйте билинейную или бикубическую интерполяцию.

Таким образом, вам необходимо изменить свои вызовы imrotate, чтобы использовать различные алгоритмы интерполяции. Здесь я буду бикубич.При повороте первого, измените код на:

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

Аналогично, когда вы поворачиваете назад:

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

Когда я запускаю свой код теперь я получаю это при сравнении оригинала и повернуты вперед и назад изображение :

enter image description here

Вы увидите, что нет никаких «рваные края» из-за алгоритма интерполяции. Однако есть некоторое сглаживание, и это следствие бикубического интерполяционного алгоритма.

+0

спасибо, что этот метод работает отлично, но, все еще есть небольшая проблема с размером изображения, они также меняются, это мой последний результат о размере: Реальный Информация об изображении: Ширина: 512 Высота: 384 -----> Информация о возврате изображения: Ширина: 513 Высота: 385 ------------------------ >> и когда я пытаюсь для увеличения, есть один черный дополнительный пиксель на каждой стороне изображения, как устранить этот пиксель и получить правильный размер изображения, как реальное изображение. –

+0

Размер, который вы не можете изменить, потому что изображение даже в размерности ... Это проблема автоматического обрезки. Этот дифференциал по размеру можно избежать, если строки и столбцы будут нечетными. Больше ничего не можешь сделать. – rayryeng

+0

У вас есть другой код для автоматического обрезки для лучшего результата? –

Смежные вопросы