话不多说,先上几张我用这段代码生成的效果对比图,你就知道有多香了:
原图是精致的写真照,经过处理后,人物的轮廓、发丝和衣物纹理都清晰地保留了下来,瞬间有了艺术感。

即使是普通的自拍,也能秒变文艺范儿的素描头像,用来当头像或者发朋友圈,绝对吸睛。

不只是人像,像自行车这样的静物也能完美转换,金属的光泽和轮胎的纹理都被精准地勾勒出来。

这个效果的实现,其实是模拟了画家创作素描的过程,主要分为以下几步:
我已经把完整的代码写好了,你只需要复制到本地就能运行,亲测有效!
# encoding=utf8'''Python-opencv批量将任意图片转化为素描图'''# 导入包import cv2import numpy as npimport os# 定义方法def dodgeNaive(image, mask):# 确定输入图像的形状width, height = image.shape[:2]# 准备与图像大小相同的输出参数blend = np.zeros((width, height), np.uint8)for col in range(width):for row in range(height):# 对每个像素执行此操作if mask[col, row] == 255:# 避免被零除blend[col, row] = 255else:# 将图像像素值移位8位# 除以掩模的倒数tmp = (image[col, row] << 8) / (255 - mask)# print('tmp={}'.format(tmp.shape)) # 调试代码# 确保结果值保持在范围内if tmp.any() > 255:tmp = 255blend[col, row] = tmpreturn blenddef dodgeV2(image, mask):return cv2.divide(image, 255 - mask, scale=256)def burnV2(image, mask):return 255 - cv2.divide(255 - image, 255 - mask, scale=256)def rgb_to_sketch(src_image_name, dst_image_name):img_rgb = cv2.imread(src_image_name)img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)# 读取图片时直接转换操作# img_gray = cv2.imread('example.jpg', cv2.IMREAD_GRAYSCALE)img_gray_inv = 255 - img_grayimg_blur = cv2.GaussianBlur(img_gray_inv, ksize=(21, 21),sigmaX=0, sigmaY=0)img_blend = dodgeV2(img_gray, img_blur)# cv2.imshow('original', img_rgb) # 调试转换1# cv2.imshow('gray', img_gray) # 调试转换2# cv2.imshow('gray_inv', img_gray_inv) # 调试转换3# cv2.imshow('gray_blur', img_blur) # 调试转换4# cv2.imshow("pencil sketch", img_blend) # 调试转换5cv2.waitKey(0)cv2.destroyAllWindows()cv2.imwrite(dst_image_name, img_blend)def imageSketch(imagepath, squarepath):'''读取图片并进行批量素描图转换'''files = os.listdir(imagepath) # 读取指定目录中的所有文件for f in files:file_p = os.path.join(imagepath, f) # 图片原始位置squar_p = os.path.join(squarepath, f) # 素描图保存位置if not os.path.exists(squarepath):os.mkdir(squarepath) # 如果目不存在就创建rgb_to_sketch(file_p, squar_p)print(file_p, '==>' ,squar_p)if __name__ == '__main__':# 存放待处理图片的目录imagepath = r'D:\Test\image'# 图片处理结果保存目录squarepath = r'D:\Test\square'# 执行方法imageSketch(imagepath, squarepath)# src_image_name = r'D:\Test\image\24e4 (1).jpeg'# dst_image_name = r'D:\Test\square\24e4 (1).jpeg'# rgb_to_sketch(src_image_name, dst_image_name)
准备工作
sketch.py,建议放在 C 盘根目录下方便查找。pip install numpypip install opencv-python
修改路径
imagepath 和 squarepath 这两个变量。imagepath 修改为你存放待处理图片的文件夹路径。squarepath 修改为你希望保存素描图的文件夹路径。运行代码
Win + R,输入 cmd 打开命令行。sketch.py 所在的目录,例如:cd C:\python sketch.py 并回车,程序就会自动批量处理图片了!