2012-11-26 15 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

最終的な2値化がありますが、この単一のケースにはあまりにも制限されているようです。私は比較的簡単な、しかしおそらくより堅牢な前処理を行い、比較的良い二値化を可能にします。数学的形態学から、高さの最小値/最大値を抑制することによって無関係な最小値/最大値を除去するために使用される、hドームと呼ばれる変換がある。< h。この操作は、画像処理ライブラリですぐには利用できないかもしれませんが、実装するのは難しくありません。この前処理された画像を二値化するためには、自動で統計的に最適なので、大津の方法を選択しました。私は非常に単純な何かをした

enter image description hereenter image description here

が、数カウントする「スパイラルを回す」:私は分割ここ

がh-ドーム変換後の入力画像、およびバイナリイメージですスパイラルなので、接続されたコンポーネントとして数えることができます。それらを分割するために、私は垂直線で単一の形態学的開口部を行い、続いて基本正方形による単一の拡張を行った。このアプローチは正しくそれらすべてを数え、あなたはあまりにも近くないそれらの13を持っているので、15を与える

enter image description here

コンポーネントを数える:これは次のような画像が生成されます。左右のグループは単一のものとして数えられました。

これらの手順を行うために使用される完全な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'); 
関連する問題