App下載

python來畫畫第二彈!

猿友 2018-08-08 18:06:46 瀏覽數(shù) (7246)
反饋

本文轉(zhuǎn)載至知乎ID:Charles(白露未晞)知乎個(gè)人專欄

下載W3Cschool手機(jī)App,0基礎(chǔ)隨時(shí)隨地學(xué)編程>>戳此了解

導(dǎo)語

分享一波最近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測(cè)試無誤。

還是挺有趣的,原圖最好不要太大,否則生成的速度很慢很慢很慢。

1 人點(diǎn)贊