软硬件环境
- windows 10 64bit
- nvidia gtx 1066
- opencv 4.4.0
原理
本文介绍如何使用 opencv 来实现图片的漫画效果。这里主要关心2个知识点,第一是边缘 edge,第二个是调色板 color palette。
示例代码
import sys
import cv2
import numpy as np
def color_quantization(img, k):
    # Transform the image
    data = np.float32(img).reshape((-1, 3))
    # Determine criteria
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 20, 0.001)
    # 采用K-Means方法
    ret, label, center = cv2.kmeans(data, k, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)
    center = np.uint8(center)
    result = center[label.flatten()]
    result = result.reshape(img.shape)
    return result
def edge_mask(img, line_size, blur_value):
    # 图片灰度化
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 降噪
    gray_blur = cv2.medianBlur(gray, blur_value)
    # 检测边缘
    edges = cv2.adaptiveThreshold(gray_blur, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, line_size, blur_value)
    return edges
if __name__ == '__main__':
    # 几个常量,可适当调整
    line_size = 7
    blur_value = 7
    total_color = 9
    # 读取图片
    img = cv2.imread(sys.argv[1])
    # 创建边缘mask
    edges = edge_mask(img, line_size, blur_value)
    # reduce colors
    img_color = color_quantization(img, total_color)
    # 双向过滤器降噪
    img_blurred = cv2.bilateralFilter(img_color, d=7, sigmaColor=200, sigmaSpace=200)
    # 将2者结合起来, 漫画效果来了
    img_cartoon = cv2.bitwise_and(img_blurred, img_blurred, mask=edges)
    cv2.imwrite('result.jpg', img_cartoon)执行上述代码
python demo.py branty.jpg


