「写给设计,遇见梦想,热爱生活 」

这是一颗孤独的星球

幸好遇见你

—写给设计

2018年08月16日 心情晴

Hi,

你今天过得好吗?

我是你的好朋友、写给设计的值班人有福气的豆豆。

知乎上有这样一个问题:如何快速、准确地数出一袋瓜子有多少颗?

谁这么无聊提出了这样一个没有技术含量的问题?

没技术含量?非也,非也。

任何一个问题,都必然有其因由,有了问题,就必然有解决之道;有解决之道,就必然有其技巧;有其技巧,就必然有其技术含量;有其技术含量...额,技巧者,含量也...(hahahah)

“北羽宫城”同学率先给出了这样一个答案:杀鸡何需用牛刀,一台数码相机+PhotoShop 就可以了。

所谓高手,果然不走寻常之路,用了PS这么些年了,第一次听说,PS还能数瓜子。稀奇,稀奇!新鲜、新鲜!

万能的PS啊,看你怎样数瓜子的?

“@北羽宫城”同学曰:

第一步:将瓜子撒在浅色地面或浅色纸上,使其尽量分散开来。为何浅色?因为瓜子是深色的啊。要是瓜子是浅色的,那你就得换成深色地面或者深色的纸了。学会变通才行。

为何要尽量的散开来?这要为接下来的操作做准备了。

第二步:相机拍照,然后拷入电脑并用PS打开。若对比度不高可调节“阈值”。这一步是为了提高背景和瓜子的对比度。这样才好识别。

第三步:选择魔棒工具 > 点击空白处 > 反向,得到所有瓜子的选区。若图片中含有少量杂质或接触在一起的瓜子,可通过“选择 > 修改 > 收缩”进行去除或分离。

第四步:选择“分析 > 选择数据点 > 自定”。在选区中,选择“计数”并单击“确定”;

第五步:选择“窗口 > 测量记录”;

第六步:选择“分析 > 记录测量”;

第七步:结果如下:

注:图像处理过程可通过 “动作” 功能实现自动批处理以提高效率。

恩,不错,不错!“北羽宫城”同学真不错!这一方法,让用PS的我大开眼界!

这个时候,程序员“@孙挺”同学不甘示弱了:

这事最适合用Mathematica来做了。

借用@北羽宫城同学的瓜子图,直接拖进Mathematica,将图片定义为pic,这段代码可以选择合适的Binarize的阈值:

Manipulate[ Show[pic, Graphics[{Red, Thick, Circle[#[[1]], #[[2]]] & /@ ComponentMeasurements[ ImageMultiply[pic, SelectComponents[Binarize[pic, {0, x}], "Area", 60 < # < 1500 &]], {"Centroid", "EquivalentDiskRadius"}][[All, 2]]}]], {x, 0, 1}]

运行,效果见下图,发现阈值选择0.8可以区分瓜子形态。

将Binarized的图片存为bpic,再用ComponentMeasurement随便找个属性就行了:

bpic=SelectComponents[Binarize[pic, {0, .82}], "Area", 60 < # < 1500 &]; ComponentMeasurements[bpic, "Area"][[-1, 1]]

直接运行,结果:70。

不懂,不懂!深奥,深奥!程序员同学果然深藏不露啊!

统计学仁兄@睡得晚觉得两者都不太好,可操作性不强,提出了一个简单的办法,认为应该在时间以及效率上都是可行的。

假设若干瓜子为一堆,两手各从中拨出1颗,分左右放置,如此反复操作,已最快速度将瓜子分为2堆,在这个过程中不必心算计数,以避免出现误差的可能,分好之后,如有余下1个则放置在所分出的那堆瓜子旁边;然后再对分出来的其中一堆瓜子重复上述步骤,如此反复,最终分成可目测个数的瓜子堆即可停止。接下来进行计算,计算公式为:最小堆瓜子数×2的n次方(n为分堆次数)+1×2的m次方(m为余下瓜子所在层数-1)。

例如,分了5次,分出最小堆个数为8颗,第1次分堆余数1颗,那么总数就是8×2的5次方+1×2的0次方,等于257颗。如有多个余数则需累加多次,如上面的例子改为第1次和第4次分堆都有余数,那么总数是8×2的5次方+1×2的0次方+1×2的3次方=265颗。

左右手同时分算1次,总共分瓜子240次,按1秒可操作3至4次计算,90秒左右即可完成,加上计算用时,总用时也不会超过3分钟。有人会说,一颗一颗数用时也差不多啊,其实分析一下就可以知道,边分边计数是容易产生误差的,我们追求的任何人都能轻松操作并且无误差,所以分堆统计是综合效率及准确率的最佳计数方法。

一脸的懵逼,睡得晚仁兄啊,能不能说点我听的懂的?

还没来得及提出疑问呢,@文枫就接着 @睡得晚仁兄的方法展开了:

这个问题好有趣!

这些答案里我最喜欢的是@北羽宫城 用图像处理和识别的方法,相信应该得到不错的准确率。答案中有人提到用统计学来处理,虽然方法不对,但是思路是好的。我想继续从这个角度入手。

先做简单的假设:1)假设一袋瓜子大约有200粒;2)瓜子的重量比较均匀(这个假设不用太苛刻)。

  • 步骤1,先对所有瓜子进行称重,记录中重量为Wtot;

  • 步骤2,随机抽5粒瓜子进行称重,计算平均重量,并记录为w1;

  • 步骤3,重复步骤2, N次(N > 20),记录下每次的平均wn, (n = 1, 2, ...N);

  • 步骤4,计算N次平均重量的平均值和均方差,分别记为Wavg和SEM;

  • 步骤5,用总重量Wtot除以Wavg,估算瓜子总数 A (注意这里得到的只是一个估值)。真实值有95%的概率位于区间 [A - 1.96 * SEM, A + 1.96 * SEM] 内。所以SEM越小,估值就越有可能接近真实值。

跟人工计数和图像识别的方法相比,在处理一袋瓜子的问题上,统计学的方法不是效率最高的,并且得到的结果也只是概率区间。但是统计学的优点在于可以根据精度需求,调节采样数量和试验重复次数,在处理大量数据时,优势会更加明显。我估计随着样本增大,人工计数和图像识别的复杂度会越来越高,出错概率会增加。

写在最后

诸位同学,你可懂了?如果懂了,那说明你真的是PS、编程、数学...样样精通啊!佩服!佩服!如果你像我一样,不懂,那也没关系,毕竟,这可是一道“有技术含量”的题呀!

怎么样,你以为数一袋瓜子容易吗?简单么?你看人家,高深的数理化都搬出来了,厉害!厉害!

好了,今天的分享就到这里了,安~

参考来源:https://www.zhihu.com/question/21405856

「每天一份小礼物 」

Hi,今天的礼物已经为你寄去了,后台回复:816,收取今天的小礼物吧~

「写给你的信 」

PS入门全套笔记 | Adobe CC2018 全家桶 | CC2018最新版 | Adobe CC2015大师版(需全部下载下来) | Adobe安装破解 | 设计、广告、运营人必备神器 | 马赛克拼贴图神器 | 交互原型工具 | 交互设计入门指南 | 写给还想入行UI设计的你 | UI和UX | UI设计切图规范 | 怎样切图标注? | UI术语中英文对照 | 移动端尺寸基础知识 | VI设计贴图模板 | 字体 | 进驻Dribbble高级玩家指南 | 设计师的革命宣言 | 让甲方漂洋过海来找你 | 为什么别人家的LOGO值800万? | 你的一个小时值多少钱? | 千万别和做设计的人谈恋爱 | 如果可以我想和设计谈恋爱

「如果喜欢,就分享给你第一个想起的人吧~

如果喜欢,就默默置顶关注吧~

你知道wanan的意思吗?

(WO AI NI AI NI)

回复“早安/午安/晚安”,写给设计每天和你问安~ 」