Я работаю над алгоритмом photographic mosaic. Есть 4 этапов:Быстрое сравнение суб-изображений в C#
- Определить регионы сегмента
- Определить стоимость каждого кандидат изображений в каждой области сегмента
- Определить лучшее назначение каждого кандидат изображений для каждого региона сегмента
- Рендера фотографической мозаики ,
Весь процесс относительно прост, однако этап 2 включает в себя сравнение n изображений с m сегментами с n >> m. Это, безусловно, самый продолжительный шаг.
Вот процесс, который я пройти для каждого сегмента кандидата пары:
- Определить, если кандидат изображения совместим с размерами сегмента. Если нет, назначение считается запрещенным.
- Использование промежуточного дополнительного изображения
Bitmap
, созданного с помощьюGraphics.DrawImage(Image, Rectangle, Rectangle, GraphicsUnit)
, преобразует данные растрового изображения в красные, зеленые и синиеint[,]
матрицы для сегмента исходного изображения. Я использую методLockBits()
вместо методаGetPixel()
, поскольку он намного быстрее. Чтобы уменьшить время вычисления, эти матрицы составляют примерно 3x3 или 5x5, а не полные размеры исходного сегмента. - Я делаю тот же процесс с изображением кандидата, создавая красные, зеленые и синие матрицы 3x3 или 5x5
int[,]
. - Начиная с
cost = 0
, я добавляю величину разницы красных, зеленых и синих значений сегментов изображения источника и кандидата к стоимости. Сумма этих абсолютных разниц - это стоимость назначения.
В действительности, я проверяю каждый кандидат образ со всеми 16 RotateFlipType
преобразований, так что есть 16 * п * т сравнения нужно, где п = число сегментов и т = число регионов размещения.
Мне интересно, могу ли я сделать БПФ каждого изображения и вместо сравнения каждого пикселя, я сравниваю только низкочастотные компоненты, так как высокочастотные компоненты существенно не влияют на выход. С другой стороны, многие накладные расходы, такие как получение суб-изображений и преобразование их в матрицы, все еще существуют, и моя кишка говорит мне, что спектральное сравнение будет медленнее, чем базовое сравнение значений 25 int
.
Если вы все-таки удается строчить БПФ/DCT на эквивалент 25 целых сравнений, обязательно отправьте документ в соответствующий журнал. ;) – spender
Вот пара вопросов, прежде чем я рискну ответить. Вам действительно нужно проверить ВСЕ вращение для изображений-кандидатов? Вы действительно хотите только перевернуть их вокруг вертикальной оси, правильно? Во-вторых, какую функцию вы минимизируете для каждого сегмента/кандидата? Из того, что я знаю об этих алгоритмах, вы можете сделать это одним из двух способов: либо сжать сегмент до 1 пикселя, повторно фильтруя его, а затем выбрать подходящие изображения, которые ближе всего соответствуют этому цвету или свести к минимуму разницу в цветовой гистограмме, которая каждый кандидат будет выполнять замену сегмента. – Ani
@spender, конечно. Я думаю, что ** возможным ** преимуществом подхода FFT было бы то, что я мог бы выполнить его в O (log_2 n) и избежать изменения размера исходных изображений до 3x3 или 5x5. – Ozzah