程序员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 (206 < x && x <= 247) return 6;

else return 6;

}

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

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

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

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

(完)

骰子算法 php,骰子作画的算法相关推荐

  1. 1. 通用基础算法(1.7动态规划算法/1.8模拟算法/1.9其他算法)

    7  动态规划算法 动态规划(Dynamic Programming)是求多阶段决策过程(Multistep Decision Process)最优化的一种数学方法,它将问题的整体按时间或空间的特征分 ...

  2. 计算机绘出一条虚线算法步骤,国外利用计算机算法将有色线编织成经典绘画

    原标题:国外利用计算机算法将有色线编织成经典绘画 位于莫斯科的程序员Ani Abakumova使用算法将有色线程的长度组织成经典绘画风格.虽然每个线程的放置数学公式都是在她的计算机上创建的,但Abak ...

  3. 回归算法分类,常用回归算法解析

    回归算法分类,常用回归算法解析 回归是数学建模.分类和预测中最古老但功能非常强大的工具之一.回归在工程.物理学.生物学.金融.社会科学等各个领域都有应用,是数据科学家常用的基本工具. 回归通常是机器学 ...

  4. 【POJ/算法】 3259 Wormholes(Bellman-Ford算法, SPFA ,FLoyd算法)

    Bellman-Ford算法 Bellman-Ford算法的优点是可以发现负圈,缺点是时间复杂度比Dijkstra算法高.而SPFA算法是使用队列优化的Bellman-Ford版本,其在时间复杂度和编 ...

  5. K-means聚类算法和模糊C-means聚类算法

    K-means聚类算法和模糊C-means聚类算法 1.K-means聚类算法 K-means算法是硬聚类算法,是典型的基于原型的目标函数聚类方法的代表,它是数据点到原型的某种距离作为优化的目标函数, ...

  6. TSNE算法是什么?该算法有什么缺陷?

    TSNE算法是什么?该算法有什么缺陷? TSNE算法是什么? TSNE是一种通过在二维或三维地图中给每个数据点一个位置来实现高维数据可视化的统计方法.它是基于Sam Roweis和Geoffrey H ...

  7. java贪心算法 区间调度_贪心算法-区间调度问题解之证明(示例代码)

    一.贪心算法 定义:一个算法是贪心算法,如果它是通过一些小的步骤来一个求解,并且在每一步根据局部情况选择一个决定,使得某些主要的指标得到优化. 二.区间调度问题 1. 问题:我们有一组需求{1,2,3 ...

  8. 成为顶尖算法专家需要知道哪些算法?

    成为顶尖算法专家需要知道哪些算法? 摘要:顶尖的机器学习专家需要的算法,要不要?   机器学习算法简介 有两种方法可以对你现在遇到的所有机器学习算法进行分类. 第一种算法分组是学习风格的. 第二种算法 ...

  9. 成为顶尖机器学习算法专家需要知道哪些算法?

    2019独角兽企业重金招聘Python工程师标准>>> 成为顶尖机器学习算法专家需要知道哪些算法? 摘要:顶尖的机器学习专家需要的算法,要不要? 机器学习算法简介 有两种方法可以对你 ...

  10. 跳一跳j算法ava代码_DBSCAN聚类算法的理解与应用

    在前面的文章中,我们讲了KNN算法的原理与简单应用,KNN一种有监督学习的分类算法,也就是说该算法首先需要训练数据来进行学习之后才能对数据进行分类.在本文中我们讲到的DBSCAN聚类算法,也属于一种数 ...

最新文章

  1. HtmlUnit、httpclient、jsoup爬取网页信息并解析
  2. Oracle CDC配置案例
  3. 【Android 启动过程】Android 应用启动流程 | Activity 启动流程
  4. 求多个四元数的平均数
  5. 【技术干货】Spring事务原理一探
  6. java瑞格实验2;2020.4.3
  7. boost::mp11::mp_count_if相关用法的测试程序
  8. tomcat启动成功 未加载项目_喜讯!济宁医学院附属医院SPD项目成功启动
  9. mysql-5.1.50中文_mysql5.1 中文 乱码 mysql 5.1 中文字符集问题终极解决方案
  10. hive内部表和外部表的区别_走近大数据之Hive进阶(四、Hive的表连接)
  11. 目标检测之RRPN的学习笔记~
  12. mac chrome 重启电脑 插件消失
  13. 计算机丢失MSVCR71.dll处理方法
  14. oracle 更改system.dbf,oracle数据文件system01.dbf上有坏块,如何修复
  15. 对偶传播神经网络(CPN)
  16. 移动终端安全问题分析与解决方案研究
  17. pyqt5 listView 列表显示
  18. Kubernetes集群容器运行日志收集
  19. 初步认识C语言中的选择和循环语句
  20. python中doc转docx

热门文章

  1. overwrite linux,在linux下的使用復制命令cp,不讓出現“overwrite”(文件覆蓋)提示的方法。(轉)...
  2. java 微秒_现在有任何新的方法可以在Java中以微秒的...
  3. 【动画演示软件】Focusky教程 | 如何设置帧暂时隐藏,在播放该帧时才出现?
  4. chome(谷歌浏览器)上传文件崩溃/上传图片崩溃/打开浏览文件未响应 解决方案
  5. 安泰测试Agitek-TH2817A型LCR数字电桥
  6. 算法导论 思考题 9-3
  7. php serv-u,用php写的serv-u的web申请账号的程序,_php
  8. 全球13万条地震数据可视化,深扒地震是否变频繁
  9. 【计算机网络】应用层(完整版)
  10. 【lumerical】获取lumerical材料库中材料的有效折射率(波长范围内)