骰子作画的算法

标签: IT | 发表时间:2011-11-26 21:28 | 作者:(author unknown) bingo
出处:http://www.ruanyifeng.com/blog/

程序员Scott MacDonald做了一个很有趣的项目----骰子作画

他用黑底白点的骰子。

模拟出一张人像照片。

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

他一共用了2500多颗骰子。

最后的成品就是这样。

任何一张图片都可以用骰子模拟出来,算法非常简单:将图片分成若干个区域,每个区域经过计算以后,用1-6之间的一个整数表示,代表骰子的一个面。这种将连续的量转化成不连续的整数的算法,属于vector quantization(矢量量化)的一个应用。

具体来说,

第一步,将图片分割成16像素x16像素的小方块。

  for (int i=0; i < (pic_width/16); ++i) {

    for (int j=0; j < (pic_height/16); ++j) {

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

    }

  }

第二步,每个小方块内共有256个像素,将每个像素点的灰度值,存入一个数组。

  for (int k=0; k < patch.pixels.length; ++k) {

   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 < x.length; ++i) {

      m += x[i];

    }

    m = m/x.length;

    return int(m);

  }

  int six_step_gray(int x) {

    if (0 <= x && x <= 41) return 1;

    if (41 < x && x <= 83) return 2;

    if (83 < x && x <= 124) return 3;

    if (124 < x && x <= 165) return 4;

    if (165 < x && x <= 206) return 5;

    if (x < 206 && x <= 247) return 6;

    else return 6;
  }

整数1,表示骰子朝上的一面有1个白点;整数2,表示有2个白点;以此类推。白点越少,表示这个区域越接近全黑;白点越多,表示越接近全白。根据白点值,将骰子依次放入,就能模拟出全图。

这种算法早在1981年就有人提出,当时用的是1~9个白点的多米诺骨牌。

如果区域划分得越小,模拟图的生成效果就越好。

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

(完)

文档信息

相关 [骰子 算法] 推荐:

骰子作画的算法

- bingo - 阮一峰的网络日志
程序员Scott MacDonald做了一个很有趣的项目----骰子作画. 把图像放大,就可以看得更清楚. 他一共用了2500多颗骰子. 任何一张图片都可以用骰子模拟出来,算法非常简单:将图片分成若干个区域,每个区域经过计算以后,用1-6之间的一个整数表示,代表骰子的一个面. 这种将连续的量转化成不连续的整数的算法,属于vector quantization(矢量量化)的一个应用.

细菌掷骰子吗?

- yu - 科学松鼠会
传说骰子的发明人是三国时期的文学家曹植,是为了占卜之用. 时至今日,它已演化为人类广泛用于赌博和休闲娱乐的工具,深入千家万户. 除老百姓外,科学家们对骰子也可谓情有独钟,甚至在上个世纪还爆发了关于“上帝掷骰子吗”的大讨论. 当然,我今天并不想讨论这么大的一个话题,但依然不妨碍我把掷骰子试验背后隐藏的二项分布和大数定理引入自然界,用它对一些生物学现象进行探讨和分析.

[搞笑诺奖2010]人事部经理兜里装着骰子?

- hanyu - 科学松鼠会
2010年10月,中国本土研究者终于摘下了首个诺贝尔奖——搞笑诺贝尔奖. 为庆祝这历史性的一刻,松鼠会将连续推出诺贝尔系列:有正版诺贝尔,也有搞笑版诺贝尔. 2010年搞笑诺贝尔奖的管理学奖颁发给了意大利塔尼亚大学的三位物理学家,理由是他们用科学手段证明:通过随机的方式提拔员工,可让组织更有效率. 这个结论初看起来有一点“雷人”,如果真的这样的话,各个公司的人事部经理们的工作就轻松了,不必去四处学习MBA课程,也不必殚精竭虑的思考提拔哪一位员工,每天只要兜里揣着两个骰子去上班就可以了.

大学生网游中玩掷骰子输掉万元学费

- 洞箫 - cnBeta.COM
各大高校都开学在即,又是一年学费缴纳时,而我市大四学生陈涛(化名,下同)这几天却一直在为学费而焦急,不是因为家庭贫困,而是他头几天在网上玩 丢骰子将1万余元学费及生活费全部输光,其中,还包括他暑假在渝打工所赚的近2000元. 律师称其行为已构成网络赌博,尽管不用承担刑事责任,但会受到应 有的警告.

2010搞笑诺贝尔奖:人事部经理兜里装着骰子?

- st - 牛博国际
2010年10月,中国本土研究者终于摘下了首个诺贝尔奖——搞笑诺贝尔奖. 为庆祝这历史性的一刻,松鼠会将连续推出诺贝尔系列:有正版诺贝尔,也有搞笑版诺贝尔. 2010年搞笑诺贝尔奖的管理学奖颁发给了意大利塔尼亚大学的三位物理学家,理由是他们用科学手段证明:通过随机的方式提拔员工,可让组织更有效率. 这个结论初看起来有一点“雷人”,如果真的这样的话,各个公司的人事部经理们的工作就轻松了,不必去四处学习MBA课程,也不必殚精竭虑的思考提拔哪一位员工,每天只要兜里揣着两个骰子去上班就可以了.

用骰子决定命运真的是一件危险的事情……

- Shphi - 无知的nonopanda

缓存算法

- lostsnow - 小彰
没有人能说清哪种缓存算法由于其他的缓存算法. (以下的几种缓存算法,有的我也理解不好,如果感兴趣,你可以Google一下  ). 大家好,我是 LFU,我会计算为每个缓存对象计算他们被使用的频率. 我是LRU缓存算法,我把最近最少使用的缓存对象给踢走. 我总是需要去了解在什么时候,用了哪个缓存对象.

BFPRT算法

- zii - 小彰
BFPRT算法的作者是5位真正的大牛(Blum 、 Floyd 、 Pratt 、 Rivest 、 Tarjan),该算法入选了在StackExchange上进行的当今世界十大经典算法,而算法的简单和巧妙颇有我们需要借鉴学习之处. BFPRT解决的问题十分经典,即从某n个元素的序列中选出第k大(第k小)的元素,通过巧妙的分析,BFPRT可以保证在最坏情况下仍为线性时间复杂度.

贪心算法

- Shan - 博客园-首页原创精华区
顾名思义,贪心算法总是作出在当前看来最好的选择. 也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择. 当然,希望贪心算法得到的最终结果也是整体最优的. 虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解. 如单源最短路经问题,最小生成树问题等.

缓存算法

- 成 - FeedzShare
来自: 小彰 - FeedzShare  . 发布时间:2011年09月25日,  已有 2 人推荐. 没有人能说清哪种缓存算法由于其他的缓存算法. (以下的几种缓存算法,有的我也理解不好,如果感兴趣,你可以Google一下  ). 大家好,我是 LFU,我会计算为每个缓存对象计算他们被使用的频率.