Как переставить изображения по группам пикселей

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

Для этого мне нужно уметь анализировать изображение, разбивать его на группы и сдвигать эти группы.

  • Первая проблема уже начинается с определения групп пикселей. Они не должны быть выбраны случайным или идеальным полигоном / формой. Кто-нибудь знает алгоритм, который может различать различные текстуры / окружение / границы?
  • Затем мне нужно внести небольшие корректировки в области, чтобы они соответствовали новому изображению. Тогда области будут перемещены. Это будет не так сложно, как первая проблема.

Производительность не имеет большого значения; Сначала я должен заставить программу работать. Может потребоваться час, чтобы загрузить переход заранее или что-то еще;)

Кто-нибудь может дать мне совет, с чего начать или какие технологии /API я могу использовать? Я в порядке с большинством языков программирования, предпочтительно C#, VB, JavaScript, PHP, Java и т. Д. Платформа также не имеет значения.

Я знаю, это сложно, но я сделал все возможное, чтобы попытаться объяснить это. Есть идеи?

1 ответ

Решение

Ваша первая задача, группировка по цвету / текстуре / и т. Д. называется сегментация Есть много подходов и алгоритмов, чтобы сделать это, и ни один не является абсолютно лучше, чем все остальные, так как многие вещи в обработке изображений, лучший алгоритм зависит от вашего изображения и вашей конкретной функциональной / художественной цели.

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

Если вы не хотите исследовать и реализовывать все это, вам лучше использовать существующую библиотеку обработки изображений. Я предлагаю посмотреть на OpenCV и ключевое слово "сегментация". Вы получите реализации алгоритмов k-средних, водоразделов и сдвигов средних средств, которые, вероятно, представляют интерес для достижения вашего эффекта.

OpenCV - это C++, но он также имеет привязки в Java и Python, я думаю, и, вероятно, другие.

Для вашей второй задачи вам нужно сочетание движущихся и смешанных пикселей, но это проще, и вы можете сделать это "вручную", или взглянуть на алгоритмы морфинга.

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

Вы могли бы даже напрямую вызвать утилиту командной строки: xmorph, но она не выглядит переносимой или imagemagick (см. Этот скрипт), которая более современна, но не реализует настоящий алгоритм морфинга AFAIK.

Другие вопросы по тегам