2016-05-23 5 views
6

Ich habe ein Bild von einem Kreis, ich möchte den Kreis finden, aber nicht Kreise verwenden.Kreise erkennen ohne Hough Circles

Ich fand einen Weg, verbunden here.

Aber ich kann die Übergangskoordinaten nicht von weiß zu schwarz finden, da ich die x- und y-Koordinaten im Kreis nicht kenne. Welche anderen Methoden gibt es oder wie kann ich diesen Ansatz zum Laufen bringen?

Das ist mein Testbild:

enter image description here

Antwort

3

Ein möglicher Ansatz ist es, zunächst threshold das Bild von einigen der Lärm um den Kreis zu befreien. Dann können Sie den Rand des Kreises mit der Kantenerkennung Canny extrahieren. Schließlich, findNonZero, um eine Liste der Pixel-Koordinaten zu erhalten.


Ich habe zuerst einen schnellen Prototyp mit Python:

import cv2 
import numpy as np 

img = cv2.imread('circle.png', 0) 
mask = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)[1] 
edges = cv2.Canny(mask, 20, 100) 
points = np.array([p[0] for p in cv2.findNonZero(edges)]) 

Und portiert es dann auf C++, einige zusätzliche Code hinzufügen alle Zwischenbilder zu speichern und die gefundenen Pixel zu zeichnen.

#include <opencv2/opencv.hpp> 

int main() 
{ 
    cv::Mat img(cv::imread("circle.png", 0)); 

    cv::Mat mask; 
    cv::threshold(img, mask, 127, 255, cv::THRESH_BINARY); 

    cv::imwrite("circle_1.png", mask); 

    cv::Mat edges; 
    cv::Canny(mask, edges, 20, 100); 

    cv::imwrite("circle_2.png", edges); 

    std::vector<cv::Point2i> points; 
    cv::findNonZero(edges, points); 

    cv::Mat output(cv::Mat::zeros(edges.size(), CV_8UC3)); 
    for (auto const& p : points) { 
     output.at<cv::Vec3b>(p) = cv::Vec3b(127, 255, 127); 
    } 
    cv::imwrite("circle_3.png", output); 
} 

Ausgabe von threshold:

Ausgabe von Canny:

Re-geplotteten Punkte:

012.351.

+3

Wenn Sie die Kreisparameter benötigen, können Sie 'minEnclosingCircle' verwenden – Miki

+0

Vielen Dank :) –

4

Ein weiterer Ansatz (das für mehr als nur Kreise nützlich ist) wäre es, die image contours zu finden und image moment analysis auf dem Kreis zu tun, es ist Mitte der Masse zu finden:

enter image description here

enter image description here

Ich empfehle, sie zu lernen, wenn Sie mit der Bildverarbeitung weitermachen werden. Sie sind ziemlich hilfreiche Ansätze, die Bilder in nützlichere Strukturen verwandeln.

+0

Vielen Dank @Lamar Latrell –

+0

Lamar! Ihr Wissen ist hervorragend! Kannst du bitte msg mich an: [email protected]? Ich bin ein Informatikstudent und ich könnte wirklich eine schnelle Hilfe gebrauchen! Ich danke dir sehr! –

+0

@RoiMulia, ich schlage vor, Sie verwenden StackOverflow für eine schnellere Antwort :) –