7 Stimmen

Wie man die Windungen einer Spirale erkennt und zählt

Ich muss eine spiralförmige Feder erkennen und ihre Windungen zählen.

Ich habe Folgendes versucht:

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

Ich bin irgendwie in der Lage, die Feder zu bekommen, aber wie bekomme ich die Zähler. Ich bin auf der Suche nach Algorithmen. Ich bin derzeit nicht auf der Suche nach einer Geschwindigkeitsoptimierung.

Das ist ähnlich wie das Zählen von Fingern. Die Federspirale ist sehr dünn, um die Kontur zu erhalten. Was sonst noch getan werden kann. http://www.luna-arts.de/others/misc/HandsNew.zip

3voto

mmgp Punkte 18323

Sie haben dort eine gute endgültige Binarisierung, aber es sieht so aus, als wäre sie zu sehr auf diesen einen Fall beschränkt. Ich würde eine relativ einfache, aber wahrscheinlich robustere Vorverarbeitung durchführen, um eine relativ gute Binarisierung zu ermöglichen. Aus der mathematischen Morphologie gibt es eine Transformation namens h-dome, die dazu dient, irrelevante Minima/Maxima zu entfernen, indem Minima/Maxima der Höhe < h . Dieser Vorgang ist in Ihrer Bildverarbeitungsbibliothek vielleicht nicht ohne weiteres verfügbar, aber es ist nicht schwer, ihn zu implementieren. Zur Binarisierung dieses vorverarbeiteten Bildes habe ich mich für die Methode von Otsu entschieden, da sie automatisch und statistisch optimal ist.

Hier sehen Sie das Eingabebild nach der h-dome-Transformation und das Binärbild:

enter image description here enter image description here

Um nun die Anzahl der "Spiralwindungen" zu zählen, habe ich etwas sehr Einfaches gemacht: Ich habe die Spiralen geteilt, damit ich sie als zusammenhängende Komponenten zählen kann. Um sie aufzuteilen, habe ich eine einzige morphologische Öffnung mit einer vertikalen Linie vorgenommen, gefolgt von einer einfachen Dilatation durch ein elementares Quadrat. Dies ergibt das folgende Bild:

enter image description here

Zählt man die Komponenten, erhält man 15. Da Sie 13 davon haben, die nicht zu nahe beieinander liegen, wurden sie bei diesem Ansatz alle richtig gezählt. Die Gruppen links und rechts wurden als eine einzige gezählt.

Der vollständige Matlab-Code, der zur Durchführung dieser Schritte verwendet wurde:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X