由于您似乎没有在 OpenCV/Python 解决方案方面获得太多帮助,我想我会以不同的方式发布 - 使用 bash 和 ImageMagick。我会先展示bash 脚本,然后再解释一下。
ImageMagick 安装在大多数 Linux 发行版上,并且可免费用于 macOS 和 Windows。它还具有 C/C++、Perl、Python、PHP、Ruby、Java 绑定。请注意,不需要为此编写任何代码,也不需要编译器。
#!/bin/bash
for colour in red yellow lime ; do
echo -n "Colour: $colour "
convert dots.jpg -fuzz 20% \
-fill white -opaque $colour -fill black +opaque white \
-define connected-components:verbose=true \
-define connected-components:area-threshold=800 \
-connected-components 8 output.png | grep -c "rgb(255,255,255)"
done
输出如下:
Colour: red 10
Colour: yellow 30
Colour: lime 37
convert 命令是 ImageMagick 套件的一部分。让我们看看当colour 是red 时,该命令在第一次循环中是如何工作的。首先,让我们看看convert 命令的前两行:
convert dots.jpg -fuzz 20% \
-fill white -opaque red -fill black +opaque white intermediate.png
希望你能看到它用白色填充 20% 红色范围内的所有像素,然后用纯黑色填充所有非白色的像素。
convert 命令的其余部分通过 “连接组件分析” 将上面的图像放入并列出面积超过 800 像素的所有 blob - 这大约是 blob 平均大小的一半这就是为什么我在 cmets 部分询问有关部分 blob 的原因。让我们看看当我们运行它时会发生什么:
convert intermediate.png \
-define connected-components:verbose=true \
-define connected-components:area-threshold=800 \
-connected-components 8 -auto-level output.png
输出
Objects (id: bounding-box centroid area mean-color):
0: 1342x858+0+0 670.0,426.9 1140186 srgb(0,0,0)
191: 39x39+848+595 866.9,614.1 1165 srgb(255,255,255) <--- DRAW THIS ONE
192: 39x39+482+664 500.9,682.9 1165 srgb(255,255,255)
117: 38x39+4+292 22.5,311.0 1155 srgb(255,255,255)
194: 39x38+1250+732 1268.9,750.5 1154 srgb(255,255,255)
178: 39x38+824+512 843.0,530.1 1154 srgb(255,255,255)
186: 39x38+647+549 666.0,567.5 1152 srgb(255,255,255)
197: 38x39+1270+796 1288.5,815.0 1150 srgb(255,255,255)
173: 38x38+811+444 829.5,462.5 1143 srgb(255,255,255)
195: 38x39+711+783 729.6,801.5 1138 srgb(255,255,255)
107: 27x39+0+223 11.5,242.0 874 srgb(255,255,255)
希望您能看到第一行是描述列的标题,有 10 行是白色的 srgb(255,255,255),每行对应一个 blob - 即您的一个红色磁盘(我们将其设为白色)。它们都是大约 39x39 像素(即方形框中的圆形),面积约为 1150 像素 - 如果您想象半径为 19 像素,那么 Pi*r^2=1150。它们的大小(宽度和高度)和位置(从左上角开始的 x 和 y)位于第二列。
如果您想计算小至全尺寸 blob 的 25% 的部分 blob,您可以将阈值更改为 1150(自然的完整 blob 大小)的 25% 或 287,而不是我估计的 800。
脚本的其余部分只计算其中有白色斑点的行 (grep -c),并为您寻找的其他颜色重复该过程。请注意,您的 "green" 对应于 ImageMagick 使用的 X11 命名方案中的 "lime"。
只是为了好玩,让我们用半透明的蓝色填充我在上面的输出列表中用箭头标记的blob:
convert dots.jpg -fill "rgba(0,0,255,0.5)" -draw "rectangle 848,595 887,634" temp.png
我希望这有助于完成工作并展示一种方法,即使它不是您期望使用的工具。请注意,OpenCV 有 Connected Components 和类似的算法 - 我只是不会说 Python,C++ 版本对你没有更多帮助!