Введение
Здравствуйте! Недавно я решил добавить больше фильтров к моему предыдущему примеру фильтрации мультфильмов, который можно найти здесь:
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
Нравится моя работа? Я пишу на разные темы, если вы хотите видеть больше, пожалуйста, ставьте лайк и следите за мной.
Также я люблю кофе.