在 Python 中使用 OpenCV 将图像转换为卡通风格

在 Python 中使用 OpenCV 将图像转换为卡通风格

目前市场上有许多专业的漫画化应用程序,但大多数都不是免费软件。为了获得基本的卡通效果,我们只需要双边滤波器和一些边缘检测机制。双边滤波器将减少颜色调板,这对于卡通外观至关重要,并且边缘检测可产生粗体轮廓。

我们将使用 openCV python 库将 RGB 彩色图像转换为卡通图像。

算法

  • 首先应用双边滤波器以减少图像的颜色调板。
  • 然后将实际图像转换为灰度图像。
  • 现在在灰度图像中应用中值模糊以减少图像噪声。
  • 使用自适应阈值创建来自灰度图像的边缘掩码。
  • 最后将步骤 1 生成的彩色图像与步骤 4 生成的边缘掩码组合起来。

原始图像

在 Python 中使用 OpenCV 将图像转换为卡通风格

示例

# 步骤 1
# 使用双边滤波进行边缘感知平滑处理。
import cv2

num_down = 2 # 缩小图像的次数
num_bilateral = 7 # 双边滤波的次数

img_rgb = cv2.imread("myCat.jpg")

# 使用高斯金字塔缩小图像
img_color = img_rgb
for _ in range(num_down):
   img_color = cv2.pyrDown(img_color)

# 多次应用小型双边滤波器代替
# 应用一个大型过滤器
for _ in range(num_bilateral):
img_color = cv2.bilateralFilter(img_color, d=9, sigmaColor=9, sigmaSpace=7)

# 将图像放大到原始尺寸
for _ in range(num_down):
   img_color = cv2.pyrUp(img_color)

# 步骤 2 和 3
# 使用中值滤波器降噪
# 转换为灰度并应用中值模糊
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY)
img_blur = cv2.medianBlur(img_gray, 7)

# 步骤 4
# 使用自适应阈值创建边缘掩码
# 检测和增强边缘
img_edge = cv2.adaptiveThreshold(img_blur, 255,
   cv2.ADAPTIVE_THRESH_MEAN_C,
   cv2.THRESH_BINARY,
   blockSize=9,
   C=2)

# 步骤 5
# 将彩色图像与边缘掩码组合,并显示图片
# 转换回彩色,与颜色图像进行 bit-AND 运算
img_edge = cv2.cvtColor(img_edge, cv2.COLOR_GRAY2RGB)
img_cartoon = cv2.bitwise_and(img_color, img_edge)

# 显示结果
cv2.imshow("myCat_cartoon", img_cartoon)

结果

在 Python 中使用 OpenCV 将图像转换为卡通风格

总结

这是一个非常基本的漫画化算法,但它可以产生相当令人印象深刻的结果。此外,由于我们使用了 openCV,因此您可以轻松地将此算法应用于视频流或摄像头捕获。

尝试将算法调整为自己的需求吧,如更改阈值、滤波器参数等,以获得所需的效果。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

Python 教程