Обнаружение объекта в изображении однородной интенсивности
У меня есть изображение Пигмарка Тигра (отпечаток следа) в грязи. Я хочу определить границу маркера, но изображение имеет одинаковую интенсивность, то есть передний план, и фон не может быть различен на основании изменений интенсивности. Что я могу сделать, чтобы отличить марку от фона?
2 ответа
В задачах сегментации, если у вас есть оба
- Хорошие маркеры; а также
- Сильные края вокруг объекта интереса
тогда это непосредственно решено Преобразованием Водораздела. Проблема, конечно, заключается в получении этих маркеров, а также в усилении соответствующих ребер по мере необходимости. Для их получения может потребоваться знание конкретной проблемы, которого у меня нет для вашей проблемы.
Тем не менее, есть некоторые общие методы, которые могут быть полезны. Например, связанные операторы из математической морфологии служат способом объединения и расширения плоских зон. Таким образом, возможно, это может дать нам относительно хорошие маркеры для проблемы. На следующем изображении морфологическая реконструкция путем раскрытия (вид связанного оператора) была выполнена в версии в оттенках серого исходного изображения (левое изображение), а оставшийся региональный максимум показан справа.
Теперь мы можем получить морфологический градиент левого изображения выше. Мы также можем выполнить заполнение отверстий и расширение небольшим диском на правом изображении выше, чтобы получить более гладкие контуры - это определяет наше изображение маркера. Затем, применяя преобразование водораздела к градиентному изображению с помощью нашего изображения маркера, а затем расширяя (размываем или расширяем, в зависимости от того, как вы его видите) линии водораздела, мы получаем следующее изображение:
Я подозреваю, что вы можете легко отбросить слишком большие и слишком маленькие регионы. Затем, если у вас есть приблизительные ожидаемые размеры для когтей, а также для ладони, вы можете отбросить ненужные области. На данный момент это только вопрос расширения областей, чтобы сформировать единый компонент и показать результирующий контур на исходном изображении:
Пример кода для выполнения каждого шага (соответствующие шаги также показаны в закомментированном коде Matlab):
f = Import["http://imageshack.us/a/img407/4636/p1060993g.jpg"]
g = ColorConvert[f, "Grayscale"] (* g = rgb2gray(f); *)
(* First image shown: *)
geo = GeodesicOpening[g, DiskMatrix[5]] (* geo = imreconstruct(imerode(g, ... *)
(* strel('disk', 6)), g); *)
(* Second image shown: *)
marker = MaxDetect[geo] (* marker = imregionalmax(geo); *)
(* Watershed on gradient with markers. *)
mgrad = ImageSubtract[Dilation[geo, 1], Erosion[geo, 1]]; (* mgrad = ... *)
(* imdilate(geo,strel('square',3)) - imerode(geo,strel('square',3)); *)
ws = Image[ (* ws = watershed(imimposemin(mgrad, bwmorph(imfill(... *)
WatershedComponents[mgrad, (* imregionalmax(geo),'holes'),'dilate')))); *)
Dilation[FillingTransform[marker], DiskMatrix[1]]]]
(* Third image shown: *)
wsthick = Erosion[ws // ImageAdjust, DiskMatrix[5]]
(* Connected component selection based on some supposed sizes. *)
ccs = SelectComponents[wsthick, "Count", 1000 < # < 3000 || 6000 < # < 10000 &]
(* Final image (thick border on binarized filled dilated ccs) *)
res = ImageAdd[f, Dilation[MorphologicalPerimeter[FillingTransform[
MorphologicalPerimeter[Dilation[ccs, DiskMatrix[9]]]]], 2]]
Подход в ответе @mmpg может быть нестабильным, поскольку используемые алгоритмы требуют установки параметров, которые могут быть специфическими для каждого изображения. Эта проблема, кажется, лучше подходит для параметрических моделей, которые имеют предварительные знания о форме.
Каркас Active Shape Models итеративно аппроксимирует границу фигуры. Сначала вы инициализируете его с некоторой средней формой (изображения являются просто иллюстрациями, а не фактическим результатом алгоритма):
Контур определяется опорными точками (показаны синими галочками, только для ладони, чтобы избежать беспорядка). В каждой итерации алгоритма рассматриваются ортогональные направления в каждой точке привязки и оценивает вероятность границы на каждой дистанции (обычно с использованием градиента изображения, но в вашем случае это должно быть более сложным, - может быть разница в структуре, например, расстояние между гистограмм текстонов). Здесь красными точками выделены arg-максимумы этих распределений:
Затем новый контур подгоняется к данным, чтобы максимизировать эти распределения, умноженные на предыдущее распределение формы. Если исходить из единого априора, новый контур будет выглядеть так:
На практике вы хотели бы иметь нетривиальное распределение форм. Чтобы оценить это, вам понадобится обучающий набор изображений, где маски пометок помечаются вручную.
Вы можете попробовать эту реализацию MATLAB.