Объяснение алгоритма интерполяции ближайшего соседа для поворота изображения - PullRequest
1 голос
/ 25 июня 2019

Я пытаюсь понять реализацию алгоритма ближайшего соседа для поворота изображения. Обычные алгоритмы ближайшего соседа, которые я знаю, вычисляют некоторые явные евклидовы расстояния между различными точками и выбирают точку с наименьшим евклидовым расстоянием как лучшую точку. Но в интерполяции изображений я не нахожу явного евклидова расстояния в реализации. Я имею в виду этот ответ на другой похожий вопрос. Данное решение отлично поворачивает входное изображение на заданный угол. Но у меня много вопросов по поводу кода (я не понимаю, что они делают).

1.) Почему автор умножается на sqrt(2) для новых индексов (строки 4 и 5)?

2.) Что делает автор в следующих строках кода (если быть точным, я понимаю, он умножает индексы на матрицу вращения. Но почему у него есть дополнительные термины, такие как m/2, n/2, t-mm/2 и s-nn/2? Что он делает с if i>0 && j>0 && i<=m && j<=n?)? :

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

Любая помощь будет высоко ценится!

1 Ответ

4 голосов
/ 26 июня 2019

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

Код использует в качестве источника поворота центр изображения, x=n/2, y=m/2, с m и n размерами входного изображения. Затем он сдвигает повернутые координаты назад немного дальше, поэтому центр нового изображения находится в (mm/2, nn/2), с mm = m*sqrt(2) и nn = n*sqrt(2) размером выходного изображения. (Обратите внимание, что если мы поворачиваем на 45 градусов, нам нужно, чтобы выходное изображение было в sqrt(2) раз больше входного размера, чтобы не потерять какие-либо данные, для меньших вращений мы могли бы сделать с меньшим выходным размером).

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

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

Обратите внимание, что код, связанный с, совсем не эффективен Он не выделяет выходную матрицу и, следовательно, многократно изменяет размер выходного массива при записи в него, что очень дорого. Это также может предварительно вычислить некоторые вычисления, выполненные в цикле, такие вещи, как cos(thet) не меняются между итерациями цикла.

...