Подсчет количества объектов в PNG-изображении с помощью ImageMagick

Я пытаюсь подсчитать количество объектов на изображении

У меня есть тестовое изображение Подсчет количества объектов в PNG-изображении с помощью ImageMagick

и после использования магической функции php я могу преобразовать ее в двоичное изображение

Подсчет количества объектов в PNG-изображении с помощью ImageMagick

мне нужна функция, которая возвращает количество белых объектов на изображении в этом случае 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")
);

Я опубликовал более 40 ответов по этому поводу, введите следующее в поле поиска StackOverflow user:2836621 connected components

Mark Setchell 10.09.2018 17:18

@MarkSetchell, я смотрел этот ваш пост, и я думаю, что это было бы моим решением, однако функция exec ничего не возвращает, я устал от простой команды преобразования, и она работала

Hassan Nisar Khan 10.09.2018 18:08

Мне надоели разные куски команды exec ("convert binary.jpg -colorspace gray -negate -threshold 10% -define connected-components: verbose = true -define connected-components: area-threshold = 100 output.png", $ o) его работа и output.png создается (однако я ничего не получаю взамен в php), но когда я добавляю последнюю команду -connected-components 8 -auto-level, выходной файл не создается, поэтому это означает, что есть какая-то ошибка

Hassan Nisar Khan 10.09.2018 18:15
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
3
325
2

Ответы 2

Кажется, это то, что вам нужно:

<?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)

и обратите внимание на цвет (если вам нужны белые объекты), а также на площадь - поля / столбцы названы / помечены в первой строке вывода. Итак, вы должны заметить, что обнаружены 2 объекта: первый белый и меньшего размера, второй черный и имеет размер всего изображения.

все еще отмечая, он возвращает пустую строку, команда работает и файл создается

Hassan Nisar Khan 10.09.2018 18:34

Я не на машине, где могу протестировать, может, попробую $output = shell_exec("convert ... 2>&1")

Mark Setchell 10.09.2018 18:36

код и структура файла awmark.website/nadeem_img_processing/code.png shell_exec возвращают null

Hassan Nisar Khan 10.09.2018 18:39

Удалите там постороннюю обратную косую черту.

Mark Setchell 10.09.2018 18:40

Ммм ... в оболочке / Терминале попробуйте найти полный путь к convert с помощью which convert, а затем используйте полный путь в своем коде.

Mark Setchell 10.09.2018 18:51

Вам вдруг кажется, что вы используете изображение в формате JPEG! Пожалуйста, убедитесь, что он двоичный с convert image.jpg -colorspace gray -threshold 50% -define ....

Mark Setchell 10.09.2018 18:54

Позвольте нам продолжить обсуждение в чате.

Hassan Nisar Khan 10.09.2018 19:01

Какая у вас версия ImageMagick? -connected-components требуется как минимум версия 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 :.

Если вы хотите, чтобы выходные данные были двоичными, а не закодированными в градациях серого для номеров идентификаторов, добавьте -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

Другие вопросы по теме