2016-08-15 30 views
-2

Ich bin Student. Ich bin neu in der Bildverarbeitung und Python.Objekterkennung und -segmentierung Mit Python

Ich habe viele Bilder von Pflanzen Proben und ihre Beschreibung (so genannte Etiketten, die auf der Probe stecken) wie in der folgenden Abbildung gezeigt. Ich muss nur diese Labels automatisch aus dem Sample segmentieren.

Ich versuchte Schwellenwert basierend auf Farbe, aber es ist fehlgeschlagen. Könnten Sie mir bitte ein Beispiel für diese Aufgabe vorschlagen? Ich brauche einige Ideen oder Codes, um die Segmentierung vollautomatisch zu machen.

Bitte helfen Sie mir, wenn Sie Experten in Bildverarbeitung und Python sind, brauche ich Ihre Hilfe, um diese Aufgabe abzuschließen.

Das Rechteck wird oben links erkannt, aber es sollte rechts unten sein. Könnten Sie mir bitte sagen, wo mein Fehler ist und wie ich ihn korrigieren kann? Ich habe auch den folgenden Code gegeben.

Antwort

0

Sie können eine Vorlage verwenden, die mit einem großen weißen Rechteck übereinstimmt, um den Bereich zu identifizieren, in dem Informationen gespeichert sind.

http://docs.opencv.org/3.1.0/d4/dc6/tutorial_py_template_matching.html#gsc.tab=0

Wenn es gemacht wird, können Sie Zeichen in diesem Bereich erkennen ... Sie eine kleine Unter-Bild speichern und mit einem Tool wie pytesseract können Sie Zeichen lesen.

https://pypi.python.org/pypi/pytesseract

Sie haben andere OCR hier mit einigen Beispielen: https://saxenarajat99.wordpress.com/2014/10/04/optical-character-recognition-in-python/

Viel Glück!

+0

Hallo @FrECM, ich habe Änderungen auf Template-Matching. Aber ich weiß nicht, wo ich falsch gelaufen bin. – 034568

0

Warum Farbschwelle verwenden? Ich habe dieses mit ImageJ versucht und nette Ergebnisse bekommen. Ich habe gerade das Bild zu 8bit und binarise mit einer festen Schwelle konvertiert (166 in diesem Fall). Sie können den besten Schwellenwert aus dem Bild histogram auswählen. Dann müssen Sie nur Ihre weiße Rechteckregion finden und die Zeichen wie FrsECM vorgeschlagen lesen.

Hier ist ein Beispiel in C++:

#include "opencv2/imgproc.hpp" 
#include "opencv2/highgui.hpp" 
#include <stdlib.h> 
#include <stdio.h> 

using namespace cv; 

/// Global variables 
int threshold_nvalue = 166; 
const int thresh_increment = 2; 
int threshold_type = THRESH_BINARY;//1 
int const max_value = 255; 
int const morph_size = 3; 
int const min_blob_size = 1000; 
Mat src, src_resized, src_gray, src_thresh, src_morph; 

/** 
* @function main 
*/ 
int main(int argc, char** argv) 
{ 
    /// Load an image 
    src = imread("C:\\Users\\phili\\Pictures\\blatt.jpg", 1); 
    //Resize for displaying it properly 
    resize(src, src_resized, Size(600, 968)); 
    /// Convert the image to Gray 
    cvtColor(src_resized, src_gray, COLOR_RGB2GRAY);  
    /// Region of interest 
    Rect label_rect; 
    //Binarization sing fixed threshold 
    threshold(src_gray,src_thresh, thres, max_value, threshold_type); 
    //Erase small object using morphologie 
    Mat element = getStructuringElement(0, Size(2 * morph_size + 1, 2 * morph_size + 1), Point(morph_size, morph_size)); 
    morphologyEx(src_thresh, src_morph, MORPH_CLOSE, element); 

    //find white objects and their contours 
    std::vector<std::vector<Point> > contours; 
    std::vector<Vec4i> hierarchy; 
    findContours(src_morph, contours, CV_RETR_TREE, CV_CHAIN_APPROX_NONE, Point(0, 0)); 
    for (std::vector<std::vector<Point> >::iterator it = contours.begin(); it != contours.end(); ++it) 
    { 

     //just big blobs 
     if (it->size()>min_blob_size) 
     { 
      //approx contour and check for rectangle 
      std::vector<Point> approx; 
      approxPolyDP(*it, approx, 0.01*arcLength(*it, true), true); 
      if (approx.size() == 4) 
      { 
       //just for visualization 
       drawContours(src_resized, approx, 0, Scalar(0, 255, 255),-1); 
       //bounding rect for ROI 
       label_rect = boundingRect(approx); 
       //exit loop    
       break; 
      } 
     } 


    } 
    //Region of interest 
    Mat label_roi = src_resized(label_rect); 

    //OCR comes here... 
} 
+0

[Hier] (http://stackoverflow.com/questions/11424002/how-to-detect-simple-geometric-shapes-using-opencv) können Sie lesen, wie einfache Formen wie ein Rechteck zu erkennen – PSchn

+0

Danke für die Informationen @ PSchn, ich habe das Ergebnis basierend auf dem Vorlagenvergleich aktualisiert, aber ich weiß nicht, wo ich falsch gelaufen bin. – 034568

+0

Ich denke, du hast zwei Ansätze gemischt. Machen Sie eine Binarisierung und eine Konturfindung, um Ihr Rechteck zu erkennen, oder die Vorlagen-Matching-Routine nicht mischen. Ich schlage vor, die Binarisierung durchzuführen, Ihre Konturen zu finden, sie zu säubern, ungefähr ein Polygon, .. und dort gehen Sie. Ich benutze Template Matching, dann vergiss die Binarisierung. Hat die Vorlage die gleiche Größe wie Ihr Etikett? – PSchn