2012-11-26 20 views
6

Sarmal şekilli bir yayı algılayıp bobin dönüşlerini saymalıyım. Ben denedimSpiralin dönüşü nasıl algılanır ve sayılır

aşağıdaki gibidir:

Image<Bgr, Byte> ProcessImage(Image<Bgr, Byte> img) 
{ 
    Image<Bgr, Byte> imgClone = new Image<Bgr,byte>(img.Width, img.Height); 
    imgClone = img.Clone(); 
    Bgr bgrRed = new Bgr(System.Drawing.Color.Red); 


    #region Algorithm 1 


    imgClone.PyrUp(); 
    imgClone.PyrDown(); 
    imgClone.PyrUp(); 
    imgClone.PyrDown(); 
    imgClone.PyrUp(); 
    imgClone.PyrDown(); 

    imgClone._EqualizeHist(); 
    imgClone._Dilate(20); 
    imgClone._EqualizeHist(); 
    imgClone._Erode(10); 

    imgClone.PyrUp(); 
    imgClone.PyrDown(); 
    imgClone.PyrUp(); 
    imgClone.PyrDown(); 
    imgClone.PyrUp(); 
    imgClone.PyrDown(); 

    imgClone._EqualizeHist(); 
    imgClone._Dilate(20); 
    imgClone._EqualizeHist(); 
    imgClone._Erode(10); 


    Image<Gray, Byte> imgCloneGray = new Image<Gray, byte>(imgClone.Width, imgClone.Height); 

    CvInvoke.cvCvtColor(imgClone, imgCloneGray, Emgu.CV.CvEnum.COLOR_CONVERSION.CV_BGR2GRAY); 

    imgCloneGray = imgCloneGray.Canny(c_thresh, c_threshLink);//, (int)c_threshSize); 

    Contour<System.Drawing.Point> pts = imgCloneGray.FindContours(Emgu.CV.CvEnum.CHAIN_APPROX_METHOD.CV_CHAIN_APPROX_SIMPLE, Emgu.CV.CvEnum.RETR_TYPE.CV_RETR_EXTERNAL); 

    CvInvoke.cvCvtColor(imgCloneGray, imgCloneYcc, Emgu.CV.CvEnum.COLOR_CONVERSION.CV_GRAY2BGR); 

    if (null != pts) 
    { 
     imgClone.Draw(pts, bgrRed, 2); 
     imgClone.Draw(pts.BoundingRectangle, bgrRed, 2); 
    } 

    #endregion 

    return imgClone; 
} 

Input Image OutputImage

Bazı ne kadar yayı elde edebilir ama nasıl sayar alır. Algoritmalar arıyorum. Şu anda hız optimizasyonu arıyorum.

Bu, parmakları saymaya benzer. Bahar sarmal kontur kullanmak için çok ince. Başka ne yapılabilir. http://www.luna-arts.de/others/misc/HandsNew.zip

+0

herkes, ben doğru bir yön ihtiyacım var! – Rick2047

+0

Biraz daha kendi algoritmamla denedim. Ancak ince nesnelerin algılanması zordur (şu an için yolu bilmiyorum). – Rick2047

cevap

3

Orada iyi bir son bölüştürme var, ancak bu tek durum için çok kısıtlanmış gibi görünüyor. Nispeten iyi bir ikili hale getirme için nispeten daha basit, ama muhtemelen daha sağlam bir ön işlem yapacağım. Matematiksel Morfolojisi kaynaktan, yükseklik < h minimumlar/maksimumları baskılayarak alakasız minimum/maxima çıkarmak için kullanılan bir dönüşüm olarak adlandırılan h kubbe bulunmaktadır. Bu işlem görüntü işleme kitaplığınızda kolayca bulunmayabilir, ancak bunu uygulamak zor değildir. Bu önceden işlenmiş görüntüyü ikiye katlamak için Otsu'nun yöntemini seçtim, çünkü otomatik ve istatistiksel olarak optimal. Ben çok basit bir şey yaptım

enter image description here Şimdi enter image description here

, sayısını saymak için "spiral döner": Ben bölmek İşte

h-kubbe dönüşümler sonrasında giriş resim ve ikili görüntü spiraller, onları bağlı bileşenler olarak sayabilirim. Onları bölmek için ben bir ilköğretim kare ile tek dilatasyon ardından dikey çizgiyle tek morfolojik açıklığı yaptı. Bu yaklaşım doğru hepsini sayılır, çok yakın değil 13 tanesinin beri 15. verir

enter image description here

bileşenleri Sayma: Bu aşağıdaki görüntü üretir. Sol ve sağdaki gruplar tek bir sayıldı.

adımları yapmak için kullanılan tam Matlab kodu:

f = rgb2gray(imread('http://i.stack.imgur.com/i7x7L.jpg')); 
% For this image, the two next lines are optional as they will to lead 
% basically the same binary image. 
f1 = imhmax(f, 30); 
f2 = imhmin(f1, 30); 
bin1 = ~im2bw(f2, graythresh(f2)); 

bin2 = bwmorph(imopen(bin1, strel('line', 15, 90)), 'dilate'); 
İlgili konular