"Dikenli nesnenin" sınırlarında daha fazla köşe var, bu yüzden bir yaklaşım bunun için bir köşe dedektörü ayarlamak olacaktır .
Örneğin, mesafe dönüştürülmüş bir görüntünün yapı tensörünün (aşağıdaki Mathematica kodu) belirleyicisini hesapladım:
Histerezis ile ikili hale getirme, seçtiğiniz segmentasyon algoritması için iyi bir başlangıç noktası olması gereken bu görüntüyü verir:
Mathematica kodu ( src
gönderdiğiniz kaynak resimdir)
İlk başta, giriş görüntüsünün mesafe dönüşümünü hesaplarım. Bu, tüm nesne alanı üzerinde (sadece kenarlık yerine) kontrast oluşturur, böylece tüm nesne algılanabilir.
dist = ImageData[DistanceTransform[src]];
Sonra yapı tensörünün bileşenlerini hazırlıyorum . Gauss türevleri için filtre boyutu 5 ise, pencere boyutu 20'dir.
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];
Her pikseldeki köşe filtresini hesaplamak için, bunları yapı tensörünün sembolik belirleyicisine takıyorum:
corners = Det[{{dx2, dxy}, {dxy, dy2}}] /. {dx2 -> gx2, dxy -> gxy, dy2 -> gy2};
Temel olarak aynı:
corners = gx2 * gy2 - gxy * gxy;
Bunu bir görüntüye dönüştürmek ve 0..1 aralığına ölçeklendirmek yukarıdaki köşe dedektörü görüntüsünü verir.
Son olarak, doğru eşiklerle ikili hale getirilmesi nihai, ikili görüntüyü verir:
MorphologicalBinarize[Image[corners], {0.025, 0.1}]