2017-01-22 4 views
0

Я ищу способ программно (без использования графического интерфейса пользователя) найти координаты небольшого изображения в большом изображении.найти координаты небольшого частично прозрачного изображения в большом изображении

Моя цель - найти координаты маленького corner images и увеличить изображение большего размера. С этими координатами я хочу определить конкретные «области интереса», чтобы я мог сосредоточиться на этих регионах, представляя изображение или вырезая эти области из изображения.

Описанная corner images может выглядеть, как эти (не обращайте внимания на синие номера, так как они только комментарии, которые я хотел бы использовать серые PNG графики с прозрачностью.):
enter image description here
1 верхний левый угол
2 дно левый угол
3 нижний правый угол
4 верхний правый угол

Эти corner images размещены в определенных положениях в пределах на большом изображении:
enter image description here
Каждый набор corner icons определяет «область интересов» (как определить, какой из нескольких верхних левых углов принадлежит тому, какой регион будет другой проблемой).

Я хотел бы использовать бесплатную библиотеку с открытым исходным кодом вместе с командной строкой или интерфейсом Python. Похоже, что библиотека ImageMagick выглядит довольно близко к возможному решению. Но любая другая технология была бы прекрасна, если бы решила эту проблему.

С, например. в библиотеке ImageMagick я хотел бы последовательно проверить четыре corner items (это всего лишь 90-градусные вращения того же исходного изображения) и «сравнить» каждое из них с большим изображением. В пределах большого изображения было бы более чем возможно, чтобы corner items находились «очень близко» к другому графическому контенту. Таким образом, простое блочное тестирование идентичности может потерпеть неудачу. «Прозрачность» следует рассматривать как «не волнует».

Какой инструмент и процесс можно использовать для получения абсолютных x- и y-положений такого маленького изображения в более крупном?

+1

Это очень похоже ... http: // stackoverflow.com/a/41761313/2836621 –

+0

Просьба представить несколько образцов изображений, чтобы мы могли видеть, что вы имеете в виду. –

+0

@Mark: Да, действительно, мой вопрос можно было бы надеяться решить методами, которые вы упомянули в своем ответе на другой вопрос. Я попробую и вернусь сюда. – nnako

ответ

1

Поиск фигур в изображениях довольно прост и может занять довольно много времени, потому что вы в конечном итоге пытаетесь совместить форму с каждой позицией пикселя вашего большого изображения и включаете в себя множество умножений и сравнений. Для сравнения, поиск цвета относительно прост, поэтому я бы посоветовал вам рассмотреть использование насыщенных цветных маркеров и, как ваши рисунки вручную, они вряд ли будут встречаться на ваших рисунках.

Так что, возможно, что-то вдоль этих линий (верхний левый tl.png, верхний правый tr.png, нижний левый bl.png и нижний правый br.png):

convert -size 24x24 xc:none -background grey -gravity northwest -splice 1x1 -fill magenta -draw "point 0,0" tl.png 

enter image description here

convert -size 24x24 xc:none -background grey -gravity northeast -splice 1x1 -fill cyan -draw "point 24,0" tr.png 

enter image description here

convert -size 24x24 xc:none -background grey -gravity southeast -splice 1x1 -fill yellow -draw "point 24,24" br.png 

enter image description here

convert -size 24x24 xc:none -background grey -gravity southwest -splice 1x1 -fill blue -draw "point 0,24" bl.png 

enter image description here

Будет надеяться, что вы можете увидеть голубые, пурпурный, желтый и синий маркеры в каждом углу и что серый визуальном эффекте вы были до того, как сохраняетесь. Здесь они взорваны:

enter image description here

Тогда, если у вас есть изображение, как это:

enter image description here

Вы можете легко найти углы с:

convert z.png txt: | grep -E "cyan|magenta|yellow|blue" 

Выход

11,11: (65535,0,65535) #FFFF0000FFFF magenta 
380,11: (0,65535,65535) #0000FFFFFFFF cyan 
11,180: (0,0,65535) #00000000FFFF blue 
380,180: (65535,65535,0) #FFFFFFFF0000 yellow 
11,201: (65535,0,65535) #FFFF0000FFFF magenta 
355,201: (0,65535,65535) #0000FFFFFFFF cyan 
11,365: (0,0,65535) #00000000FFFF blue 
355,365: (65535,65535,0) #FFFFFFFF0000 yellow 

Для дополнительной уверенности в маркерах, которые не встречаются на вашем изображении, вы можете добавить второй, маловероятный цвет рядом с голубыми, пурпурными, желтыми угловыми пикселями, на которые вы отступили, чтобы наверняка найти маркер - скажем, красный и зеленый, то вероятность того, что естественное появление на вашем изображении будет бесконечно мала.


Если вы хотите сравнить комбинационной подход, вы могли бы сгладить мой tl.png (верхний левый) на белом фоне, как это:

convert tl.png -background white -flatten x.png 

и сделать поиск суб-изображения, как это:

compare -metric RMSE -subimage-search z.png x.png locations.png 
2208.73 (0.0337031) @ 11,11 

, и вы увидите, что она занимает 11 секунд и генерирует эти два изображения:

enter image description here

и

enter image description here

, которые показывают, где находится совпадение и процент уверенности в матче.

P.S. Я сделал большой снимок с этим:

convert -size 600x400 xc:white -draw "image over 10,10 35,35 'tl.png'" -draw "image over 355,10 25,25 'tr.png'" -draw "image over 10,155 25,25 'bl.png'" -draw "image over 355,155 25,25 'br.png'" -draw "image over 10,200 35,35 'tl.png'" -draw "image over 330,200 25,25 'tr.png'" -draw "image over 10,340 25,25 'bl.png'" -draw "image over 330,340 25,25 'br.png'" -bordercolor black -border 1 z.png