Вращение и масштабирование массива 2D-пикселей

Я работаю над программой С# для обработки изображений (указанных как int[,])..

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

Как это можно сделать? (желательно с двумя уравнениями, одно для x и одно для y )


person Betamoo    schedule 24.12.2009    source источник


Ответы (4)


Посмотрите здесь. Это должно дать вам всю математику, стоящую за поворотом координат.

person Jon Seigel    schedule 24.12.2009
comment
ему понадобится хороший алгоритм интерполяции, если он не хочет, чтобы его изображения выглядели беспорядочно - person horseyguy; 25.12.2009
comment
Да, хотя он также заинтересован в масштабировании повернутого изображения — это позаботится об интерполяционной части. - person Jon Seigel; 25.12.2009

В Matrix у вас есть обе функции Повернуть(At) и Масштаб. Что бы еще узнать?

person serhio    schedule 24.12.2009

Вам нужно найти преобразование из результирующего массива в исходное изображение. Затем вы преобразуете точки в месте назначения в точки на исходном изображении и копируете. Сглаживание с помощью передискретизации также является опцией. Ваша матрица вращения также может применять масштабирование - просто умножьте матрицу на коэффициент масштабирования (предполагается, что это 2x2). Если вы делаете матрицу 3x3 для поворота, масштабирования и перемещения, просто умножьте верхнее левое 2x2 на коэффициент масштабирования.

И, наконец, с риском для скромности, вот ссылка на какой-то старый код TP6/asm DOS, который я написал для масштабирования в полноэкранном режиме. Странные вещи, которые торчат в сети: http://www.hornet.org/cgi-bin/scene-search.cgi?search=Paul%20H.%20Kahler

person phkahler    schedule 16.08.2010
comment
+1 Интересный метод вы выбрали в своем ротозумере (ваш метод № 4 упоминается в ридми). - person Engineer; 16.07.2011

Все, что вам нужно сделать, можно сделать с Bitmap изображениями в GDI+ (используя System.Drawing... пространства имен). Эти классы разработаны и оптимизированы для выполнения именно таких задач (манипуляции с изображениями). Есть ли какая-то конкретная причина, по которой вы не можете работать с настоящим Bitmap вместо int[,]? Вы даже можете написать очень простую процедуру для создания Bitmap из int[,], сделать все, что вам нужно, с Bitmap, а затем преобразовать его обратно в int[,] в конце.

person MusiGenesis    schedule 24.12.2009