import cv2 import numpy as np import matplotlib.pyplot as plt def edge_mask(img, line_size=7, blur_value=7): gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) 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 def color_quantization(img,k): data = np.float32(img).reshape((-1,3)) criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER,20,0.001) 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 cartoon(img,params=[7,7,11]): edges = edge_mask(img, params[0], params[1]) res = color_quantization(img,params[2]) blurr = cv2.bilateralFilter(res, d=7, sigmaColor=200,sigmaSpace=200) c = cv2.bitwise_and(blurr,blurr,mask=edges) return c