OpenCV (49) --- добиться эффекта эскиза

OpenCV
OpenCV (49) --- добиться эффекта эскиза

Принцип реализации эскиза

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

Я считаю, что пользователи, которые часто используют PS, должны были обрабатывать эффект эскизов с помощью этого программного обеспечения. Затем мы можем обратиться к шагам для достижения эффекта эскиза в том же PS:

  1. Обесцвечивание: поскольку эскиз доступен только в черно-белом цвете, цветное изображение необходимо преобразовать в оттенки серого.
  2. Дублируйте слой «Обесцвеченный» и инвертируйте его. Формула обратного цвета: Y(i,j)=255-X(i,j)
  3. Размытие по Гауссу для отраженного изображения
  4. Режим наложения размытого изображения выберите эффект цветового уклонения

Формула цветового осветления выглядит следующим образом:

С=МИН(А+(А+В)/(255-В), 255)

C: Смешанные результаты

A: Пиксели после обесцвечивания

B: Пиксели после размытия по Гауссу

Реализация инверсных цветов

Поскольку в шагах есть операции с обратными цветами, как реализовать операции с обратными цветами в OpenCV?

Фактически, обратный цвет можно получить с помощью функции cv2.addWeighted(). Принцип таков: наложите изображение с пикселем 0 и изображение в градациях серого, а ширина и высота пиксельного изображения со всеми 0 должны соответствовать ширине и высоте исходного изображения, а его параметр гаммы должен быть установлен на 255.

Конкретный код выглядит следующим образом:

def sketch_effect(img):
    new_img = img.copy()
    h, w, n = img.shape
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    zero_img = np.zeros((h, w), dtype=np.uint8)
    gray = cv2.addWeighted(gray, -1, zero_img, 0, 255, 0)

Операция обратного цвета преобразуется в математическую формулу следующим образом:

dst=src1alpha+src2beta+gamma

фильтр Гаусса

С помощью приведенного выше кода мы реализовали первый этап преобразования изображения в оттенки серого, а также реализовали второй этап операции инвертирования цвета.

Далее все, что нам нужно сделать, это реализовать фильтр верхних частот. Фильтр верхних частот был представлен в 17 сообщениях блога о сглаживании изображений. Функция для реализации высокочастотной фильтрации: cv2.GaussianBlur().

Далее выполним над изображением третью операцию: фильтрацию верхних частот инвертированного цветного изображения. код показывает, как показано ниже:

def sketch_effect(img):
    h, w, n = img.shape
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    zero_img = np.zeros((h, w), dtype=np.uint8)
    anti_color = cv2.addWeighted(gray, -1, zero_img, 0, 255, 0)
    cv2.imshow("2", anti_color)
    grayGB = cv2.GaussianBlur(anti_color, (15, 15), 0)
    new_img = cv2.addWeighted(gray, 0.5, grayGB, 0.5, 0)
    return new_img


if __name__ == "__main__":
    img = cv2.imread("4.jpg")
    cv2.imshow("0", img)
    cv2.imshow("1", sketch_effect(img))
    cv2.waitKey()
    cv2.destroyAllWindows()

После запуска эффект следующий:

素描

Левый 0 — исходное изображение, средний 1 — реализованный эффект эскиза, а правый 2 — перевернутое изображение.