7

らせん状のスプリングを検出し、コイルの巻き数をカウントする必要があります。

私は次のように試しました:

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; 
}

入力画像 出力画像

私は春を手に入れる方法はいくらかありますが、カウントを得る方法はあります。アルゴリズムを探しています。私は現在、速度の最適化を探していません。

これは、指を数えるのと似ています。スプリング スパイラルはコンターを使用するために非常に細いです。他に何ができるか。http://www.luna-arts.de/others/misc/HandsNew.zip

4

1 に答える 1

3

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

これは、h-dome変換後の入力画像とバイナリ画像です。

ここに画像の説明を入力してください ここに画像の説明を入力してください

ここで、「スパイラルターン」の数を数えるために、非常に簡単なことを行いました。スパイラルを分割して、連結成分として数えることができます。それらを分割するために、私は垂直線で単一の形態学的開口部を作成し、続いて基本的な正方形による単一の拡張を行いました。これにより、次の画像が生成されます。

ここに画像の説明を入力してください

コンポーネントを数えると15になります。13個のコンポーネントが近すぎないため、このアプローチではすべて正しくカウントされます。左右のグループは1つとして数えられました。

これらの手順を実行するために使用される完全な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');
于 2013-01-02T13:48:16.847 に答える