Как повернуть изображение по ближайшей соседней интерполяции с помощью 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);
Этот код создает черное пятно, проблема в том, как сделать интерполяцию? Спасибо всем за любое освещение.
Постскриптум Не запрашивать встроенную функцию: imrotate (im1,1/thet, 'ближайшее');
Ответы
Ответ 1
Чтобы повернуть изображение без черных пятен, вам нужно идти в обратном направлении.
Обратная матрица вращения является транспонированной ей. Кроме того, повернутое изображение всегда больше с максимальным вращением на 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);
Ответ 2
Я помню предыдущий вопрос на SO, у которого была аналогичная проблема.
Идея, которую я имел, заключалась в том, чтобы сопоставить пиксели в противоположном направлении; для каждого пикселя на повернутом изображении найдите пиксель (пиксели), который отображается на нем в исходном изображении, тогда проблема станет намного проще.
У меня нет доступа к MATLAB в данный момент, но я думаю, что это выполнимо. Трудность здесь состоит в том, чтобы зацикливаться на пикселях с повернутым изображением.
Ответ 3
Как только у вас есть все преобразованные пиксели, вы можете заполнить черные пятна griddata
, который принимает неравномерный пространственный распределение пикселей (ваши повернутые пиксели) и интерполировать требуемые пиксели (черные пятна) с помощью линейного, кубического или ближайшего соседа.
Ответ 4
Черные точки могут быть удалены этими строками, а остальная часть кода остается такой же:
im2= zeros(500,500);
im2(:)=1;