Восстановите изображения, используя рисование изображений с помощью 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 с большим объемом данных, которые могут не работать с непредвиденными данными.

использованная литература

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