使用ImageMagick计算PNG图像中的对象数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用ImageMagick计算PNG图像中的对象数相关的知识,希望对你有一定的参考价值。

我试图计算图像中的对象数量

我有一个测试图像test image with red squars

使用php魔术功能后,我可以将其转换为二进制图像

test image converted into binary image

我需要的是一个在这种情况下返回图像中白色物体数量的函数8我不太了解图像但是在imagemagic上有一个删除的帖子使用以下命令

var_dump( 
        exec("convert out.pbm -define connected-components:verbose=true  -define connected-components:area-threshold=50  -connected-components 4 -auto-level -depth 8 test.png")
);
答案

你的ImageMagick版本是什么?连接组件至少需要6.8.9.10版。取出并将其全部排成一行。使用新行可能会混淆PHP exec()。

以这种方式尝试并将区域阈值增加到150:

<?php
exec("convert out.pbm -define connected-components:verbose=true -define connected-components:area-threshold=150 -connected-components 4 -auto-level -depth 8 test.png 2>&1",$out,$returnval);
foreach($out as $text)
{echo "$text<br>";}
?>

它应该返回:

Objects (id: bounding-box centroid area mean-color):
  22: 665x500+0+0 332.0,241.1 295195 gray(0)
  7605: 125x101+86+380 150.6,431.3 10246 gray(255)
  6995: 139x105+476+350 541.7,401.0 10087 gray(255)
  5560: 94x62+133+233 182.0,265.4 4622 gray(255)
  5196: 106x61+434+217 483.3,246.8 4608 gray(255)
  3470: 76x42+162+145 201.4,164.9 2448 gray(255)
  3023: 76x40+401+126 438.7,145.5 2391 gray(255)
  1420: 58x28+186+75 215.5,88.7 1315 gray(255)
  992: 61x24+385+64 414.3,75.7 1146 gray(255)
  2: 33x18+0+0 12.9,6.6 391 gray(0)

如果您只想要没有图像的列表,可以将test.png替换为null:。

如果您希望输出为二进制而不是为id编号进行灰度编码,则添加-define connected-components:mean-color = true:

<?php
exec("convert out.pbm -define connected-components:verbose=true -define connected-components:area-threshold=150 -define connected-components:mean-color=true -connected-components 4 -auto-level -depth 8 test.png 2>&1",$out,$returnval);
foreach($out as $text)
{echo "$text<br>";}
?>

如果您只想要计数和二进制输出,请尝试:

<?php
exec("convert image.jpg -define connected-components:verbose=true -define connected-components:area-threshold=150 -define connected-components:mean-color=true -connected-components 4 -auto-level -depth 8 test.png 2>&1 | grep "gray(255)" | wc -l | sed 's/^[ ]*//' ",$out,$returnval);
foreach($out as $text)
{echo "$text<br>";}
?>

哪个应该返回8。

https://www.imagemagick.org/script/connected-components.php

另一答案

这似乎做你需要的:

<?php
$output=shell_exec("convert -size 1000x1000 xc:black -fill white -draw "rectangle 10,10 900,900" -define connected-components:verbose=true -connected-components 4 -auto-level -depth 8 test.png");
echo $output;
?>

一定要解析输出,如下所示:

Objects (id: bounding-box centroid area mean-color):
1: 891x891+10+10 455.0,455.0 793881 srgba(100%,100%,100%,1.08255)
0: 1000x1000+0+0 670.9,670.9 206119 srgba(0%,0%,0%,1.31795)

并注意颜色(如果你想要白色物体)以及区域 - 字段/列在第一行输出中标题/标记。所以你应该注意到有两个物体被检测到,第一个是白色和更小的物体,第二个是黑色和整个图像的大小。

以上是关于使用ImageMagick计算PNG图像中的对象数的主要内容,如果未能解决你的问题,请参考以下文章

使用 ImageMagick 将 gif 转换为 png 时出现“转换:不正确的图像标题”错误

使用ImageMagick调整索引的PNG图像大小,同时保留颜色贴图

当我只想在 JPG 和 PNG 之间转换时,为啥 ImageMagick 会改变图像亮度?

将 PDF 转换为 PNG

使用 imagemagick 将 GIF 图像转换为 PNG,但得到的是 RGBA 图像而不是调色板版本

perl imagemagick中的png水印,使png透明