當前位置:
首頁 > 知識 > 骰子作畫的演算法

骰子作畫的演算法

程序員Scott MacDonald做了一個很有趣的項目----骰子作畫。

他用黑底白點的骰子。

模擬出一張人像照片。

把圖像放大,就可以看得更清楚。

他一共用了2500多顆骰子。

最後的成品就是這樣。

任何一張圖片都可以用骰子模擬出來,演算法非常簡單:將圖片分成若干個區域,每個區域經過計算以後,用1-6之間的一個整數表示,代表骰子的一個面。這種將連續的量轉化成不連續的整數的演算法,屬於vector quantization(矢量量化)的一個應用。

具體來說,

第一步,將圖片分割成16像素x16像素的小方塊。

for (int i=0; i

for (int j=0; j

patch = cropped_img.get(i*16, j*16, 16, 16);

}

}

第二步,每個小方塊內共有256個像素,將每個像素點的灰度值,存入一個數組。

x[k] = rgb2gray(patch.pixels[k]);

}

int rgb2gray(int argb) {

int _alpha = (argb >> 24) & 0xFF;

int _red = (argb >> 16) & 0xFF;

int _green = (argb >> 8 ) & 0xFF;

int _blue = (argb) & 0xFF;

return int(0.3*_red + 0.59*_green + 0.11*_blue);

}

第三步,計算該數組的平均值,並用1-6之間的一個整數來表示。

int dice_num = six_step_gray(mean(x));

int mean(int[] x) {

float m = 0;

for (int i=0; i

m += x[i];

}

m = m/x.length;

return int(m);

}

int six_step_gray(int x) {

if (0

if (41

if (83

if (124

if (165

if (206

else return 6;

}

整數1,表示骰子朝上的一面有1個白點;整數2,表示有2個白點;以此類推。白點越少,表示這個區域越接近全黑;白點越多,表示越接近全白。根據白點值,將骰子依次放入,就能模擬出全圖。

這種演算法早在1981年就有人提出,當時用的是1~9個白點的多米諾骨牌。

如果區域劃分得越小,模擬圖的生成效果就越好。

此外,不用編程,使用Photoshop也可以得到類似效果。

來源:阮一峰的博客

http://www.ruanyifeng.com/blog/2011/11/dice_portrait.html

-----這裡是數學思維的聚集地------

超級數學建模」(微信號supermodeling),每天學一點小知識,輕鬆了解各種思維,做個好玩的理性派。60萬數學精英都在關注!

「征有趣的話題」

超級數學建模現向讀者們

徵集有趣的話題

超模君會挑選來撰寫

後台留言的時候

記得先@超模君

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 超級數學建模 的精彩文章:

為什麼要培養數學思維?用陳景潤的故事告訴你
還記得年少時的幾何嗎?像幅永遠不凋零的畫

TAG:超級數學建模 |