在 Python 中使用 OpenCV 将图像转换为卡通风格
目前市场上有许多专业的漫画化应用程序,但大多数都不是免费软件。为了获得基本的卡通效果,我们只需要双边滤波器和一些边缘检测机制。双边滤波器将减少颜色调板,这对于卡通外观至关重要,并且边缘检测可产生粗体轮廓。
我们将使用 openCV python 库将 RGB 彩色图像转换为卡通图像。
算法
- 首先应用双边滤波器以减少图像的颜色调板。
- 然后将实际图像转换为灰度图像。
- 现在在灰度图像中应用中值模糊以减少图像噪声。
- 使用自适应阈值创建来自灰度图像的边缘掩码。
- 最后将步骤 1 生成的彩色图像与步骤 4 生成的边缘掩码组合起来。
原始图像
示例
# 步骤 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)
结果
总结
这是一个非常基本的漫画化算法,但它可以产生相当令人印象深刻的结果。此外,由于我们使用了 openCV,因此您可以轻松地将此算法应用于视频流或摄像头捕获。
尝试将算法调整为自己的需求吧,如更改阈值、滤波器参数等,以获得所需的效果。