本博文说明如何将图片转为卡通风格。
1. 导入依赖模块
在编程的第一步首先要导入依赖库,在这个图像转换成卡通风格的程序中需要包含3个模块,分别是openCV,numpy,matpoltlib。
import cv2
import numpy as np
import matplotlib.pyplot as plt
2. 加载并绘制原始图片
第二步是使用imread函数读取图片,再使用cvtColor函数将图片转换为RGB格式。随后使用imshow函数绘制图片。代码如下所示:
img = cv2.imread("image.jpg")
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
plt.figure(figsize=(10,10))
plt.imshow(img)
plt.axis("off")
plt.title("Original Image")
plt.show()
3. 将图片转换为灰度
这一步是使用cvColor函数将图片转换为灰度图。做这一步的原因是使用灰度图可以减少程序的时间复杂度。
代码如下所示。
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = cv2.medianBlur(gray, 5)
plt.figure(figsize=(10,10))
plt.imshow(gray,cmap="gray")
plt.axis("off")
plt.title("Grayscale Image")
plt.show()
4. 获取边缘图片
图片边缘化能够使得处理更加简单,从灰度图像中获取边缘图片,然后将此边缘图片进行卷积网络。
使用adaptiveThreshold进行参数的设置,从而获取边缘图片,代码如下:
edges = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 9, 9)
plt.figure(figsize=(10,10))
plt.imshow(edges,cmap="gray")
plt.axis("off")
plt.title("Edged Image")
plt.show()
5. 将图片转换为卡通风格
最后使用bilateralFilter函数进行卷积过滤。通过逐位运算,使用原始图片和卷积图片最终生成卡通图。
代码如下:
color = cv2.bilateralFilter(img, 9, 250, 250)
cartoon = cv2.bitwise_and(color, color, mask=edges)
plt.figure(figsize=(10,10))
plt.imshow(cartoon,cmap="gray")
plt.axis("off")
plt.title("Cartoon Image")
plt.show()
最后输出的卡通图片
下面展示不同原始图片转换为不同版本的图片。
试下其他图片: