本文轉(zhuǎn)載至知乎ID:Charles(白露未晞)知乎個(gè)人專欄
下載W3Cschool手機(jī)App,0基礎(chǔ)隨時(shí)隨地學(xué)編程>>戳此了解
導(dǎo)語
本文轉(zhuǎn)載至知乎ID:Charles(白露未晞)知乎個(gè)人專欄
下載W3Cschool手機(jī)App,0基礎(chǔ)隨時(shí)隨地學(xué)編程>>戳此了解
分享一波最近Get的一種python畫畫的方法。
讓我們愉快地開始吧!
相關(guān)文件
百度網(wǎng)盤下載鏈接: https://pan.baidu.com/s/1ZBs4-DpVxXvoisAllwHV5Q
密碼: 9nei
開發(fā)工具
Python版本:3.6.4
相關(guān)模塊:
cv2模塊;
numpy模塊;
pywin32模塊;
bs4模塊;
以及一些Python自帶的模塊。
其他:
potrace
環(huán)境搭建
安裝Python并添加到環(huán)境變量,pip安裝需要的相關(guān)模塊即可。
參考資料
1.http://www.html-js.com/article/1628
2.https://zh.wikipedia.org/wiki/%E5%8F%AF%E7%B8%AE%E6%94%BE%E5%90%91%E9%87%8F%E5%9C%96%E5%BD%A2
3.https://www.cnblogs.com/hnfxs/p/3148483.html
先睹為快
修改所需繪制的圖片路徑:

在cmd窗口運(yùn)行main.py文件即可。
效果如下:
原理簡介
一. 實(shí)現(xiàn)步驟
首先讀入原圖:

其次將原圖像的顏色數(shù)量通過K均值聚類降低到指定的數(shù)量,K值越大,運(yùn)行速度越慢,但效果越佳:

每次取出聚類結(jié)果中的一種顏色并利用potrace將其轉(zhuǎn)為SVG格式的圖形,再解析該格式并用Python自帶的turtle庫畫出來:

二. SVG格式
SVG,即可縮放矢量圖形,是一種基于可擴(kuò)展標(biāo)記語言(XML),用于描述二維矢量圖形的圖形格式。SVG主要支持以下幾種顯示對(duì)象:
1.矢量顯示對(duì)象,基本矢量顯示對(duì)象包括矩形、圓、橢圓、多邊形、直線、任意曲線等;
2.嵌入式外部圖像,包括PNG、JPEG、SVG等;
3.文字對(duì)象。
更多關(guān)于SVG的技術(shù)細(xì)節(jié)請(qǐng)參考:
http://www.w3school.com.cn/svg/svg_intro.asp
三. Turtle庫
這里推薦一份turtle庫的文檔:
https://www.rddoc.com/doc/Python/3.6.0/zh/library/turtle/
四. 貝塞爾曲線
畫圖時(shí)用到了貝塞爾曲線,這里簡單介紹一下。
貝塞爾曲線的數(shù)學(xué)基礎(chǔ)是伯恩斯坦多項(xiàng)式,其得名于法國工程師Pierre Bézier。
貝塞爾曲線控制簡便卻具有極強(qiáng)的描述能力,因此在工業(yè)設(shè)計(jì)領(lǐng)域應(yīng)用廣泛;同時(shí),貝塞爾曲線在矢量圖形學(xué)領(lǐng)域也占有重要的地位。今天我們最常見的一些矢量繪圖軟件(例如Flash,CorelDraw,PS等等)均提供了繪制貝塞爾曲線的功能。
線性公式:
給定點(diǎn)P0、P1,線性貝塞爾曲線是一條兩點(diǎn)之間的直線,確定方式如下:

其實(shí)就是線性插值。
二次方公式:
給定點(diǎn)P0、P1和P2,二階貝塞爾曲線的路徑確定方式如下:

n次方公式:
給定點(diǎn)P0到Pn,n階貝塞爾曲線的路徑確定方式如下:

貝塞爾曲線的繪制方式(以二階為例):
假設(shè)平面內(nèi)不共線的三個(gè)點(diǎn)如下圖所示:

在AB上選一點(diǎn)D,BC上選一點(diǎn)E,使得:
AD:AB=BE:BC。
連接DE:

在DE上選一點(diǎn)F,使得:
AD:AB=BE:BC=DF:DE

保證AD,AB,BE,BC,DF,DE之間的比例關(guān)系不變,讓D點(diǎn)從A點(diǎn)運(yùn)動(dòng)到B點(diǎn),則所有的點(diǎn)F構(gòu)成的曲線即為二階貝塞爾曲線:

n階貝塞爾曲線的繪制方式類似,例如三階和四階:


That's all~
相關(guān)文件中提供了完整源代碼和所需的工具,請(qǐng)自行下載使用。
更多
代碼截止2018-07-31測試無誤。
還是挺有趣的,原圖最好不要太大,否則生成的速度很慢很慢很慢。