Как определить полностью сформированные прямоугольники?

#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. Большое спасибо за объяснение. Я пытаюсь понять и применить вашу логику, чтобы автоматически получать координаты прямоугольников.