Ada lebih banyak sudut di perbatasan "objek runcing" Anda, jadi salah satu pendekatan adalah menyetel detektor sudut untuk ini.
Sebagai contoh, saya menghitung faktor penentu tensor struktur (kode Mathematica di bawah) dari gambar yang diubah jarak:
Binarizing dengan histeresis menghasilkan gambar ini, yang seharusnya menjadi titik awal yang baik untuk algoritma segmentasi pilihan Anda:
Kode Mathematica ( src
adalah gambar sumber yang Anda poskan)
Pada awalnya, saya menghitung transformasi jarak dari gambar input. Ini menciptakan kontras di seluruh area objek (bukan hanya perbatasan), sehingga seluruh objek dapat dideteksi.
dist = ImageData[DistanceTransform[src]];
Selanjutnya saya siapkan komponen tensor struktur . Ukuran filter untuk turunan gaussian jika 5, ukuran jendela adalah 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];
Untuk menghitung filter sudut pada setiap piksel, saya cukup tancapkan ini ke penentu simbolis dari tensor struktur:
corners = Det[{{dx2, dxy}, {dxy, dy2}}] /. {dx2 -> gx2, dxy -> gxy, dy2 -> gy2};
Yang pada dasarnya sama dengan:
corners = gx2 * gy2 - gxy * gxy;
Mengubah ini ke gambar dan menskalakannya ke kisaran 0..1 menghasilkan gambar detektor sudut di atas.
Akhirnya, melakukan binarizing dengan ambang batas yang tepat menghasilkan citra biner akhir:
MorphologicalBinarize[Image[corners], {0.025, 0.1}]