可否通過編程為《秘密花園》填充出和諧的顏色?

問題的起因是最近很火的《秘密花園》這本填色書,作者只勾畫了輪廓線條沒有上色,留給讀者回去自己選擇顏色進行填充,還帶火了彩色鉛筆市場:

妹子也很喜歡這本書,我考慮著要不要買一本順帶一套彩色鉛筆送妹子,突然萌生了這個想法,如果能直接用程序畫那裝訂起來送給妹子不也是極好的哈哈;
不談好看不好看先,能否通過程序讓計算機自動或者在人工少量干預的情況下填充出一張較和諧的圖,如果可以的話演算法上如何實現?
註:這裡「和諧」指背景和物體之間能區分開,不同的物體單元如一朵花與邊上的另一朵花區分開但內部的顏色卻又不是很跳躍(不知道這樣定義準確不準確,歡迎指正!)。
可以下面兩張圖中的一張為例進行說明,如果能對整本書通用就更好了:


---------------------------------------------更新--------------------------------------------
這個問題下添加了很多(發散性的)答案了。我還是覺得這個問題很好很難,誰要是能漂亮地解答並po出效果來想不火都難(不止在知乎)。
也許提問作者沒細想,或者我已經偏離了作者的本意,但是我在思考用編程(也就是適配性強,無需人工參與)解決這個問題時,想到以下難點:
0. 你當然可以argue"自動上色失去了秘密花園的意義",「跳躍又魔幻地配色其實很美」,「顏色不一定要上到格子里」,「一朵花可以有不同顏色的花瓣」等等,這方面的討論我就不參與了,你可以開一個「自動給神秘花園上色的意義在哪裡?」的帖子討論(更新: 有人問了……通過程序為秘密花園自動上色的意義在哪裡? - 秘密花園)。

1. 怎樣區別背景(background)和前景(foreground)。看 @Thinkraft 的示例,注意樹於樹之間的背景顏色。
2. 怎樣提取一個塗色的區域。譬如肖寒同學建議,矢量化後找封閉區域。
3. 怎樣保證不同區域屬於同一物體(不同花瓣屬於同一朵花)。
4. 怎樣給不同物體選擇顏色。很多同學說隨機,或者在「漂亮的顏色」里隨機抽取。我讀書少,真的只要用「漂亮的」顏色(還不說到底有沒有漂亮的單色)上出來就漂亮嗎?我把梵高的調色板偷出來我也能成大師吧?
5. 怎樣給上色結果打分。需要一個評估結果的方法。

我看到的那個paper討論和解決了除了3以外的問題,所以我覺得是個很好的思路,可以供大家參考。

----------------------------------------------------原答案------------------------------------------------------
非常同意 @肖寒 的答案,先選出區域,再研究上色,而且上色絕不是個簡單的活兒。
@段苗 同學提到要考慮相同區域的顏色應該相同或相近,譬如同樣是羽毛就應該選近似的顏色看起來才和諧。
@SysyCode 和匿名用戶說用遺傳演算法思路來進化出「高分」的配色,但還應該進一步說明這裡的高分通過什麼演算法來判定,其實這也是「和諧」的定義了。

總之我覺得這是個很有意思又很難搞的問題,看到這篇paper,給大家提供個思路。http://graphics.stanford.edu/~mdfisher/Data/patternColoring.pdf

上圖左邊是輸入的灰度圖像,中間是生成的彩圖,右邊是作為對比的隨機填色的圖像。能夠看出中間的顏色要「和諧」的多。
該方法的訓練數集是網上藝術家的作品,使用MCMC方法讀取顏色生成調色板。使用不同的數據集訓練可以得到不同的上色效果:

從灰度圖像里匹配屬於同一類型的色塊(如貓頭鷹的兩隻眉毛),從調色板里選取顏色著色。著色時同時要考慮顏色對比度和飽和度。對生成的彩圖進行打分,

左圖是原始圖像和要用到的色塊,中間是高分結果,右側是低分結果。可見即使是相同的調色盤結果依然有逼格高低之分。
文中說,除了可以給灰度圖上色,還可以用來給3D模型上色,給定網頁元素後給背景圖上色(見下圖)

或者給你的衣服配色一些建議,見下圖的不同膚色的模特給的不同著衣配色方案。

關於技術細節請點http://graphics.stanford.edu/~mdfisher/Data/patternColoring.pdf 原文,來自 [S. Lin 2013].
這確實是個很有意思有很有難度的問題,拋磚引玉,期待更多答案,最好有Demo結果 :)


代碼黨 10行代碼來個糙的。
其實secret garden隨便怎麼填,只要認真,都挺好看的。

不信?你看!

代碼在此。

thresh = threshold_otsu(img)
bw = closing(img &> thresh, square(1))
cleared = bw.copy()
clear_border(cleared)
label_image = label(cleared) # label image regions
borders = np.logical_xor(bw, cleared)
label_image[borders] = -1
colors = np.random.rand(300, 3);
image_label_overlay = label2rgb(label_image, image=img, colors=colors, bg_color=np.random.rand(3))

完整代碼:
https://gist.github.com/haojian/0ee6dd444994fd67f63b


第一眼看到這個問題的時候,我立馬想到了坐我對面的工程師,他問過我好幾次關於配色的問題,但最後都以「能用編程來解決嗎」收場。我雖然學藝術出生,但也非常接受工程師的思考邏輯。

在藝術與科技之間,我是一個矛盾體。我父親是一個標準的 Geek,我奶奶的灌輸方針始終是「學好數理化,走遍天下我不怕」,在一個理科專業包圍的家庭里,偏偏只有我從小學琴學畫,走上了藝術的道路。但我從小熱愛數學、物理,小時候最愛的遊戲是和爸爸玩湊 24,很長一段時間,做奧數題也是興趣的一種。我想說的是,很多人都認為藝術創作是感性的,技術就是理性的。然而,並非如此。也許恰恰是因為我的矛盾屬性,讓我通過理科更加深入地理解了藝術,又通過藝術,讓我大膽地去暢想技術的未來與可能。在我的觀點裡,藝術的傳統形式已經瀕臨絕境,必須通過技術來突破了。同時我也深深地相信,總有一天人工智慧會佔領我們的世界。我認為,懂得創造藝術,是人工智慧的一個標杆。

所以,我的回答更多的是基於我這個矛盾體。

看了大部分的答案,貌似都在解答:如何用編程填色,而不是如何用編程填出和諧的!和諧的!和諧顏色!

如何填充和諧的顏色,是個非常複雜的問題,人都很難學會,何況計算機。至少我溜達了下其他答案,感覺大多都屬於「如何氣死我的設計師朋友」系列。所以我決定先講「如何幫助程序員朋友快速學會配色」再說編程的事。

關於如何配色的基本理論,我在另外一篇回答寫了一些設計師是如何從藝術中借鑒設計思維的事:怎麼看待 Michael Kors 這樣的設計師品牌抄襲的行為? - SysyCode 的回答 主要圍繞以下三點回答:
1、設計之間的 copy 關係,註:這種 copy 不一定就是惡性的。
2、時尚設計是如何從上流影響到淘寶爆款的?
3、藝術家是如何影響上層時尚設計的?藝術又是如何對我們以及我們的日常生活產生影響的。
其中也寫了設計師從藝術作品中借鑒配色的例子。

不過還有一個更簡單的適合程序員朋友的方法,那就是抄啊。

好的藝術家抄襲創意,偉大的藝術家竊取靈感——畢加索

歡迎去 Dribbble 里找。Dribbble 里每一個設計圖都提煉了設計師的配色,都很棒。
比如:

點旁邊的:

比如綠色:

看,直接往代碼里放就可以了。如果你是前端工程師,這個辦法會非常受益。不知道怎麼配色的時候就按照這套提煉過的顏色來,色塊所佔比例也盡量差不多,效果應該還不錯。

在這裡我不得不說的是:大多數沒有經過專業繪畫訓練的人,其實是不具備「配色」能力的。配色也是有方法論的,也是一個縝密布局的過程。會與不會,就是從 0 到 1。也有可能你沒學習過,配出來很好看,但並不代表具有方法論。

所以,借鑒是個好路子。Dribbble 上的資源都很棒!說不定可以挑選一些出來建立庫,然後給《秘密花園》填色。

關於如何編程,知友 @Thinkraft 已經解決了,這是他的回答:可否通過編程為《秘密花園》填充出和諧的顏色? - Thinkraft 的回答 以及他的結果(已得到作者授權):

這是我看到的目前為止最棒的版本,作者的思路是隨機填色。雖然作者有提前調整過色彩亮度的下限,但任然可以看到顏色之間的飽和度不太勻稱,就好比有些地方是梵高色,有些地方是莫奈色,互相有些衝突。

也許在走向代碼時,需要思考的問題還有很多。讓我們先來模擬一下,如果是手繪,需要思考的一些基本問題。

面對這張線稿,我們會去想:
1、先塗哪裡?

  • 比如:先塗樹葉。

2、樹葉是什麼顏色?

  • 綠色。

3、一盒鉛筆那麼多綠色,該圖哪個綠色?

  • 好吧,隨便挑個自己喜歡的吧。

4、咦,旁邊貌似還有別的類型的樹葉,是不是該換個綠色?

  • 好吧,隨便換個綠色試試。

到這裡,如果你沒有接受過專業繪畫訓練,關於「如何把顏色塗和諧」就已經開始要出問題了。小白選手選的是「不一樣的綠色」,高手則是在選「灰度」「冷暖對比」「全盤布局」等等等等,其中任何一樣都是一個複雜的抉擇。比如「灰度」,什麼是「灰度」?

比如,以下是一張莫奈的作品:

現在我把它去色:

要是沒看過原圖的話,還以為背景就一個色呢。這就是傳說中的「高級灰」,如果你在美術色彩考試中能整出一張高級灰出來,那絕對是高分無憂了。(注,本條不可逆推)

關於高級灰的百科定義:
在水粉畫中高級灰特指 一個色系或一組色,色彩經過調合,純度通常偏低,給人的感覺和諧而不是單獨一個色。 它柔和,平靜,穩重,和諧,統一,不強烈,不刺眼,沒有衝突,色彩內含的元素是複雜的而非單純的。

把這句話放出來是想說,要想搭配和諧的配色,真的很難。把這些都總結到位了,並提出合理的演算法,也許離這個問題的終極答案會近一點。

除了這些,我們在填色過程中還會思考:不同顏色應該填在哪裡?畢竟《秘密花園》那麼細密,如何深淺搭配、疏密有張才會好看?而且,上面紋理不管多麼細緻,我們也是可以一眼看出具體形象的,花、貓頭鷹……如果是隨機填色,會不會成為《秘密狗》《秘密鬼》《秘密犢子、秘密猹》?這都是需要考慮的問題。個人覺得,《秘密花園》里好看的填色,大多是那些懂得如何留白的作品(如該書封面圖)。那這個問題是不是就又更複雜了,中國繪畫的最高境界就是「留白」,不僅是審美,還有哲學思想在支配技法,這個又該怎麼去算?

一開始看到這個標題的時候,我是很排斥的。它似乎在探討一種如何把藝術規則化的事,是非常折損美感的。

最近我做了一個試驗,希望用「演算法」的方式來設計紋理。同一種演算法,用電腦繪製,和我自己手繪,試圖探討這其中的差異:人的主觀審美,對作品的呈現到底有多重要?

起因是因為近期我又看了凱文凱利的《失控》,在《三步輕鬆繁育藝術傑作》中寫道:

進化主義將是當代藝術發展的下一個階段。借用變異和有性繁殖的概念可以催生這門藝術。

人工進化作品的版權問題還處於法律真空中。誰將受到保護,是繁育出作品的藝術家還是編寫繁育程序的藝術家?將來,律師可能要求一個藝術家記錄下創作進化作品所遵循的軌跡,以此證明他的作品並非複製或歸屬於形式庫的創建者。

前年讀到這些話的時候,完全無感。直到今年 Google 搞出了個 Deep Dream(一個人造計算機大腦,可以通過它的想像來畫圖),突然就有所警覺了。按照凱文凱利的理論,以前我們用傳統方法搞藝術創作,是「1+1=2」,「2」就是作品,且是可控的。人工進化作品就是「1+1= 星辰」。

於是我又去看了下 Deep Dream:

天,說好的星辰呢?滿眼狗腦子。為了讓大家愉快地看答案,我挑了一張輕柔點的,有興趣的朋友可以去搜搜,小心嚇死寶寶喲~

於是我就很好奇,人畫 VS 電腦畫,區別在哪裡?

首先,我在 Generative Design 上去下了個代碼,用 Processing,搞了個這個:

大概就是我滑鼠畫曲線,它能跟著出直線,顏色可換。

然後,對它的代碼進行了下總結,設計了一個適合手繪的「演算法」用手繪的方式來呈現一下。設計過程中,我已經基於自己的審美有所改進了。於是我畫了這些東西:

(做成手機殼效果是因為,感覺紋理需要有所依附,效果會好些)

以下是具體步驟。

1、用鉛筆畫任意曲線。

2、沿著曲線畫直線。規定:直線間間隔為 0.5 毫米;每條直線垂直於曲線的切線;在每條曲線的中點處直線的長度最長,且不超過 20 毫米;曲線起始點直線最短,且不短於 1 毫米;每兩條線長度差為 1 毫米。

3、最神奇的設定:保持勻速畫線頻率,3 分鐘畫黑線,然後 30 秒畫紅線,輪流交替。

4、當在一段曲線中出現已畫出最短直線但曲線還沒結束的情況,則視為將該曲線拆分,重新開始排直線。其實我也是不小心畫成了這樣,做了新規定。

5、最長不超過 20 毫米。

6、按照以上規定,得到了這個結果。

7、覺得不過癮,再來一層。

8、出現了更多交叉,豐富了層次。

9、第二層完成。

10、整體效果。發現幾個很有趣的事:(1)過程中並不知道最終會得到什麼,也許這就是 KK 說的圖像的自我進化吧。(2)因為手繪不如電腦來的精確,反而更加生動。想起小時候學鋼琴,如果遇見連續相同音,老師會要求切換指頭來彈,故意製造差異,讓音色更生動。由此我想:在各種模擬技術里,不停的去通過模擬的辦法使之更逼真,也許有更好的辦法,那就是製造瑕疵。(3)不論演算法如何規定,在主觀上都會有再創造,比如,我覺得一個區域黑色太多了,我會主觀希望紅色快點出現,就會下意識影響到我的畫線頻率。也許這也是人與機器不同的地方,人工智慧該怎樣調整呢?思考著也是很有趣。

先是代碼畫,再是手繪,體會到了非常有趣的東西:

1)大家也看到了,我規定了演算法,但瑕疵特別多。比如,我規定每條直線必須是曲線的法線,然而幾乎沒做到。但這並沒有影響最終的效果。

電腦畫的就是電腦畫的,天生帶有一種冰冷的感覺。就像我舉的彈鋼琴的例子,市面上到處可見自動鋼琴,它一定比任何一個人去彈都更精準,五線譜怎麼標就怎麼彈。也恰恰就是因為這種精準,讓它無法成為鋼琴家。人的主觀差異,帶來了人性,朗朗和李雲迪的表達方式就很不一樣,但他們都是很棒的鋼琴家。

2)過程中,我的主觀性時不時會跳出來。就比如之前說的,我覺得某個區域黑色太多了,希望紅色快來,然後會化作行動,對結果造成影響。這種主觀的修正,是計算機目前還不具備的,但為什麼我會產生強烈的主觀意願:這個地方必須是紅色了,不然不夠美。這就打破了演算法。整個過程中,大概有 15% 的時候,這種強烈的主觀意願會跳出來干擾原先的設定。

我很喜歡自己加的那條 3 分鐘黑筆 30 秒紅筆的規定。如果是設計代碼,肯定不會是這樣,即便要換顏色,也是別的演算法。這也許就是人和機器的不同吧。

3)看了不少 Generative Art,Processing 等案例後,除了少數特別精美的以外,我覺得大多作品的呈現讓我覺得在審美上,和 Dos 下的海龜時代相比,突破並不大(我說審美)。我開始想:從代碼到圖像,中間是什麼東西在影響這個思維?從古埃及時期開始,西方藝術就在試圖對「造型」總結一套比例,希望通過這個比例達到最美的藝術創作。到了古希臘,這種追求更是被發揚了,這也基於他們本身的價值觀與哲學:相信所有問題都能去通過數學來解決。這也不難理解,比如唐卡,也是有嚴格的比例規定,以此保證造型的統一,我想這裡面也有審美的考慮。總之我想說的是,目前這種創作形式,從代碼到作品,是欠缺一個內在邏輯的。我手繪,我有主觀邏輯,這個邏輯就是我這個人,所有關於我的一切形成的審美。那計算機呢?目前來說,計算機還沒那麼聰明,形式已經具備了(谷歌那個人造大腦 Deep Dream 畫的圖),但審美這一部分它還沒學會(很想喂它一本《詹森藝術史》啊),至少目前是不符合當下對美的定義的。那在這個空檔期里,人應該發揮怎樣的作用?這才是真正需要思考的問題。

在我按照演算法手繪的時候,最大的感觸就是:越是去想要規則化,越是能體會到人本身的主觀能動性。一種自我的力量在變得強大。


藏傳佛教有種修行方式是畫曼陀羅。


曼陀羅是一種藏傳佛教術語,其本意為「聚集」,指一切聖賢、一切功德的聚集之處。它也是僧人和藏民日常修習秘法時的「心中宇宙圖」,一般是以圓形或正方形為主,相當對稱,有中心點。


這句關於曼陀羅的描述,既有表形的部分也有表意的部分。合起來,也是一種在有限的規則里(表形:圓、方、對稱、有中心)去發展自我的創造(表意。每個人畫出來都是不一樣的)。


總之,這是一個非常奇妙的過程。既體會到了計算機的冰冷,對應的,還有人性的美妙。而且比以往感受到了更多可貴之處。


在當下,即便 Generative Design 已經登上歷史的舞台,但最終的作品呈現還是得靠人工來定奪審美。人之於作品是一個互動的過程,每一筆畫下去都是一種交流、思考與權衡。而電腦畫,無論最終的結果多麼花俏,多少有些金玉其外敗絮其中的感覺,不得不感嘆,人的思想是多麼的奇妙。


知友 @符博 在他的回答里,引用了一位 Stanford PHD 在 Siggrah ( 圖像處理最高會議 )上的論文(http://graphics.stanford.edu/~mdfisher/Data/patternColoring.pdf)至少目前看來,要想找到這個問題的答案是不現實的。但也是一個非常有趣的探討。

這個試驗後,我再來想「可否通過編程為《秘密花園》填充出和諧的顏色?」這個問題。個人覺得思路是:
1、還是得「以人為本」的去找到一種相對美觀的表達方式(下面會體現)。
2、代碼落地。

經過之前的思考後我發現,代碼落地,反而是個簡單的步驟。如何去定形式,真的好難。

我的作業如下:
我平時也很喜歡畫《秘密花園》風格的線條畫。
如:

然後我用某軟體處理了下:

水彩風格,是我找到的形式。關於填色我在想,為什麼就是要挨個依照那些小空空填呢?個人認為,《秘密花園》的理想填色法就是拿著水彩顏料(多加水)然後往紙上甩 or 潑,然後換點顏色繼續一層層潑。不要笑,這個是嚴肅的技法。出來效果也會很棒的。

所以我的思路是:把圖像矢量化後,生成一個水彩質感的背景來實現填色。既可以凸顯主題,又具備了藝術風格。至少絕對不會變成《秘密鬼》。

同樣辦法,以這張我畫的劉看山為例,還可以得到:

這種風格可作為一種探討吧,它代表了我的個人審美在呈現時給出的形式,我也是寫著寫著答案隨手去弄出來的,歡迎大家多提意見。這是用 PS 做的 Demo,編程的話已經跟工程師討論過了,不難實現。

關於這個問題的解答,可能我不能一步就上到智能填色,且和諧。但首先,開發幾個靠譜的模板出來還是可以的。不要一下子就覺得很 Low 了,也正因為這樣,探索起來才更有意思呀。

我認為,編程技術要有,人為的審美導向也是需要的。如我之前所說,在被人工智慧佔領之前,人工智慧能創造藝術之前,我們應該起到什麼作用呢?也許我們還有更精彩的答案呢。

是的是的,藝術思維、技術思維都是需要的。我的專欄「畫畫有什麼用」就快要開始寫啦~

這些都可以算做思路啦!畫畫有什麼用 - 知乎專欄 先打個廣告。

「畫畫有什麼用?」是我在知乎上看到的一個問題,於是激發了我的研究熱情。

一方面,我將用繪畫的思維方式記錄閱讀與學習。介紹: 「藝術與歷史、人文的關係」 「藝術是如何影響到我們每一個人的日常生活的」 並探討「藝術如何落地,如何產品化,如何與技術與人工智慧相結合(Generative Art)」

另一方面,我將隨時更新我的每日畫畫成果以及我的思考,做一個眾籌試驗: 一籌朋友:一起畫畫。 二籌想法:畫畫有什麼用?

歡迎加入!
「畫畫有什麼用」問題鏈接:
畫畫有什麼用? - SysyCode 的回答
裡面是我最原始的探討。

最後,非常贊同 @段苗 的想法,組織一個「Hacker"s Secret Garden」的 Hackathon 會不會很棒?我相信,越是在有規則的情況下,越是會迸發出意想不到的生命力。


@符博 提到的配色演算法是建立在原圖帶灰度的基礎上的,這種圖片本來就可以很方便地應用色板。對於秘密花園這種黑白圖片,要通過程序來識別圖中的物體,還是太複雜了,而且大家似乎在這條路上走得有點遠——我不是說不對,能實現自動識別當然好,不過成本最低的方式應該還是純隨機填色,先隨便生成個百八十張,然後再挑其中效果比較好的人工微調。

我隨手寫了段程序試了試這個思路(有圖有jb)。

由於我希望作品少一些匠氣、多一些想像力,所以調色板由程序自動生成,而不用設計師定好的調色方案;另外我個人比較喜歡淡雅一些,在隨機產生色板時,我限制了亮度下限(RGB均不低於128),以降低對比度,不要太濃。

以下例圖的黑白線稿是從Google上搜的,上色是程序自動完成的。我發上來的就是隨機上色的前兩個實際結果,沒有經過篩選。效果比較魔幻,請輕噴。


例圖1:

例圖2:

例圖3:

嗯?似乎最後一張還有點意思?拿來手工搞一搞,把背景不合理的地方修掉,就變成了下面這樣:

不知道合不合各位的胃口啊?

——————————

不用試圖教程序員怎麼配色,這種活我們通常會丟給機器做。

——————————


更新一下說明。

這麼簡單的東西,求代碼的就算了吧。 @SysyCode 在評論中提到按面積分配顏色,例如Dribbble - Spongy by James Boorman中的色盤,其順序是所佔面積從大到小排列的。

於是我試了試在生成圖片的時候改變色盤排列,保證排在前面的顏色獲得較大總面積,效果如圖:

其實還是不如完全不干預的效果好看。

順手試了試劉看山(*線圖作者@SysyCode,已獲得授權在本答案中使用,展示填色效果)。

用了Dribbble - Web Design by Mike,似乎臟髒的。

換https://dribbble.com/shots/2170826--Crumbs-Cafe-Bakery,再試試看。

不然還是回歸魔幻、不用任何調色板好了~~~

感覺看山都要被我玩壞了XD……


說實話,一開始覺得這個程序填色比較簡單,很多小夥伴都給出解決方案,檢測區域,然後給每個區域配個色。。。我在實際往下做的過程,越深入越發現沒這麼簡單。先貼幾個圖,是編程做的。

這裡我沒有採用隨機配色,而是利用segment的面積和周長特徵做了個匹配,比隨機配色要好看一點。矢量化、區域檢測、配色都不是問題,關鍵是如何配出讓我們在直覺上就覺得很cool的方案。圖形識別這裡就不討論,現在的科技解決不了。
下面來談談stanford的那篇論文,主要講了如何給出一個更好的配色。這個更好是從亮度、飽和度、相鄰顏色之間的對比度這些顏色的空間特性來討論的,是去找出更符合人類審美的配色。它有一個dataset用來學習,這些dataset是從一個colorlove的優秀設計網站上收集的圖片,這些都是公認設計比較好的。它把一張圖分成2部分,背景、前景(除去背景剩下的部分)。它開始統計這些dataset研究背景的亮度分布,發現有兩個峰,亮度分別在0.4和0.8處,對於前景的亮度分布,有一個峰,在0.7左右,這就為我們設計提供了參考。後面它又研究了兩個相鄰顏色之間的關係,前景-背景和前景-前景之間的相對亮度分布形狀基本差不多,但是前景-背景的對比度要更大一些。後面介紹了顏色兼容度的一些計算公式和一些數學模型,公式比較複雜沒怎麼明白。還有它提出一個整體效果評估的模型。
我從中借鑒到的是,如何取分析別人的優秀作品,找出一些特徵,如亮度特徵、飽和度特徵等,論文一共提出許多特徵,把這些特徵組合起來,建立標準模型,這個模型是建立在人類直覺經驗基礎上的;然後用這個模型來評估編程生成的方案,甚至對他人設計的作品給出修改建立,這樣我們設計的作品才會越來越接近大師們的設計。
希望對此有興趣的可以一起討論,一起設計。


可以,最近天貓舉辦過這樣的內部活動。
活動內容主要是人臉識別,識別到笑容時,會根據笑容的程度,自動為一幅未上色的圖上色,達到一定值後可以自動填充出非常好看的彩色圖案。

下面這些都是自動生成的


應要求將代碼上傳到了 GitHub
guaxiao/pattern.logo.py · GitHub


此答案回復下面的答案
可否通過編程為《秘密花園》填充出和諧的顏色? - SysyCode 的回答


先放結果:

1,構造 Bezier 曲線

# https://zh.wikipedia.org/wiki/File:Bezier_3_big.gif

def bezier_interpolate(start, end, p1, p2, factor):
c1 = vector_interpolate(p1, p2, factor)
c2 = vector_interpolate(start, c1, factor)
c3 = vector_interpolate(c1, end, factor)
p = vector_interpolate(c2, c3, factor)
return p

插值畫法線就不說了,昨晚有人問我一個問題,很巧,和這個是一個性質。
那道題是這樣的

其實先簡化為這樣就很顯而易見了

1
121
12321
……

顏色根據作者所述的 3 分鐘黑線 30 秒洋紅,但是加入了隨機性。

2,加入噪音,簡單模仿一下手繪,倒數第二條不錯,選了倒數第二條

3,應用簡單的手繪線條,加個背景

4,完

參考資料:
https://docs.python.org/2/library/turtle.html


額外說明:
題中的醜陋花園毫無美感,因此我不會浪費人蔘去搞這種醜陋的東西。

——「盧瑟大講堂」時間——

幾點說明:

  1. 和諧的配色簇可以用 HSL 顏色空間很方便地取樣出來,當然這不是重點
  2. 以程序為畫筆不會折損美感,如果心生排斥,有必要審視一下自己的內心是否因循守舊固步自封(本質和自大的程序員沒什麼不同)
  3. 如果認為代碼是工具,應該虛心學習,心存偏見(而不自知)只會產生大量錯誤認知,對自己有害無益
  4. 電腦只要在運行就是暖的,偏見盲目的人心才是冰冷的,電腦只是被人操控的工具,冷冰冰的電腦前面一定坐著一個冷冰冰的人(有一次天太冷,我寫了個多線程程序燒 CPU 取暖,結果是體冷有效地散掉了電腦的溫度)

在此例中電腦作為工具的好處:

  • 光速地實驗、調整、改進(編程的最主要優勢)

哦對了,為了刷新編程、代碼作為工具的存在感,本程序是用「海龜」寫的,用的是 Python 下 Logo 語言的拙劣替代品—— turtle 模塊。


暫時想到一個簡單策略:
1、選好色系,可以從設計常用的色系表裡隨機選一組
2、把圖片里的封閉區域都檢測出來,然後按照外形、面積等特徵進行聚類,直到簇的數量小於色系表中的顏色總數
3、同一個簇里的封閉區域,用同一種顏色填充

這樣應該可以確保配色基本能看,而且不是太雜亂無章,不過想要好看可能就沒這麼簡單了……

如果把這個做成一個編程競賽網站,起名「Hacker"s Secret Garden」,會不會很好玩?


隨便搜了下,發現還有人為這個問題讀了個PhD:
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.141.6334rep=rep1type=pdf
當然PhD論文僅供參考而已,研讀下自己寫一個應該不難。

用最最基礎的watershed試了一下,上色是隨機的,可行但是沒有美感。
如果採用適當的演算法分配色彩應該會好很多,可以參考上文以及其他paper。

還可以用當年Chris Espinosa對付Steve Jobs刁鑽美感口味的方法來做這個,
那就是提供一系列可調參數,讓藝術家滿意為止,哈哈yes, talk is cheap. Here is the code. :-D


「突然萌生了這個想法,如果能直接用程序畫那裝訂起來送給妹子不也是極好的哈哈」

還洋洋得意吶(? ??_??)?。怪不得說到程序員就聯想起「注孤生」。


先說直覺:可以。

用Matlab簡單做了一個(代碼很糙也很簡單,不放上來丟人了,感興趣的小夥伴可以私下交流),隨機顏色填充,效果嘛。。。。十分魔幻。。。

這算不算完成任務?不算,因為這並不和諧。

雖然我做的不好做得糙,但我相信還是這個還是可以用編程來解決的。因為我們還沒有定義"規則"。題主所給的要求十分簡單,和諧。這兩個字看似很清晰,實則很籠統。因為我們無法從嚴格的數學或者顯式地表達什麼是和諧。

那麼,存不存在一種比較接近於主觀審美的「規則」和諧存在來幫助用編程解決問題。
我想了想,以下幾個沒準可以:
1)確定色系,即主色調;如有必要,限制顏色數量;
2)對稱位置鏡像圖案處顏色應一致;
3)塗色塊越大,顏色越淡;反之越濃;
4)歸納同類物體(基於形狀相似性),使同類別為同一色系
5)適當使用漸變
。。。

上述這些規則,理論上應該是可以用編程來實現的。但就算這樣,是否就能達到主觀意義上的「和諧」?

不能


因為都說了是主觀了!就算是純手繪或者大藝術家來干這事,也不能保證讓每一個人都覺得和諧。


但是可以好看。

因此我修正的直覺,用計算機編程能給出出好看的秘密花園塗色方案。


補充 @ChipsetS 的答案。

將圖片矢量化後檢測邊線,找出封閉區域填充顏色,只能做到隨機作色,不能做到智能的、優雅的作色。

我建議在之後使用概率圖模型來進行作色分析,最好使用改造後的 Ising Model。
首先,我們把顏色分為三個通道,每個通道十個取值。
之後,我們隨機的初始化一些顏色,然後利用 Ising Model 的平滑性質,將區域顏色之間的漸變描繪的不突兀,很順滑。
這樣作色可能會更加符合人類的審美。

當然,你還可以在上面的模型上加入一些先驗,改變其中的平滑因子的權值,實現各種效果的顏色填充。


我看了下答案,然後又看了下題主的要求。
其實,很難。
因為這個課題觸及的其實不是填色,而是人工智慧以及審美。
引用題主的話:
你當下給我提的任何方法,頂多只能探討:如何用編程填色。而我們真正要探討的是,如何用編程和諧滴!和諧滴!和諧滴…填色!!!

小S同學,就算頂多討論的,也是一個很大的課題。
上面已經給出了一個大概的填色解決方案。
讓我們先冷靜下來,即使三個感嘆號,也是不解決問題的。(是的程序員不相信感情。)
先確定甲方的要求,正如寫code前先知道要幹什麼一樣。
關於美學的:和諧是什麼 美是什麼?

關於工程的: 如何讓程序學習到美?

以及具體的操作問題。

第一個問題,說實話,沒有太多思路,美這個詞太虛幻了,而且每個人心裡對於美的定義都不相同。
我也明白,可以找到一個大眾的交叉點,但我相信對於一個受過美學訓練的人來說,這樣的東西,可以用一個字來形容,就是「俗」。用計算機的語言,就是最大公約值,出來的結果必然不可能達到題主想要的境地。因此,光靠計算機來進行對顏色的配比。
就我個人觀點。
是死路一條。
那麼,就必然牽扯到人的介入。
人才是最大的變數。
記得很早的時候,當時在一個學校做研究,裡面就有一個圖像識別的項目。對於人來說,一眼就能分辨出哈士奇和吉娃娃,但對於電腦來說,就很難,怎麼辦?
那就讓人來分辨咯。
項目組把兩張圖放在網上,如果你願意分辨,就給你二毛五,是的,兩個就是五毛。
那麼,正確率是多少呢,如果我沒記錯,超過90%
那麼,問題來了,當我們討論哈士奇和吉娃娃的時候,我們到底在討論什麼?
我們再討論人腦與電腦的結合。
相信許多學計算機的人都聽說過這個故事,
從前有座山,山裡有座廟,廟裡有個老和尚,在講故事……講的什麼呢?
老和尚在講遞歸
……
好吧,我在開玩笑,其實是這個:
The Turk
The Turk
機器只負責實行,而人進行判斷。
也就是上面一些答案里說到的遺傳演算法。(一會我繼續說這個,想到其他的了。)
我們可以想想這個方法。
在一個風和日麗的下午,小S同學坐在電腦前,按下按鈕,屏幕上就出現了一張填好色的圖片。
「負分滾粗!」
嗯,一組數據被貼上了負值。
又來一張。
「一般般,平庸之作。」
嗯,一組數據貼上了60分。
「哎喲,有點意思。」
80分。
「這個好!」
100分。
……
其實國外的約炮神器也有類似的演算法,通過你對照片的選擇,然後進行個人化推送。
linkedin也是啊,根據你的skill set 然後推薦公司。
但是!!!
藝術品的獨特之處就在於,你覺得90分的色彩集合在一起,也許會超級難看。正如紅燒肉好吃,老媽蹄花也好吃,但同時吃,就膩死了。
那麼,又需要引入一些新的演算法,那麼,是什麼新演算法呢?
我不知道。
而這,才是關鍵中的關鍵。而這裡對於評判的缺失,直接導致整個項目很難繼續實行下去,因為沒有方向了。
小S同學可能也看到了這個問題,覺得

Dos 下的海龜時代。我開始想:從代碼到圖像,中間什麼東西在影響這個思維?

不是什麼東西在影響這個思維,而是沒有東西來影響這個思維,因此才會停滯不前。
當然,討論到此就可以結束了,但我想說的是,如果使用遺傳演算法和人腦判斷,是可以做出一些偏個人色彩的作品的。當然,好看不好看,和諧不和諧,就不在此列了。

很遺憾沒有給出很好的答案,不過希望能說明一個問題:
有時候看起來很淺顯的東西,對於機器來說,是超級複雜的。
正如圍棋一樣,最簡單的規則,會帶來最複雜的演算法。
當然,這也是我們這些技術人員孜孜不倦所追求的東西。


調完曲線之後:

MAKE "filename "secret_garden.bmp
MAKE "step 2
MAKE "rgbmin 128
MAKE "rgbmax 224

MAKE "color (ARRAY 3)
SETITEM 1 :color 160
SETITEM 2 :color 232
SETITEM 3 :color 208

NOYIELD
HT
PU
SETPOS [-500 -500]
BITLOAD :filename

.MACRO RANDOMCOLOR :varname :subexpr :addexpr :pos
OP (LIST
"MAKE (WORD "" :varname) "( "( "ITEM :pos ":color ") "+ "( "( "RANDOM 11 ") "- 5 ") ")
"WHILE (LIST (WORD ": :varname) "> ":rgbmax) (SENTENCE (LIST
"MAKE (WORD "" :varname) "( (WORD ": :varname) "- "( ) :subexpr ") ") )
"WHILE (LIST (WORD ": :varname) "&< ":rgbmin) (SENTENCE (LIST "MAKE (WORD "" :varname) "( (WORD ": :varname) "+ "( ) :addexpr ") ") ) "SETITEM :pos ":color ":randcolor ) END FOR (list "x -500 500 :step) [ FOR (list "y -500 500 :step) [ SETPOS (list :x :y) IF PIXEL=[255 255 255] [ SETFLOODCOLOR ARRAYTOLIST :color FILL LOCAL "randcolor RANDOMCOLOR "randcolor [RANDOM 30] [RANDOM 50] 1 RANDOMCOLOR "randcolor [10] [RANDOM 50] 2 RANDOMCOLOR "randcolor [7 + RANDOM 8] [RANDOM 50] 3 ] ] ]

你問我為什麼這麼寫?因為我喜歡(逃


之前沒有看到題主如此複雜的描述,是我的錯。盡量少的人工干預這句話很模糊,什麼叫盡量少?在進行地圖數字化時,我們是需要極其繁瑣的手工操作的,但這是有最先進的地圖軟體支持下的。回歸到問題,一隻經過藝術創作出來的貓頭鷹如何自動識別,答案是不能,因為其本身缺乏明顯的屬性,無法進行歸納。
-----------------沒圖我也有JB-----------------
方法論
1.矢量化
2.取點,以主要目標物體為中心建立緩衝區,緩衝區不能溢出目標物體外,點的個數由創作者決定
3.設色,直接使用內置色譜。

方法論2
1.矢量化
2.選取主要物體邊緣,摳出
3.在網路上搜索得到該物體圖片講扣出的矢量圖層覆蓋於其上,並以背景圖為基礎為矢量圖層賦予顏色
4.次要物體按第一種方法處理


-------------------------------------------------
地圖狗滾進來答,手上沒有ArcGIS軟體,所以就只給思路,思路就是用ArcGIS的捕捉功能和自動矢量化功能。
ArcGIS已經內置了大量,超大量的漂亮色譜,分層設色一下就OK了。


手癢,也寫了一段代碼,加上空行共14行,超級多的圖預警,後面樓歪了

import cv2, numpy, random, sys

original = cv2.imread(sys.argv[1]) # 命令行參數指定圖片文件
output = original.copy()
bgr2gray = cv2.cvtColor(original,cv2.COLOR_BGR2GRAY)
ret, threshold = cv2.threshold(bgr2gray,170,255,cv2.THRESH_BINARY)
bitwise_not = cv2.bitwise_not(threshold)
contour,hier = cv2.findContours(bitwise_not,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)

for cnt in contour:
color = cv2.cvtColor(numpy.uint8([[[random.randint(0,170),random.randint(150,250),random.randint(150,255)]]]),cv2.COLOR_HSV2BGR)[0,0]
cv2.drawContours(output,[cnt],0,[int(i) for i in color],-1)

cv2.imwrite(sys.argv[1]+"_filled.jpg",output)

先說缺點吧,缺點蠻明顯的,配色混亂,不協調,少數區域被遺漏了(虛線或者線條未閉合,識別contour失效),部分封閉的空白區域也被填色了(識別成了contour),比如這幾張圖(第一張是原圖,第二張是自動配色圖):

這二張圖最明顯,幾乎識別不出原圖了(第一張是原圖,第二張是自動配色圖):

不太複雜的圖形,效果還湊活(第一張是原圖,第二張是自動配色圖):

彩圖也可以的哦,這一組還蠻好看的哈(第一張是原圖,第二張是自動配色圖):

照片也可以,快看,孔雀,它這是腫么了,讓人給潑了嗎(第一張是原圖,第二張是自動配色圖):

黑白也可以,有點意思哈(第一張是原圖,第二張是自動配色圖):

太複雜的就成這種鬼了(第一張是原圖,第二張是自動配色圖):

從網上下載了一組Animal Kingdom和Secret Garden還有一些亂七八糟的圖片,for循環後的輸出結果(左邊原圖,右邊自動配色圖):

獅子王,你腫么了(我要去找我媽媽~~):

修改一下配色方案,再加上模式匹配效果應該會更不錯。
如何將識別並忽略空白部分的封閉區域,這是個問題。

機器替代不了藝術家
機器替代不了藝術家
機器替代不了藝術家

------------------- 樓歪了 -------------------

-------------------- 網侵盜刪 ---------------------
以上圖片均來自網路,版權歸原圖作者所有
代碼生成的圖片,版權歸誰不知道,反正不歸我


(正打算寫一個給網頁搞 I18N 工作的東西突然看到了這個問題,來抖個機靈,寫完那玩意就認真答)
你問我怎麼調出和諧的顏色?
很簡單啊。
我們先欽定一個 Picture1 來放圖片,AutoSize 和 AutoRedraw 設成 True,把邊框去掉,ScaleMode 設成 3 - Pixel。
接下來把那張鬼圖片載入進來。
接下來,既然題主只是說和諧的顏色,所以我們這麼搞:

Private Sub Form_Click()
Dim X As Long, Y As Long
For Y = 0 To Picture1.ScaleHeight
For X = 0 To Picture1.ScaleWidth
If Picture1.Point(X, Y) 65536 &> 220 Then "畢竟只是灰度圖我直接取藍色的值好了,閾值是我胡寫的
Picture1.PSet (X, Y), RGB(233, 233, 233)
End If
Next
Next
End Sub

就是這樣(手動滑稽)

顏色是不是很和諧(手動滑稽 *2)


會寫點代碼的藝術系學生貼段代碼

from PIL import Image
import random

fileName = "33.jpg"

img = Image.open(fileName)
imgArray = img.load()

width = img.size[0]
height = img.size[1]

flag = [[0 for i in range(height)] for j in range(width)]

dx = [-1, 0, 1, 0]
dy = [0, 1, 0, -1]

def fill(x, y, thisColor, colorRgb):
#BFS fill color block
head = 0
tail = 1

wayx = []
wayy = []

wayx.append(x)
wayy.append(y)

while (head &< tail): for i in range(0, 4): tempx = wayx[head] + dx[i] tempy = wayy[head] + dy[i] #if (tempx &>= 0) and (tempy &>= 0) and (tempx &< width) and (tempy &< height): if (imgArray[tempx, tempy] != (0, 0, 0)) and (flag[tempx][tempy] == 0): imgArray[tempx, tempy] = colorRgb flag[tempx][tempy] = thisColor wayx.append(tempx) wayy.append(tempy) tail += 1 head += 1 return thisColor + 1 color = 1 for i in range(0, width): imgArray[i, 0] = (0,0,0) imgArray[i, height-1] = (0,0,0) for j in range(0, height): imgArray[0, j] = (0,0,0) imgArray[width-1, j] = (0,0,0) for i in range(1, width-1): for j in range(1, height-1): if (imgArray[i, j] == (255,255,255)) and (flag[i][j] == 0): colorRgb = (random.randint(0, 255),random.randint(0, 255),random.randint(0, 255)) color = fill(i, j, color, colorRgb) print "color", color img.save("new_" + fileName) print "Complete!"

效果圖見
我寫了一個自己會玩秘密花園的程序


2333333
抱歉我還做不到分辨各種動物什麼的,那樣可能需要大量的訓練。不過我至少做到了顏色不跳躍(好偷懶啊)。
=====更新,說我的難看 哼哼伐開心=====

====更新====換了大一點的圖,效果稍微有所改善。


選幾個偏小清新那種色,用電腦隨機上色。隨即個它幾十張還選不出一張好看的?


推薦閱讀:

為什麼香港中文大學研發的人臉識別演算法能夠擊敗人類?

TAG:藝術 | 圖像處理 | 機器學習 | 機器視覺 | 秘密花園(填色) |