Обнаружение объекта в изображении однородной интенсивности

У меня есть изображение Пигмарка Тигра (отпечаток следа) в грязи. Я хочу определить границу маркера, но изображение имеет одинаковую интенсивность, то есть передний план, и фон не может быть различен на основании изменений интенсивности. Что я могу сделать, чтобы отличить марку от фона?

http://imageshack.us/a/img407/4636/p1060993g.jpg

2 ответа

Решение

В задачах сегментации, если у вас есть оба

  1. Хорошие маркеры; а также
  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.

Другие вопросы по тегам