返回

OpenCV实现:重温怀旧与连环画滤镜效果

人工智能

在影像处理的世界里,滤镜扮演着至关重要的角色,赋予图像独特的风格和视觉体验。怀旧滤镜和连环画滤镜便是其中备受欢迎的两类效果,它们唤醒我们对过去的美好回忆或激发我们对艺术表现形式的探索。在这篇文章中,我们将深入探讨使用 OpenCV(一种强大的计算机视觉库)实现这两种滤镜的奥秘。

在深入探讨实现细节之前,我们先来了解一下这两类滤镜的本质。怀旧滤镜旨在营造一种怀旧感,通过褪色和增强对比度,让图像看起来仿佛饱经岁月洗礼。连环画滤镜则以其鲜明的线条和饱和的色彩而闻名,为图像增添一抹卡通感。

要使用 OpenCV 实现怀旧滤镜,我们需要调整图像的色彩空间。具体来说,我们将对 BGR(蓝色、绿色、红色)通道进行处理。我们可以通过以下步骤完成:

import cv2

# 读入图像
image = cv2.imread('input.jpg')

# 转换为 HSV 颜色空间
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

# 调整饱和度和值
hsv[:, :, 1] = hsv[:, :, 1] * 0.5
hsv[:, :, 2] = hsv[:, :, 2] * 0.75

# 转换回 BGR 颜色空间
image_nostalgic = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)

连环画滤镜的实现涉及到边缘检测和颜色量化。我们首先使用 Canny 边缘检测器提取图像的边缘,然后应用 K 均值聚类将颜色简化为有限的调色板。以下代码展示了这一过程:

import cv2

# 读入图像
image = cv2.imread('input.jpg')

# 边缘检测
edges = cv2.Canny(image, 100, 200)

# 颜色量化
Z = image.reshape((-1,3))
Z = np.float32(Z)
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
K = 8
ret,label,center=cv2.kmeans(Z,K,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)
center = np.uint8(center)
res = center[label.flatten()]
image_cartoon = res.reshape((image.shape))

将这些实现代码与 OpenCV 的强大功能相结合,我们可以轻松地为我们的图像应用怀旧和连环画滤镜。这些滤镜不仅为图像增添了艺术魅力,而且让我们有机会探索计算机视觉的奇妙世界。

为了方便应用,我们还可以将这些滤镜封装成一个函数,以便在不同的图像上轻松应用它们:

def apply_filters(image):
  # 怀旧滤镜
  hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
  hsv[:, :, 1] = hsv[:, :, 1] * 0.5
  hsv[:, :, 2] = hsv[:, :, 2] * 0.75
  image_nostalgic = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
  
  # 连环画滤镜
  edges = cv2.Canny(image, 100, 200)
  Z = image.reshape((-1,3))
  Z = np.float32(Z)
  criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
  K = 8
  ret,label,center=cv2.kmeans(Z,K,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)
  center = np.uint8(center)
  res = center[label.flatten()]
  image_cartoon = res.reshape((image.shape))
  
  return image_nostalgic, image_cartoon

现在,我们可以通过以下代码轻松地应用滤镜并查看结果:

# 读入图像
image = cv2.imread('input.jpg')

# 应用滤镜
image_nostalgic, image_cartoon = apply_filters(image)

# 显示结果
cv2.imshow('Nostalgic', image_nostalgic)
cv2.imshow('Cartoon', image_cartoon)
cv2.waitKey(0)
cv2.destroyAllWindows()

通过了解滤镜背后的原理并利用 OpenCV 的强大功能,我们能够实现怀旧和连环画滤镜,为我们的图像增添怀旧气息或艺术魅力。这不仅是一次创造性的旅程,更是一次探索计算机视觉神奇世界的机会。