先看一张效果图
![43c2532ec369f496f8769f988adb9cf7.png](https://i-blog.csdnimg.cn/blog_migrate/3ec1063ee89ea2b49ae562653a15f13c.jpeg)
手绘化的头条图片
python大量的第三方接口使得它用起来很方便,因为它有很多有趣的操作,获得了大量的人的喜爱。下面我们就做一件有趣的事情,将图片手绘化。下面是两种方式去操作。
cv2模块实现
准备工作,模块的安装,我的python版本是3.7,安装命令如下:
pip install opencv_pythonpip install numpy
这里命令行下载的速度太慢了,建议去官网搜索相关模块进行手动下载安装,安装命令如下:
pip install your_whl_file
安装完毕,就开始操作了,操作之前先看几个函数。
读取图片:
cv2.imread(filepath,flags)
filepath:文件的绝对路径
flags标志位如下:
- cv2.IMREAD_COLOR:默认参数,读入一副彩色图片,忽略alpha通道
- cv2.IMREAD_GRAYSCALE:读入灰度图片
- cv2.IMREAD_UNCHANGED:读入完整图片,包括alpha通道
颜色转换:
cv2.cvtColor(image,flags)
image:是需要转化的图片
flags是转化的格式:
- cv2.COLOR_BGR2GRAY :BGR和灰度图的转换使用
- cv2.COLOR_BGR2HSV:BGR和HSV的转换使用
中值滤波:
cv2.medianBlur(img,value)
image:是需要转化的图片
value:当前的方框尺寸
图片保存:
cv2.imwrite(file,image,num)
file:保存后的文件
image:是需要转化的图片
num:对jpg图片的保存质量,默认为95,损失了图片质量,可以写100
主要函数介绍完毕,上代码吧。
import cv2import osdef cartoonise(picture_name): imgInput_FileName = r"C:甥敳獲ZXDDesktop77" + picture_name imgOutput_FileName = r"C:甥敳獲ZXDDesktop7788" + picture_name img_rgb = cv2.imread(imgInput_FileName) #读取图片 #转换为灰度并且使其产生中等的模糊 a = cv2.cvtColor(img_rgb,cv2.COLOR_BGR2GRAY) img_blur = cv2.medianBlur(a, 3) #检测到边缘并且增强其效果 img_edge = cv2.adaptiveThreshold(img_blur,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,7,7) # 保存转换后的图片 cv2.imwrite(imgOutput_FileName, img_edge)ImageList = [] #建立空的List#循环读取"D:pythonpracticeImage"中的文件名for filename in os.listdir(r"C:甥敳獲ZXDDesktop77"): if "jpg" in filename: ImageList.append(filename) #将文件名添加到ImageListfor i in ImageList: #循环读取ImageList中的文件名,将其进行卡通化处理 print("正在卡通化" + i) cartoonise(i)
![0269bd85c24cd94716a775c3be7fdfbb.png](https://i-blog.csdnimg.cn/blog_migrate/87f898c7700d14cfbbed71294151f11a.jpeg)
运行执行结果
Image模块实现
不多少了,遍历目录下的所有图片生成灰度图和手绘化图,直接上代码。
from PIL import Imageimport numpy as npimport os# 为了定义好俯视角el、方位角az与深度,将三个变量定义在前面便于调节def picture_cge(picture_name): input_name = r"C:甥敳獲ZXDDesktop77" + picture_name imgOutput_FileName = r"C:甥敳獲ZXDDesktop7788" + picture_name el = np.pi / 2.2 az = np.pi / 4. dep = 90. # 转化为灰度图 im = Image.open(input_name) im = im.convert('L') im.save(r"C:甥敳獲ZXDDesktop7788" + picture_name[:-4] + "灰度." + "jpg") # 取梯度,对图像进行重构 a = np.asarray(im).astype('float') grd = np.gradient(a) grd_x, grd_y = grd grd_x = grd_x * dep / 100. grd_y = grd_y * dep / 100. # 制造光源效果 dx = np.cos(el) * np.cos(az) dy = np.cos(el) * np.sin(az) dz = np.sin(el) uni_x = grd_x uni_y = grd_y uni_z = 1 b = 255 * (dx * uni_x + dy * uni_y + dz * uni_z) b = b.clip(0, 255) put_picture = Image.fromarray(b.astype('uint8')) put_picture.save(r"C:甥敳獲ZXDDesktop7788" + picture_name[:-3] + "jpg")ImageList = []for filename in os.listdir(r"C:甥敳獲ZXDDesktop77"): if "jpg" in filename: ImageList.append(filename)for i in ImageList: print("正在手绘化" + i) picture_cge(i)
![6ee8d461836df61ef976db4a017502fc.png](https://i-blog.csdnimg.cn/blog_migrate/a8fe22b2637ceff43d8cb6c986009c84.jpeg)
手绘化图和灰度图
到这里就结束了,喜欢的点赞、评论、转发、关注,谢谢!
![62f0971e5c055a3ed9169d0d6926f0a2.gif](https://i-blog.csdnimg.cn/blog_migrate/cb7ed79a99d8dfb9a0b9d30458be2092.gif)
谢谢