W zadaniach segmentacji jeśli masz obie
- Dobry markerów; i
- Silne krawędzie wokół obiektu zainteresowania
to jest bezpośrednio rozwiązywany przez punkt zwrotny Transform. Problemem jest oczywiście uzyskanie tych znaczników, a także zwiększenie odpowiednich krawędzi w razie potrzeby. Ich uzyskanie może wymagać wiedzy specyficznej dla problemu, której nie mam dla twojego problemu.
Istnieje jednak kilka ogólnych metod, które mogą być przydatne. Na przykład, podłączeni operatorzy z Morfologii Matematycznej służą jako sposób łączenia i rozszerzania płaskich stref. Może więc może dać nam względnie dobre markery dla problemu. Na poniższym obrazie przeprowadzono rekonstrukcję morfologiczną przez otwarcie (rodzaj połączonego operatora) w skali szarości oryginalnego obrazu (lewy obraz), a pozostałe maksimum regionalne pokazano po prawej.
Teraz możemy uzyskać gradient morfologiczny lewym obrazie powyżej. Możemy również wykonać wypełnienie otworu i rozszerzenie z małym dyskiem na prawym obrazku powyżej, aby uzyskać bardziej płynne kontury - to definiuje nasz obraz znacznika. Następnie, stosując przełomowym Transform na obraz gradientu za pomocą naszego znacznika obrazu, a następnie rozszerzenie (osłabienie lub rozszerzają się, zależy od tego, jak widać go) linie działów wodnych, otrzymamy następujący obraz:
I podejrzewasz, że możesz łatwo odrzucić zbyt duże i zbyt małe regiony. Następnie, jeśli masz jakieś spodziewane rozmiary dla pazurów, a także dla dłoni, możesz odrzucić nieistotne regiony. W tym momencie jest to tylko kwestia rozszerzanie obszarów, które tworzą jeden komponent i wyświetlić wynikowy kontur oryginalnego obrazu:
przykładowy kod do wykonywania każdego etapu (odpowiednie kroki są również pokazane w skomentował kod 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]]
Problem jest prawdopodobnie trudniejszy niż myślisz. Może ci pomóc, jeśli rozwiążesz dalsze użycie tej granicy, tj. Jakiej precyzji potrzebujesz? Jeśli chcesz tylko wykryć znak pugmark lub znać jego kierunek, dokładna granica jest niepotrzebna. –
jesteś skazany na zagładę. : - (..... Jest to niezwykle trudne zadanie przetwarzania obrazu – Shai
@RomanShapovalov Pozwolę sobie wyjaśnić, dlaczego konkretnie muszę zaznaczyć granice i odrzucić nieistotny region.Muszę przeanalizować pugmark i na podstawie wybranych funkcji takie jak obszar padu, obszar palców, kąt między toe 2 i 3, długość pugmark, szerokość, itd., a następnie po porównaniu analizowanego obrazu z zestawem treningowym muszę być w stanie rozróżnić, który to tygrys jest tygrysem – Suvidha