Как повернуть изображение с помощью интерполяции ближайшего соседа с помощью Matlab

Мой простой код без интерполяции:

im1 = imread('lena.jpg');imshow(im1);    
[m,n,p]=size(im1);
thet = rand(1);
m1=m*cos(thet)+n*sin(thet);
n1=m*sin(thet)+n*cos(thet);    

for i=1:m
    for j=1:n
       t = uint16((i-m/2)*cos(thet)-(j-n/2)*sin(thet)+m1/2);
       s = uint16((i-m/2)*sin(thet)+(j-n/2)*cos(thet)+n1/2);
       if t~=0 && s~=0           
        im2(t,s,:)=im1(i,j,:);
       end
    end
end
figure;
imshow(im2);

Этот код создает черное пятно, проблема в том, как сделать интерполяцию? Всем спасибо за освещение. P.S. Не запрашивать встроенную функцию: imrotate (im1,1 / thet, 'ближайший');


person MeadowMuffins    schedule 28.11.2009    source источник
comment
Вы пытаетесь выполнить поворот элемента или глобальный поворот всего изображения?   -  person monksy    schedule 28.11.2009
comment
это глобальное вращение всего img   -  person MeadowMuffins    schedule 29.11.2009


Ответы (4)


Чтобы повернуть изображение без черных пятен, нужно двигаться в обратном направлении.

Матрица, обратная матрице вращения, является ее транспонированием. Кроме того, повернутое изображение всегда больше с максимальным поворотом на 45 градусов. Следовательно, коэффициент sqrt(2)

im1 = imread('lena.jpg');imshow(im1);  
[m,n,p]=size(im1);
thet = rand(1);
mm = m*sqrt(2);
nn = n*sqrt(2);
for t=1:mm
   for s=1:nn
      i = uint16((t-mm/2)*cos(thet)+(s-nn/2)*sin(thet)+m/2);
      j = uint16(-(t-mm/2)*sin(thet)+(s-nn/2)*cos(thet)+n/2);
      if i>0 && j>0 && i<=m && j<=n           
         im2(t,s,:)=im1(i,j,:);
      end
   end
end
figure;
imshow(im2);
person sjchoi    schedule 03.12.2009
comment
Значит, обычное решение интерполяции ближайшего соседа неявно? Я думал, что он обнаружит наиболее видимый левый пиксель и самый правый, а затем интерполирует строку за строкой. - person MeadowMuffins; 04.12.2009
comment
То, что вы описываете, было бы билинейной интерполяцией. Ближайший сосед просто берет ближайшее значение пикселя - person sjchoi; 07.12.2009

Я помню предыдущий вопрос по SO, у которого была аналогичная проблема .

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

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

person Amro    schedule 28.11.2009
comment
Спасибо, Амро. Я проверил ваш предыдущий пост до того, как спросил. Отображение действительно в противоположном направлении, что упрощает его. И вы просто понимаете мои затруднения. - person MeadowMuffins; 29.11.2009
comment
Именно так обычно выполняется вращение, поскольку это позволяет избежать обработки пикселей, которые в любом случае не видны в конечном результате. - person Hannes Ovrén; 30.11.2009
comment
прошло довольно много времени, но кто-то придумал более быструю реализацию проблемы вращения, аналогичную той, которая сделана в этой ссылке? - person gcolucci; 06.12.2014

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

person Jacob    schedule 28.11.2009
comment
Тем не менее, это все еще встроенная функция для интерполяции. В любом случае спасибо, Джейкоб. - person MeadowMuffins; 29.11.2009

С помощью этих строк можно удалить черные пятна, а остальной код останется прежним:

im2= zeros(500,500);
im2(:)=1;
person Fatima Zohra    schedule 13.01.2013