Как определить границы шаблона


comment
Это единственные типы закономерностей, которые вы хотите обнаружить? Или они изменятся? Кроме того, какой у вас язык программирования/платформа? Доступные библиотеки будут различаться в зависимости от вашего ответа.   -  person Ani    schedule 11.12.2012
comment
Узоры не меняются. Это полосы, вертикальные или горизонтальные. А насчет библиотек и языка все было бы хорошо, так как я в основном ищу идею. Спасибо.   -  person Hamed    schedule 11.12.2012
comment
@Astor: Между этой темой и другой нет никакой связи. Здесь я не обнаруживаю линии и не извлекаю. Цель состоит в том, чтобы обнаружить регионы/сегменты. использование предложенных методов другой темы не будет полезно, например, для обнаружения 3 областей на этом изображении. Я прав?   -  person Hamed    schedule 12.12.2012
comment
Люди отвергают то, чего не понимают, это явно не дубликат и уж тем более не точный дубликат. Stackoverflow находится в печальном состоянии.   -  person mmgp    schedule 02.01.2013


Ответы (3)


Вы можете решить (для некоторых значений «решить») эту проблему, используя морфологию. Во-первых, чтобы сделать изображение более однородным, удалите ненужные минимумы. Один из способов сделать это — использовать преобразование h-купола для региональных минимумов, которое подавляет минимумы высоты ‹ h. Теперь мы хотим соединить тонкие линии. Это достигается морфологическим открытием с горизонтальной линией длиной l. Если линии были объединены, то фоном являются региональные минимумы текущего изображения. Таким образом, мы можем заполнить отверстия, чтобы получить соответствующие компоненты. Следующий код суммирует эти задачи:

f = rgb2gray(imread('http://i.stack.imgur.com/02X9Z.jpg'));
hm = imhmin(f, h);
o = imopen(hm, strel('line', l, 0));
result = imfill(~imregionalmin(o), 'holes');

Теперь вам нужно определить h и l. Ожидается, что параметр h будет проще, поскольку он не связан с масштабом ввода, и в вашем примере значения в диапазоне [10, 30] работают нормально. Чтобы определить l, может помочь гранулометрический анализ. Другой способ — проверить, содержит ли result два важных связанных компонента, соответствующих большей L-образной форме и области тонких линий. Нет необходимости увеличивать l один за другим, вы можете выполнить что-то похожее на бинарный поиск.

Вот изображения hm, o и result с h = 30 и l = 15 (здесь одинаково хорошо работает l в [13, 19]). Такой подход дает гибкость при выборе параметров, упрощая выбор/нахождение хороших значений.

введите здесь описание изображениявведите здесь описание изображения введите здесь описание изображения

Чтобы вычислить площадь в пространстве между двумя самыми большими компонентами, мы могли бы объединить их и просто подсчитать черные пиксели внутри нового связанного компонента.

person mmgp    schedule 12.12.2012
comment
Я действительно благодарю вас за ваше время. Мой последний метод был близок к вашему, за исключением части imhmin. Это взорвало мне мозг!!!! НО, что бы вы сделали, если бы входное изображение было таким же с поворотом на 90 футов? Тогда горизонтальные линии будут подчеркнуты, и вы не сможете получить такой же идеальный результат. По этому вопросу я не могу делать никаких предположений о направлении входного изображения. Спасибо. - person Hamed; 12.12.2012
comment
Есть способы оценить ориентацию. В вашем случае есть простые способы учета объема после морфологического закрытия горизонтальными линиями. Например, вот что я получаю с линией шириной/2: i.imgur.com/GNx8u. png i.imgur.com/gUUrM.png. Чтобы лучше понять это, подумайте о том, чтобы прочитать «Ориентация структуры изображения с использованием математической морфологии» Сойля и Талбота. - person mmgp; 12.12.2012

Вы можете передать окно (10x10 пикселей?) и собрать функции для этого окна. Функции могут быть такими простыми, как кумулятивные градиенты (края) внутри этого окна. Это позволит различать различные области, если окно достаточно велико.

Затем, используя каждое окно в качестве точки данных, вы можете выполнить некоторую кластеризацию, или, если шаблоны не сильно различаются, вы можете установить некоторые простые пороговые значения, чтобы определить, какие точки данных принадлежат каким шаблонам (большие суммы градиентов принадлежат маленьким линиям). : больше ребер, в то время как наименьшие суммы градиентов относятся к самым толстым линиям: только одно ребро, а те, что между ними, принадлежат другому «промежуточному» шаблону.

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

person Noremac    schedule 12.12.2012
comment
Спасибо Нормак. Изначально я думал о подобном методе. Но я заметил, что хотя узоры/текстуры довольно постоянны, но зазор между линиями полос значительно отличается. На некоторых изображениях окно размером 10х10 будет состоять из 3-4 строк, а на других изображениях оно не будет включать даже одну строку, так как расстояние между промежутками будет в разы больше. Это изменение относится и к другим частям. Я правильно понял ваше предложение? Спасибо. - person Hamed; 12.12.2012
comment
Похоже, вы делаете по большей части. Если есть надежная верхняя граница (ширина самых больших областей), то вы можете, по крайней мере, получить преимущество по всем этим параметрам. И если я правильно понимаю ваши опасения, на самом деле будет четыре класса (большой, средний, маленький, ни одного). Разный зазор между линиями полос — это то, что отличает разные области. Если нет разумной верхней границы, то это, вероятно, не очень хороший подход. - person Noremac; 12.12.2012

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

person Noremac    schedule 12.12.2012
comment
Спасибо за комментарий. Но использование компонента BW+Connected полностью испортит интересующие нас текстуры. С другой стороны, как видите, все упомянутые регионы связаны друг с другом. Сегментация также не будет хорошей идеей по той же причине. - person Hamed; 12.12.2012