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

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

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

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

Ответы [ 4 ]

11 голосов
/ 04 декабря 2009

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

Инверсия матрицы вращения - это ее транспонирование. Кроме того, повернутое изображение всегда больше с максимальным поворотом на 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);
6 голосов
/ 28 ноября 2009

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

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

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

0 голосов
/ 13 января 2013

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

im2= zeros(500,500);
im2(:)=1;
0 голосов
/ 28 ноября 2009

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

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