python — перекрасить изображение

Я хотел бы реализовать алгоритм перекрашивания изображения, чтобы получить результаты, аналогичные показанным здесь:

http://www.morethantechnical.com/2010/06/24/image-recoloring-using-gaussian-mixture-model-and-expectation-maximization-opencv-wcode/

но с использованием Python. Однако я не уверен, с чего начать. Я играл с OpenCV, но функции, упомянутые в статье (максимизация ожидания и GMM), похоже, недоступны в Python API. Может несколько указать мне в правильном направлении, какие инструменты/библиотеки я должен использовать?


person n.jmurov    schedule 24.04.2015    source источник
comment
Запрос внешних ресурсов (библиотек/инструментов) считается вопросом не по теме.   -  person ρss    schedule 24.04.2015
comment
Первый поисковый запрос Google, который я получил, это scikit-image.org.   -  person LittlePanda    schedule 24.04.2015
comment
scikit-image, похоже, не имеет функций EM и GMM. Возможно, вы имели в виду scikit-learn. Однако меня больше интересует, как подойти к этой проблеме в целом, чтобы получить результаты, как показано на снимках экрана на этой веб-странице. На другой странице они также описывают другой метод — сопоставление гистограммы — но поскольку изображений нет, я не могу сказать, будут ли результаты такими же хорошими, как при использовании метода EM/GMM.   -  person n.jmurov    schedule 24.04.2015


Ответы (2)


Первый вариант — просто реализовать этот код на Python. Похоже, что все функции, упомянутые в статье, доступны в Python API. CvEM это просто EM (в модуле cv2):

>>> cv2.EM.__doc__
'EM([, nclusters[, covMatType[, termCrit]]]) -> <EM object>'

CvEMParams нет, потому что EM уже справляется с этим. Если вы ищете какую-либо другую функцию/объект, введите dir(cv2) в консоли Python, и, скорее всего, вы найдете то, что ищете. Довольно часто вещи в Python API имеют немного разные названия, но все же найти их не составляет большой проблемы. Обратите внимание, что некоторые вещи могут быть и в модуле cv2.cv.

Второй вариант — просто использовать этот код C++ и вызывать его из Python. Написание расширений для Python не очень просто, но если вы используете Boost.Python это не должно быть очень сложно. Написание модулей расширения — довольно популярная задача для Boost.Python, поэтому есть несколько хороших руководств, которые хорошо это описывают. Хорошей отправной точкой может быть это. Написание конвертера для cv::Mat ‹->numpy.array может быть проблемой, но здесь легко решение.

person cyriel    schedule 25.04.2015
comment
Большое спасибо, я думаю, что попробую первый вариант, так как в некоторых комментариях к этой статье упоминается ошибка компиляции в коде C++. Я бы не знал, как исправить их, если бы они произошли. - person n.jmurov; 25.04.2015

Ключевое слово, которое вы ищете, это «перенос цвета». Мне очень помогла эта ссылка http://www.pyimagesearch.com/2014/06/30/super-fast-color-transfer-images/

для Python установите библиотеку переноса цвета следующим образом;

pip install color_transfer

Использовать:

import color_transfer

destination_image = ...  # import your destination image here
source_image = ....  # import your source image here

new_image = color_transfer.color_transfer(source_image, destination_image)

И исходное, и целевое изображения должны иметь тип массива Numpy.

person Nuelsian    schedule 26.07.2017