Принцип реализации эскиза
Чтобы добиться эффекта обработки изображения, нам сначала нужно освоить конкретные принципы его реализации.
Я считаю, что пользователи, которые часто используют PS, должны были обрабатывать эффект эскизов с помощью этого программного обеспечения. Затем мы можем обратиться к шагам для достижения эффекта эскиза в том же PS:
- Обесцвечивание: поскольку эскиз доступен только в черно-белом цвете, цветное изображение необходимо преобразовать в оттенки серого.
- Дублируйте слой «Обесцвеченный» и инвертируйте его. Формула обратного цвета: Y(i,j)=255-X(i,j)
- Размытие по Гауссу для отраженного изображения
- Режим наложения размытого изображения выберите эффект цветового уклонения
Формула цветового осветления выглядит следующим образом:
С=МИН(А+(А+В)/(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 — перевернутое изображение.