2012-11-26 47 views
6

我需要檢測螺旋形彈簧並計算其圈數。如何檢測和計算螺旋圈數

我已經試過如下:

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

我一些如何能夠得到春天,但如何獲得計數。我正在尋找算法。 我目前沒有在尋找速度優化。

這與計數手指相似。春季螺旋非常薄,以獲得使用輪廓。還有什麼可以做的。 http://www.luna-arts.de/others/misc/HandsNew.zip

+0

任何人,我需要一個正確的方向! – Rick2047

+0

我用我自己的算法試了一下。但薄的物體很難被發現(目前我不知道)。 – Rick2047

回答

3

您在那裏有一個很好的最終二值化,但它似乎對這種情況太侷限了。我會做一個相對簡單的,但可能更強大的預處理,以允許相對較好的二值化。從數學形態學角度來說,有一個稱爲h-dome的變換,它用於通過抑制高度最小值/最大值來消除無關的最小值/最大值。這個操作可能不容易在你的圖像處理庫中使用,但實現它並不難。爲了對這個預處理圖像進行二值化處理,我選擇了Otsu的方法,因爲它是自動和統計最優的。

這是H-圓頂變換後的輸入圖像,和二進制映像:

enter image description hereenter image description here

現在,計算的數量「螺旋圈」我做了一件很簡單:我分裂因此我可以將它們視爲連接的組件。爲了將它們分開,我用一條垂直線做了一個單一形態的開口,然後用一個基本正方形進行單一的擴張。這將產生以下圖片:

enter image description here

計數的組件提供了15既然你有其中13個是不是太緊密,這種方法計算它們都正確。左側和右側的組被統計爲單個組。

用來做這些步驟的完整Matlab代碼:

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');