首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >一张灰度图,怎么找出哪里是黑的?App Inventor 不装拓展就能做

一张灰度图,怎么找出哪里是黑的?App Inventor 不装拓展就能做

原创
作者头像
用户10956490
发布于 2026-11-02 09:17:20
发布于 2026-11-02 09:17:20
900
举报

先说结论:能做,而且不用拓展。

这个问题最近被问了好几次,场景各不相同:有人拍了张答题卡,想知道哪几个格子涂黑了;有人做巡线小车的上位机,想从摄像头画面里找出黑线的位置;还有人单纯想做个「点哪显示哪」的取色小工具。

归根结底都是一件事:给一个点,判断它黑不黑;再把所有黑的点找出来。

答题卡上涂黑的格子,就是图里的深色像素
答题卡上涂黑的格子,就是图里的深色像素

App Inventor 里有三块积木正好能拼出来:

  • 画布的「获取背景像素色值」:给坐标,取回那一点的颜色;
  • 颜色抽屉的「分解色值」:把颜色拆成红、绿、蓝、透明度四个数;
  • 一个比较:灰度值小于 128,就算深色。

灰度图有个好处:红绿蓝三个数是一样的,拆出来随便取一个就是灰度,0 是纯黑,255 是纯白。

第一步:点哪判哪

手指点哪,就判断哪一点是不是深色
手指点哪,就判断哪一点是不是深色

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

点在画布上,显示这一点的坐标、灰度,是不是深色
点在画布上,显示这一点的坐标、灰度,是不是深色

点在黑色笔画上,显示「是深色」;点在白底上,显示「不是深色」。阈值 128 不是死的,图片偏灰就调低,想把浅灰也算进来就调高。

颜色抽屉里其实还有一块现成的「是深色吗」。它按人眼感知的亮度来判断,界线大约在灰度 188,所以中灰也会被算成深色。要「明显发黑才算」,还是像上面这样自己比阈值更好控制。

第二步:把深色区域找出来

单点判断会了,扫描整张图就是两层循环的事。多数时候我们要的不是几千个点,而是「黑的那一块在哪」,所以扫描时顺手记下最左、最右、最上、最下,最后画个红框圈出来:

扫描整张图,记下深色区域的范围并画红框
扫描整张图,记下深色区域的范围并画红框

里面的 gap 是采样间隔,4 就是每隔 4 个点看一次,比逐点扫快 16 倍,找黑块的位置完全够用。

两个容易踩的坑

坑一:坐标对不上原图。 画布会把背景图缩放到画布大小,上面拿到的是画布坐标。原图 1000 像素宽、画布 360 宽的话,画布上的 1 格相当于原图将近 3 个像素。要原图坐标,用「图片处理」组件取出原图宽高,按比例乘回去就行。

坑二:扫大图时界面点不动。 积木循环跑在界面线程里,一口气扫完之前,App 是「卡住」的。办法有两个:把 gap 调大;或者让计时器每次只扫一行,边扫边显示进度,界面始终能响应。

还有个小细节:画上去的红框也会被「获取背景像素色值」读到,所以要先扫描、后画框,重新扫描前先清一下画布。

写在最后

这几块积木安卓和鸿蒙都支持,写法一样。图片如果是彩色的,先用「图片处理」的灰度功能转一下再扫。

完整的文档里有五个递进的小实验:点哪判哪、列出全部深色点坐标、求深色区域、换算原图坐标、分批扫描不卡顿,每一段积木都能直接照着搭。在 fun123.cn 搜「深色像素」就能找到。

答题卡识别、巡线定位、取色工具,都可以从这几块积木起步。

巡线小车:从画面里找出黑线的位置
巡线小车:从画面里找出黑线的位置

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 第一步:点哪判哪
  • 第二步:把深色区域找出来
  • 两个容易踩的坑
  • 写在最后
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档