Восстановите изображения, используя рисование изображений с помощью OpenCV в Python, используя четыре различных метода с помощью одной строки кода.
Inpainting - это процесс, при котором поврежденные или отсутствующие части произведения искусства заполняются для его завершения. Современные методы рисования изображений выполняются с использованием GAN, где сложные модели обучаются на больших объемах данных. Кроме того, модель может пострадать, если представленные данные будут совершенно другими. В отличие от этого, рисование изображения также может быть выполнено с помощью операций обработки изображения, что также с помощью всего одной строки кода с использованием OpenCV. В этой статье мы будем реализовывать четыре различных типа методов рисования изображений и сравнивать их результаты на основе PSNR и SSIM. Более того, в этой статье я буду следовать другому подходу, то есть сначала представлю код и результаты, а затем описание метода.
Мы будем использовать три алгоритма, а именно, на основе Навье-Стокса, метод Александру Телеа, основанный на методе быстрого марша, и быструю и лучшую итерацию алгоритма быстрой частотно-селективной реконструкции.
Оглавление
- Требования
- Код
- Результаты
- Обзор метода
Требования
OpenCV Contrib требуется для двух из этих методов, поэтому его можно установить с помощью pip:
pip install opencv-contrib-python==4.3.0.36
Код
Нам нужно искаженное изображение и маска, где должно происходить закрашивание. Для методов Навье-Стокса и Телеа белая часть маски представляет собой область, которую нужно закрасить, а для метода FSR черные пиксели – это те, которые закрашиваются.
Отдельные строки кода, необходимые для рисования изображения:
import cv2 #distorted_img: The image on which inpainting has to be done. #mask: Black mask with white pixels to be inpainted res_NS = cv2.inpaint(distort_img, mask, 3, cv2.INPAINT_NS) res_TELEA = cv2.inpaint(distort_img, mask, 3, cv2.INPAINT_TELEA) res_FSRFAST = distorted_img.copy() res_FSRBEST = distorted_img.copy() mask1 = cv2.bitwise_not(mask) cv2.xphoto.inpaint(distort, mask1, res_FSRFAST, cv2.xphoto.INPAINT_FSR_FAST) cv2.xphoto.inpaint(distort, mask1, res_FSTBEST, cv2.xphoto.INPAINT_FSR_BEST)
Результаты
Я использовал три изображения размером 756x1008. Результаты всех четырех методов показаны ниже.
Время, необходимое для каждого метода для каждого изображения в секундах, составляет:
Значение PSNR и SSIM также было рассчитано для реконструированного изображения по сравнению с исходным с использованием следующего кода:
import cv2 from skimage.metrics import structural_similarity as SSIM psnr = cv2.PSNR(img, recon, 255) ssim = SSIM(img, recon, multichannel=True)
Результаты были следующими:
Кроме того, Genser et al. опубликовали бумагу, сравнивающую эти методы, где они использовали наборы изображений Kodak и Tecnick вместе с пятью различными масками ошибок, и их результаты показаны ниже:
Полный использованный код приведен ниже, где показан пример маски, где область белого цвета должна быть закрашена на исходном изображении и наложена на исходное изображение.
Обзор методов
Телея
Этот метод был представлен Александру Телеа в его статье Техника рисования изображений, основанная на методе быстрого марша в 2004 году. Хороший обзор этого содержится в документации OpenCV, которую я цитировал здесь.
Рассмотрим область изображения, которую нужно закрасить. Алгоритм начинается с границы этой области и идет внутрь области, постепенно заполняя сначала все, что находится на границе. Для закрашивания требуется небольшая окрестность вокруг пикселя в окрестности. Этот пиксель заменяется нормализованной взвешенной суммой всех известных пикселей в окрестности. Выбор весов – важный момент. Больший вес придается пикселям, расположенным вблизи точки, вблизи нормали к границе и пикселям, лежащим на граничных контурах. Как только пиксель закрашен, он перемещается к следующему ближайшему пикселю с использованием метода быстрого перехода. FMM гарантирует, что те пиксели рядом с известными пикселями закрашиваются первыми, так что это просто работает как ручная эвристическая операция.
Навье-Стокс
Представлено Bertalmio et al. в своей статье Навье-Стокса, гидродинамика и рисование изображений и видео», представленной еще в 2001 году. Снова цитируя документацию OpenCV:
Этот алгоритм основан на гидродинамике и использует уравнения в частных производных. Основной принцип — эвристический. Сначала он проходит по ребрам от известных областей к неизвестным областям (поскольку ребра должны быть непрерывными). Он продолжает изофоты (линии, соединяющие точки с одинаковой интенсивностью, точно так же, как контуры соединяют точки с одинаковой высотой), сопоставляя векторы градиента на границе закрашиваемой области. Для этого используются некоторые методы гидродинамики. Как только они получены, цвет заполняется, чтобы уменьшить минимальную дисперсию в этой области.
Алгоритм быстрой частотно-селективной реконструкции
Сигнал искаженного блока экстраполируется, используя в качестве опоры известные образцы и уже реконструированные пиксели. Этот алгоритм итеративно генерирует общую комплексную модель сигнала, который необходимо экстраполировать как взвешенную суперпозицию базисных функций Фурье. Важной особенностью FSR является тот факт, что расчеты проводятся в области Фурье, что приводит к быстрой реализации.
В заключение, быстрая реализация FSR обеспечивает отличный баланс между скоростью и точностью, и эти методы дают хорошие результаты даже при сильном искажении, поэтому они могут предоставить разумную альтернативу GAN с большим объемом данных, которые могут не работать с непредвиденными данными.
использованная литература
- https://docs.opencv.org/master/df/d3d/tutorial_py_inpainting.html
- https://docs.opencv.org/4.2.0/dc/d2f/tutorial_xphoto_inpainting.html
- https://github.com/opencv/opencv_contrib/files/3730212/inpainting_comparison.pdf
Как уже упоминалось выше, в этой статье я использовал другую стратегию. В приведенной ниже статье используется традиционный подход. Было бы здорово узнать, какую стратегию вы предпочитаете.