Создание различных фильтров с помощью OpenCV/Python


Введение

Здравствуйте! Недавно я решил добавить больше фильтров к моему предыдущему примеру фильтрации мультфильмов, который можно найти здесь:

https://dev.to/ethand91/cartoon-filter-using-opencv-and-python-3nj5

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

Тогда давайте добавим еще несколько крутых фильтров! 😎


Фильтр HDR

Фильтр с эффектом HDR прост в реализации, мы просто используем метод detailEnhance:

def HD (image):
  hdrImage = cv2.detailEnhance(image, sigma_s = 12, sigma_r = 0.15)

  return hdrImage
Войти в полноэкранный режим Выход из полноэкранного режима

sigma_s контролирует степень сглаживания изображения, а sigma_r важна для сохранения краев при сглаживании изображения.


Фильтр “Карандашный набросок” Масштабный/Цветовой фильтр

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

def pencil (image):
  sk_gray, skColor = cv2.pencilSketch(image, sigma_s = 60, sigma_r = 0.07, shade_factor = 0.1)

  return skColor
Вход в полноэкранный режим Выход из полноэкранного режима


Фильтр сепии

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

def sepia (image):
  # Convert to float to prevent loss
  sepiaImage = np.array(image, dtype = np.float64)
  sepiaImage = cv2.transform(sepiaImage, np.matrix([[0.272, 0.543, 0.131], [0.349, 0.686, 0.168], [0.393, 0.769, 0.189]]))
  sepiaImage[np.where(sepiaImage > 255)] = 255
  sepiaImage = np.array(sepiaImage, dtype = np.uint8)

  return sepiaImage
Вход в полноэкранный режим Выход из полноэкранного режима


Фильтр резкости

Для повышения резкости изображения мы воспользуемся методом filter2D и применим следующее ядро.

def sharpen (image):
  kernel = np.array([[-1, -1, -1], [-1, 9.5, -1], [-1, -1, -1]])
  sharpenedImage = cv2.filter2D(image, -1, kernel)

  return sharpenedImage
Вход в полноэкранный режим Выйти из полноэкранного режима


Фильтр яркости

Для настройки яркости изображения мы воспользуемся методом convertScaleAbs.

def brightness (image, betaValue):
  brightImage = cv2.convertScaleAbs(image, beta = betaValue)

  return brightImage
Вход в полноэкранный режим Выйти из полноэкранного режима

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


Фильтр градаций серого

Фильтр оттенков серого – еще один простой в реализации фильтр, для которого достаточно использовать метод cvtColor.

def grayScale (image):
  grayImage = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

  return grayImage
Вход в полноэкранный режим Выход из полноэкранного режима


Инвертирующий фильтр

Еще один простой в реализации фильтр, в котором мы просто инвертируем значения пикселей с помощью метода bitwise_not.

def invert (image):
  invertedImage = cv2.bitwise_not(image)

  return invertedImage 
Вход в полноэкранный режим Выход из полноэкранного режима


Сохранение изображений

После того как мы определили все методы фильтрации, было бы обидно не использовать их.
Отредактируйте главный метод, чтобы включить в него следующее:

cartoonImage = cartoonize(image)
invertedImage = invert(image)
grayImage = grayScale(image)
brightImage = brightness(image, 60)
darkerImage = brightness(image, -60)
sharperImage = sharpen(image) 
sepiaImage = sepia(image)
pencilImage = pencil(image)
hdrImage = HD(image)
Войти в полноэкранный режим Выйти из полноэкранного режима

Наконец, мы можем записать вывод в файл, добавив их к основному методу:

cv2.imwrite("output.jpg", cartoonImage)
cv2.imwrite("inverted.jpg", invertedImage)
cv2.imwrite("grayscale.jpg", grayImage);
cv2.imwrite("brighter.jpg", brightImage)
cv2.imwrite("darker.jpg", darkerImage)
cv2.imwrite("sharper.jpg", sharperImage)
cv2.imwrite("sepia.jpg", sepiaImage)
cv2.imwrite("pencil.jpg", pencilImage)
cv2.imwrite("hdrImage.jpg", hdrImage)
Войти в полноэкранный режим Выйти из полноэкранного режима

Готово!

Не стесняйтесь изменять значения и т.д., чтобы увидеть, какие различные эффекты вы можете сделать. 🥳


Заключение

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

Я сделаю еще один пост, если мне удастся найти больше интересных/прикольных фильтров. 🥸

Репо можно найти здесь:
https://github.com/ethand91/opencv-cartoon-filter


Нравится моя работа? Я пишу на разные темы, если вы хотите видеть больше, пожалуйста, ставьте лайк и следите за мной.
Также я люблю кофе.

Оцените статью
Procodings.ru
Добавить комментарий