Вы можете решить (для некоторых значений «решить») эту проблему, используя морфологию. Во-первых, чтобы сделать изображение более однородным, удалите ненужные минимумы. Один из способов сделать это — использовать преобразование 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]). Такой подход дает гибкость при выборе параметров, упрощая выбор/нахождение хороших значений.
![введите здесь описание изображения](https://i.stack.imgur.com/tTmdFm.png)
![введите здесь описание изображения](https://i.stack.imgur.com/bAiUbm.png)
Чтобы вычислить площадь в пространстве между двумя самыми большими компонентами, мы могли бы объединить их и просто подсчитать черные пиксели внутри нового связанного компонента.
person
mmgp
schedule
12.12.2012