飞雪团队

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 5195|回复: 0

骰子作画的算法

[复制链接]

4137

主题

4225

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
14711
发表于 2020-8-12 23:22:59 | 显示全部楼层 |阅读模式
程序员Scott MacDonald做了一个很有趣的项目----骰子作画。
                                                                                                                他用黑底白点的骰子。
2d37f878dbd9af4b48eb8a2613f875e9.png

模拟出一张人像照片。
6c8a4b00b32e5046e9916afcc01fd305.jpg

把图像放大,就可以看得更清楚。
72f7c9a629b18150cdbd1a1595a44124.jpg

他一共用了2500多颗骰子。
d2bc7ed820d30bd04e57705d313981ff.jpg

最后的成品就是这样。
3cd10ad7943f99e054b2d59a7fc2d0a0.jpg

任何一张图片都可以用骰子模拟出来,算法非常简单:将图片分成若干个区域,每个区域经过计算以后,用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之间的一个整数来表示。
<blockquote>  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;
    }
    m = m/x.length;  
    return int(m);
  }
  int six_step_gray(int x) {

    if (0
ad21fa2c1472d9714caabf6240fd8992.jpg
77204597273fc8a5fdf920d3bd5c8ece.jpg
196c04b60fb51be00422423102ff6376.jpg
de3decb33a0d1def83774967ec0ebb07.jpg
d0d21b26a03fa6c548690c34aea17a9b.jpg
568fca2d2f15ca7704b2bf760ecfcb34.jpg
320b8a9c6a7ecd2ec4bcfae3aea1dd1e.jpg
a1035adada00b7f8a957b326c5ff6ed5.png
回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|飞雪团队

GMT+8, 2024-4-27 00:17 , Processed in 0.074577 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表