2016-10-30 3 views
-1

Я написал следующий код без встроенных функций Matlab для поворота изображения. Я попытался написать еще один цикл, чтобы инвертировать поворот. изображение вращается назад, но я все еще получаю размер ранее повернутого изображения. Как я могу избавиться от черных частей изображения?Обратное вращение изображения

INPUT_IMAGE = 'forest.png'; 
img_in=double(imread(INPUT_IMAGE))./255; 

h=size(img_in,1); 
w=size(img_in,2); 

R=[cos(th) -sin(th) 0 ; sin(th) cos(th) 0 ; 0 0 1]; 
T=[1 0 (-w/2) ; 0 1 (-h/2) ; 0 0 1]; 
F=inv(T)*R*T; 

img_out=zeros(h,w,3); 

%Rotate image 
for i=1:w 
    for j=1:h 

    a = [i ; j ; 1]; 
    b = inv(F) * a; 

    x = b(1)/b(3); 
    y = b(2)/b(3); 

    x = floor(x); 
    y = floor(y); 

     if (x>0 & x<=W & j>0 & j<=H) 
      img_out(y,x,:)=img_in(j,i,:); 
     end 

    end 
end 

img_out2=zeros(h,w,3); 

%invert rotation 
for i=1:w 
    for j=1:h 

    a = [i ; j ; 1]; 
    b = F * a; 

    x = b(1)/b(3); 
    y = b(2)/b(3); 

    x = floor(x); 
    y = floor(y); 

     if (x>0 & x<=W & j>0 & j<=H) 
      img_out2(y,x,:)=img_out(j,i,:); 
     end 

    end 
end 

Результат:

result

Я знаю, что изображение имеет черные пробелы из-за прямого отображения, но я не обеспокоен, что я пытаюсь выполнить код без встроенного - В функциях, которые будут только вращать изображение обратно, чтобы я мог вычислить ошибку.

+1

код вы вывесили не делает обратное вращение. Вы применяете одно и то же преобразование в первом цикле, как и во втором, таким образом, они делают то же самое! –

+0

Однако, чтобы ответить на ваш вопрос: если вы преобразовываете с прямым отображением, тогда информация теряется! Если на первом изображении пиксель никогда не просматривался, то во втором изображении его просто не будет, поэтому вы не сможете использовать это второе изображение для создания первого! –

+0

Если вы не знаете. MATLAB чувствителен к регистру. (Говоря об этом, потому что вы используете 'W' и' H' в своем коде, которые нигде не инициализированы) –

ответ

2

Вместо повторения исходного изображения, матрицы обратного преобразования и итерации целевого изображения.

Итерационное изображение назначения гарантирует отсутствие отверстий (каждый пиксель получает значение).

Код, который вы выложили не работает, пожалуйста, исправить это ...
я на основе моего ответа на свой предыдущий пост: Matlab image rotation

я использовал 'peppers.png' вместо 'forest.png' (я не могу найти 'forest.png', рядом время, пожалуйста, добавьте изображение в свой пост).

Пример код сделать следующее:

  • Поворотом входного изображения (Вы можете рассматривать его как «обратное преобразование»).
  • Поверните изображение результата назад (используя матрицу обратного преобразования).
  • Показать абсолютную разницу исходного изображения и изображения результата.

close all; 
clear all; 

img_in = 'peppers.png'; 

img_in =double(imread(img_in))./255; 
orig_in = img_in; 

h=size(img_in,1); 
w=size(img_in,2); 

th = pi/4; 
R=[cos(th) -sin(th) 0 ; sin(th) cos(th) 0 ; 0 0 1]; 
T=[1 0 (-w/2) ; 0 1 (-h/2) ; 0 0 1]; 
F=inv(T)*R*T; 

img_out=zeros(h,w,3); 

%Rotate image 
for i=1:w 
    for j=1:h 

     x = [i ; j ; 1]; 
     y = F * x; 

     a = y(1)/y(3); 
     b = y(2)/y(3); 

     a = round(a); 
     b = round(b); 

     if (a>0 && a<=w && b>0 && b<=h) 
      img_out(j,i,:)=img_in(b,a,:); 
     end 
    end 
end 

figure;imshow(img_out); 

%Rotate back 
%--------------------------------------------------------- 

img_in = img_out; 
img_out = zeros(h,w,3); 

%Inverse transformation matrix. 
F = inv(F); 

%Rotate image (back) 
for i=1:w 
    for j=1:h 

     x = [i ; j ; 1]; 
     y = F * x; 

     a = y(1)/y(3); 
     b = y(2)/y(3); 

     a = round(a); 
     b = round(b); 

     if (a>0 && a<=w && b>0 && b<=h) 
      img_out(j,i,:)=img_in(b,a,:); 
     end 
    end 
end 

figure;imshow(img_out); 

img_diff = abs(orig_in - img_out); 
figure;imshow(img_diff); 

img_diff изображение:
enter image description here

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