В задачах сегментации, если у вас есть оба
- Хорошие маркеры; и
- Сильные края вокруг объекта интереса
, то он непосредственно решается с помощью Watershed Transform. Проблема, конечно же, заключается в получении этих маркеров, а также при необходимости повышении соответствующих краев. Получение их может включать в себя проблемы, специфические для меня, которые у меня нет для вашей проблемы.
Тем не менее, существуют некоторые общие методы, которые могут быть полезны. Например, связанные операторы из математической морфологии служат способом слияния и расширения плоских зон. Таким образом, возможно, это может дать нам относительно хорошие маркеры для проблемы. На следующем изображении морфологическая реконструкция путем открытия (своего рода связанный оператор) была выполнена в полутоновой версии исходного изображения (левое изображение), а оставшийся региональный максимум показан справа.
Теперь мы можем получить морфологический градиент левого изображения выше. Мы также можем делать заполнение отверстий и дилатацию небольшим диском в правильном изображении выше для получения более гладких контуров - это определяет наш маркер. Затем, применяя переломное преобразование в градиентном изображении с помощью нашего изображения маркеров, а затем расширяется (размывать или расширяются, зависишь от того, как вы его видите) водораздел линию, мы получим следующее изображение:
I подозреваете, что вы можете легко отбросить слишком большие и слишком маленькие регионы. Затем, если у вас есть приблизительные ожидаемые размеры для когтей, а также для ладони, вы можете отказаться от нерелевантных областей. На данный момент это лишь вопрос дилатации области, чтобы сформировать единый компонент, и показать результирующий контур в исходном изображении:
Пример код для выполнения каждого шага (соответствующие шаги также показаны в прокомментировал 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]]
Проблема, вероятно, сложнее, чем вы думаете. Это может помочь, если вы подробно остановитесь на дальнейшем использовании этой границы, т. Е. Какая точность вам нужна? Если вы хотите просто обнаружить журавль или знать его направление, то точная граница не нужна. –
вы обречены. : - (..... Это чрезвычайно сложная задача обработки изображений. – Shai
@RomanShapovalov Позвольте мне рассказать вам, почему именно мне нужно отметить границы и отказаться от нерелевантной области. Мне нужно проанализировать мопс и на основе некоторых выбранных функций как область Пэда, область пальца ноги, угол между пальцами ноги 2 и 3, длина штыря, ширина и т. д., а затем после сравнения проанализированного изображения с набором тренировок я должен быть в состоянии отличить, какой тигр-жучок он есть. – Suvidha