#imagemagick #coordinates
#imagemagick #координаты
Вопрос:
Я пытаюсь определить координаты полностью сформированных прямоугольников. Я имею в виду, что они имеют 4 стороны с белой линией границы, образующей полностью прямоугольник.
Это входное изображение, которое у меня есть.
На изображении ниже я показываю желтым цветом прямоугольники, для которых я хотел бы получить координаты.
В этом входном изображении есть 3 черных прямоугольника с белой линией границы и 1 прямоугольник, который полностью белый.
Мой текущий convert
код дает координаты всех областей, включая те белые области, которые создают шум для моей цели.
convert input.png
-define connected-components:verbose=true
-define connected-components:area-threshold=100
-connected-components 8 -auto-level out:null | grep "255,255,255"
7602: 233x81 295 192 411.0,232.0 18873 srgb(255,255,255)
31: 356x70 365 28 542.4,57.2 4602 srgb(255,255,255)
7604: 538x510 45 273 163.1,529.1 4394 srgb(255,255,255)
7605: 292x470 627 273 809.5,494.2 2116 srgb(255,255,255)
1393: 149x45 785 40 860.8,60.5 2040 srgb(255,255,255)
8449: 513x125 70 658 326.0,708.6 761 srgb(255,255,255)
7015: 43x27 291 110 312.5,122.1 620 srgb(255,255,255)
7599: 84x43 676 148 717.5,169.0 250 srgb(255,255,255)
Итак, мой вопрос: есть ли способ определить из выходных данных, предоставленных convert
командой, какие координаты принадлежат полностью сформированным прямоугольникам? Спасибо
Ответ №1:
На ум приходит пара идей. Я еще не превратил их в полноценные решения, но могу сделать это позже, если позволит время.
-
Возможно, вы могли бы выбрать центр каждого подключенного компонента в своем списке в качестве начальной точки для заливки, скажем, желтым цветом, а затем сделать все, что не является желтым, черным (с
-fill black opaque yellow
) и снова запустить подключенные компоненты, чтобы увидеть, получаете ли вы заполненную форму правильной области. Итак, например, выбор вашей 4-й строки вывода:7604: 538×510 45 273 163.1 ,529.1 4394 srgb (255,255,255)
И заливка заливки из центра:
magick outlines.png -fill yellow -floodfill 314 478 black result.png
Или, может быть, пойти немного дальше:
magick outlines.png -fill yellow -floodfill 314 478 black -fill black opaque yellow result.png
Затем запустите другой анализ подключенных компонентов и посмотрите, обнаружите ли вы полностью заполненную желтым форму.
- Возможно, вы могли бы запустить морфологию «Попадание или промах», ища концы линий и следуя за ними до Т-образных соединений и стирая их, чтобы избавиться от «перекрывающихся» линий, которые выступают за концы ваших прямоугольников.
Кстати, если вы ищете именно прямоугольники, вам, вероятно, будет лучше проверять наличие 4-соединенных компонентов, а не 8-соединенных, как в настоящее время.
Комментарии:
1. Спасибо, Марк, за ваш ответ. Я понимаю, что из первого вывода подключенного компонента, который я получаю, мне нужно будет запустить цикл и выполнить заливку, которую вы предлагаете, затем снова применить
connected components
и проверить сif
условием, есть только одна строка, содержащая желтый цвет? У меня есть еще одно сомнение: почему вы используете314 478
в своих командах? Еще раз спасибо.2. Глядя на компонент, о котором я упоминал, с геометрией
538x510 45 273
. Это 538 пикселей в ширину и 510 пикселей в высоту с верхним левым углом 45 273. Таким образом, его x-центр находится в45 538/2
точке, которая, как мы надеемся, равна 314. Его y-центр находится в273 510/2
точке, в которой должно быть 528, так что, да, мой 478 немного смещен.3. Большое спасибо за объяснение. Я пытаюсь понять и применить вашу логику, чтобы автоматически получать координаты прямоугольников.