Na rogach „kolczastego obiektu” znajduje się więcej rogów, więc jednym z podejść byłoby dostrojenie detektora narożnego .
Na przykład obliczyłem wyznacznik tensora struktury (kod Mathematica poniżej) obrazu przekształconego na odległość:
Binaryzacja z histerezą daje ten obraz, który powinien być dobrym punktem wyjścia dla wybranego algorytmu segmentacji:
Kod Mathematica ( src
to opublikowany obraz źródłowy)
Najpierw obliczam transformację odległości obrazu wejściowego. Stwarza to kontrasty na całym obszarze obiektu (zamiast samej granicy), dzięki czemu można wykryć cały obiekt.
dist = ImageData[DistanceTransform[src]];
Następnie przygotowuję elementy tensora konstrukcji . Rozmiar filtra dla pochodnych gaussowskich, jeśli 5, rozmiar okna wynosi 20.
gx = GaussianFilter[dist, 5, {1, 0}];
gy = GaussianFilter[dist, 5, {0, 1}];
gx2 = GaussianFilter[gx^2, 20];
gxy = GaussianFilter[gx*gy, 20];
gy2 = GaussianFilter[gy^2, 20];
Aby obliczyć filtr narożny dla każdego piksela, po prostu podłączam je do symbolicznego wyznacznika tensora struktury:
corners = Det[{{dx2, dxy}, {dxy, dy2}}] /. {dx2 -> gx2, dxy -> gxy, dy2 -> gy2};
Co jest w zasadzie takie samo jak:
corners = gx2 * gy2 - gxy * gxy;
Przekształcenie tego w obraz i skalowanie do zakresu 0..1 daje obraz detektora narożnego powyżej.
Wreszcie, binaryzacja za pomocą odpowiednich progów daje końcowy, binarny obraz:
MorphologicalBinarize[Image[corners], {0.025, 0.1}]