App下載

python來畫畫第二彈!

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

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

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

導語

分享一波最近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窗口運行main.py文件即可。

效果如下:


原理簡介

一. 實現(xiàn)步驟

首先讀入原圖:

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

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

二. SVG格式

SVG,即可縮放矢量圖形,是一種基于可擴展標記語言(XML),用于描述二維矢量圖形的圖形格式。SVG主要支持以下幾種顯示對象:

1.矢量顯示對象,基本矢量顯示對象包括矩形、圓、橢圓、多邊形、直線、任意曲線等;

2.嵌入式外部圖像,包括PNG、JPEG、SVG等;

3.文字對象。

更多關(guān)于SVG的技術(shù)細節(jié)請參考:

http://www.w3school.com.cn/svg/svg_intro.asp

三. Turtle庫

這里推薦一份turtle庫的文檔:

https://www.rddoc.com/doc/Python/3.6.0/zh/library/turtle/

四. 貝塞爾曲線

畫圖時用到了貝塞爾曲線,這里簡單介紹一下。

貝塞爾曲線的數(shù)學基礎(chǔ)是伯恩斯坦多項式,其得名于法國工程師Pierre Bézier。

貝塞爾曲線控制簡便卻具有極強的描述能力,因此在工業(yè)設計領(lǐng)域應用廣泛;同時,貝塞爾曲線在矢量圖形學領(lǐng)域也占有重要的地位。今天我們最常見的一些矢量繪圖軟件(例如Flash,CorelDraw,PS等等)均提供了繪制貝塞爾曲線的功能。

線性公式:

給定點P0、P1,線性貝塞爾曲線是一條兩點之間的直線,確定方式如下:

其實就是線性插值。

二次方公式:

給定點P0、P1和P2,二階貝塞爾曲線的路徑確定方式如下:

n次方公式:

給定點P0到Pn,n階貝塞爾曲線的路徑確定方式如下:

貝塞爾曲線的繪制方式(以二階為例):

假設平面內(nèi)不共線的三個點如下圖所示:

在AB上選一點D,BC上選一點E,使得:

AD:AB=BE:BC。

連接DE:

在DE上選一點F,使得:

AD:AB=BE:BC=DF:DE

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

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

That's all~

相關(guān)文件中提供了完整源代碼和所需的工具,請自行下載使用。


更多

代碼截止2018-07-31測試無誤。

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

1 人點贊