一张灰度图,怎么找出哪里是黑的?App Inventor 不装拓展就能做
先说结论:能做,而且不用拓展。
这个问题最近被问了好几次,场景各不相同:有人拍了张答题卡,想知道哪几个格子涂黑了;有人做巡线小车的上位机,想从摄像头画面里找出黑线的位置;还有人单纯想做个「点哪显示哪」的取色小工具。
归根结底都是一件事:给一个点,判断它黑不黑;再把所有黑的点找出来。

App Inventor 里有三块积木正好能拼出来:
- 画布的「获取背景像素色值」:给坐标,取回那一点的颜色;
- 颜色抽屉的「分解色值」:把颜色拆成红、绿、蓝、透明度四个数;
- 一个比较:灰度值小于 128,就算深色。
灰度图有个好处:红绿蓝三个数是一样的,拆出来随便取一个就是灰度,0 是纯黑,255 是纯白。
第一步:点哪判哪

把灰度图设成画布的背景图,再放一个标签。手指点到哪里,就把那一点的坐标和灰度显示出来:

点在黑色笔画上,显示「是深色」;点在白底上,显示「不是深色」。阈值 128 不是死的,图片偏灰就调低,想把浅灰也算进来就调高。
颜色抽屉里其实还有一块现成的「是深色吗」。它按人眼感知的亮度来判断,界线大约在灰度 188,所以中灰也会被算成深色。要「明显发黑才算」,还是像上面这样自己比阈值更好控制。
第二步:把深色区域找出来
单点判断会了,扫描整张图就是两层循环的事。多数时候我们要的不是几千个点,而是「黑的那一块在哪」,所以扫描时顺手记下最左、最右、最上、最下,最后画个红框圈出来:

里面的 gap 是采样间隔,4 就是每隔 4 个点看一次,比逐点扫快 16 倍,找黑块的位置完全够用。
两个容易踩的坑
坑一:坐标对不上原图。 画布会把背景图缩放到画布大小,上面拿到的是画布坐标。原图 1000 像素宽、画布 360 宽的话,画布上的 1 格相当于原图将近 3 个像素。要原图坐标,用「图片处理」组件取出原图宽高,按比例乘回去就行。
坑二:扫大图时界面点不动。 积木循环跑在界面线程里,一口气扫完之前,App 是「卡住」的。办法有两个:把 gap 调大;或者让计时器每次只扫一行,边扫边显示进度,界面始终能响应。
还有个小细节:画上去的红框也会被「获取背景像素色值」读到,所以要先扫描、后画框,重新扫描前先清一下画布。
写在最后
这几块积木安卓和鸿蒙都支持,写法一样。图片如果是彩色的,先用「图片处理」的灰度功能转一下再扫。
完整的文档里有五个递进的小实验:点哪判哪、列出全部深色点坐标、求深色区域、换算原图坐标、分批扫描不卡顿,每一段积木都能直接照着搭。在 App Inventor 2 中文网搜「深色像素」就能找到。
答题卡识别、巡线定位、取色工具,都可以从这几块积木起步。

好了,今天的分享就到这里,咱们下回见。
更多推荐

所有评论(0)