用Python+pywin32模块实现绘制原神女性角色珊瑚宫图片,画画第一弹
Posted Cooci
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用Python+pywin32模块实现绘制原神女性角色珊瑚宫图片,画画第一弹相关的知识,希望对你有一定的参考价值。
前言
Python+pywin32模块实现绘制原神女性角色珊瑚宫图片
开发工具
Python版本:3.6.4
相关模块:
cv2模块;
numpy模块;
pywin32模块;
bs4模块;
以及一些Python自带的模块。
其他:
potrace
效果展示
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块即可。
原理简介
一. 实现步骤
首先读入原图:
img_path = \'./test.jpg\'
img_bit = cv2.imread(img_path)
# 画图时的颜色数
K = 32
# 避免照片过大
if img_bit.shape[0] > GetSystemMetrics(1):
width = int(img_bit.shape[1] * ((GetSystemMetrics(1) - 50) / img_bit.shape[0]))
height = GetSystemMetrics(1) - 50
img_bit = cv2.resize(img_bit, (width, height))
其次将原图像的颜色数量通过K均值聚类降低到指定的数量,K值越大,运行速度越慢,但效果越佳:
data = img_bit.reshape((-1, 3))
data = np.float32(data)
# 聚类迭代停止的模式(停止的条件, 迭代最大次数, 精度)
criteria = (cv2.TERM_CRITERIA_EPS, 10, 1.0)
# 数据, 分类数, 预设的分类标签, 迭代停止的模式, 重复试验kmeans算法次数, 初始类中心的选择方式
compactness, labels, centers = cv2.kmeans(data, K, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)
centers = np.uint8(centers)
data_compress = centers[labels.flatten()]
img_new = data_compress.reshape(img_bit.shape)
每次取出聚类结果中的一种颜色并利用potrace将其转为SVG格式的图形,再解析该格式并用Python自带的turtle库画出来:
for center in centers:
count += 1
print(\'[INFO]: Drawing %dth color...\' % count)
part = cv2.inRange(img_new, center, center)
part = cv2.bitwise_not(part)
cv2.imwrite(\'.tmp.bmp\', part)
os.system(\'potrace.exe .tmp.bmp -s --flat\')
if count == 1:
drawSVG(\'.tmp.svg\', \'#%02x%02x%02x\' % (center[2], center[1], center[0]), True)
else:
drawSVG(\'.tmp.svg\', \'#%02x%02x%02x\' % (center[2], center[1], center[0]), False)
二. SVG格式
SVG,即可缩放矢量图形,是一种基于可扩展标记语言(XML),用于描述二维矢量图形的图形格式。SVG主要支持以下几种显示对象:
1.矢量显示对象,基本矢量显示对象包括矩形、圆、椭圆、多边形、直线、任意曲线等;
2.嵌入式外部图像,包括PNG、JPEG、SVG等;
3.文字对象。
更多关于SVG的技术细节请参考:
http://www.w3school.com.cn/svg/svg_intro.asp
三. Turtle库
这里推荐一份turtle库的文档:
https://www.rddoc.com/doc/Python/3.6.0/zh/library/turtle/
四. 贝塞尔曲线
画图时用到了贝塞尔曲线,这里简单介绍一下。
贝塞尔曲线的数学基础是伯恩斯坦多项式,其得名于法国工程师Pierre Bézier。
贝塞尔曲线控制简便却具有极强的描述能力,因此在工业设计领域应用广泛;同时,贝塞尔曲线在矢量图形学领域也占有重要的地位。今天我们最常见的一些矢量绘图软件(例如Flash,CorelDraw,PS等等)均提供了绘制贝塞尔曲线的功能。
线性公式:
给定点P0、P1,线性贝塞尔曲线是一条两点之间的直线,确定方式如下:
其实就是线性插值。
二次方公式:
给定点P0、P1和P2,二阶贝塞尔曲线的路径确定方式如下:n次方公式:
给定点P0到Pn,n阶贝塞尔曲线的路径确定方式如下:贝塞尔曲线的绘制方式(以二阶为例):
假设平面内不共线的三个点如下图所示:
在AB上选一点D,BC上选一点E,使得:
AD:AB=BE:BC。
连接DE:
在DE上选一点F,使得:
AD:AB=BE:BC=DF:DE
保证AD,AB,BE,BC,DF,DE之间的比例关系不变,让D点从A点运动到B点,则所有的点F构成的曲线即为二阶贝塞尔曲线:
n阶贝塞尔曲线的绘制方式类似,例如三阶和四阶:
文章到这里就结束了,感谢你的观看,下篇文章分享Excel中生成小姐姐
为了感谢读者们,我想把我最近收藏的一些编程干货分享给大家,回馈每一个读者,希望能帮到你们。
干货主要有:
① 2000多本Python电子书(主流和经典的书籍应该都有了)
② Python标准库资料(最全中文版)
③ 项目源码(四五十个有趣且经典的练手项目及源码)
④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)
⑤ Python学习路线图(告别不入流的学习)
All done~详见个人主页简介或私信获取完整源代码。。
以上是关于用Python+pywin32模块实现绘制原神女性角色珊瑚宫图片,画画第一弹的主要内容,如果未能解决你的问题,请参考以下文章
Python:通过pywin32模块批量将rtf或docx另存为doc格式