Digitale Bildverarbeitung

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von LaMiy.

    Digitale Bildverarbeitung

    Guten Tag!

    Ich stehe vor folgender Herausforderung:

    Ich möchte einen periodischen Strom von Bildern hinsichtlich bestimmter Kriterien auslesen und weiterverarbeiten. Und zwar enthält jedes Bild Bereiche, auf denen ein Text abgebildet ist.

    Ein Bild besteht ja aus nichts anderem als einer 2-dimensionalen Matrix aus Pixeln mit spezifischen RGB-Werten. Also sollte das Programm in der Lage sein diejenigen Bereiche zu identifizieren innerhalb derer Text vorhanden ist. In einem zweiten Schritt habe ich mir vorgestellt, das direkte Umfeld einer begrenzten Anzahl von Pixeln zu betrachten um darüber einen Rückschluss auf die Art des Zeichens (Buchstabe, Zahl oder Sonderzeichen) zu ermöglichen.

    Jetzt die Frage an euch: Klingt das plausibel? Ist das theoretisch technisch machbar?


    MfG
    hurricane

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    @Coldfire Jou.
    @hurricane Willkommen im Forum. :thumbup:
    Über welche Programmierkenntnisse verfügst Du?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    hurricane schrieb:

    meine Kenntnisse zu vertiefen!?
    Würde ich pauschal nicht meinen. Ist die Texterkennung ein tatsächliches Problem oder nur ein Übungsprojekt?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    hurricane schrieb:

    Herausforderung
    Neu erfinden solltest Du es nicht.
    Suche Dir eine DLL, die das kann und für die es eine vernünftige Beschreibung gibt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Du musst wissen, dass das sehr aufwändig ist so etwas selber zu machen.
    Möglich ist es aber alle Male.

    Im ersten Schritt solltest du dich darum kümmern die Pixel des Bildes zu bekommen.
    In C# kann man das über Pointer lösen.

    Ich habe dazu mal eine Extension geschrieben. Hier ein Ausschnitt davon.
    Spoiler anzeigen

    C#-Quellcode

    1. ​public static unsafe BitmapInformation LockBits(this Bitmap pBitmap)
    2. {
    3. var info = new BitmapInformation();
    4. int width = pBitmap.Width;
    5. int height = pBitmap.Height;
    6. ImageLockMode imageLockMode = ImageLockMode.UserInputBuffer;
    7. // Setting imageLockMode
    8. imageLockMode = imageLockMode | ImageLockMode.ReadOnly;
    9. imageLockMode = imageLockMode | ImageLockMode.WriteOnly;
    10. // Save the bouunds
    11. info.Bounds = new Rectangle(0, 0, width, height);
    12. // Zeiger mit width * height Pixeln anlegen (hier die -1 weglassen! Ist kein VB)
    13. uint[] someBuffer = new uint[width * height];
    14. // someBuffer anpinnen, buffer ist eine neue Variable, auf die du zugreifen kannst
    15. fixed (uint* buffer = someBuffer) //anpinnen
    16. {
    17. BitmapData temporaryData = new BitmapData();
    18. temporaryData.Width = width;
    19. temporaryData.Height = height;
    20. temporaryData.PixelFormat = PixelFormat.Format32bppArgb;
    21. temporaryData.Stride = width * 4;
    22. // Rohdaten-Zeiger auf die Adresse des Arrays legen, damit die Daten dorthin geladen werden
    23. temporaryData.Scan0 = (IntPtr)buffer;
    24. // Daten anfordern, data enthält im Anschluss die Bitmapdaten als Bits
    25. info.BitmapData = pBitmap.LockBits(info.Bounds, imageLockMode, PixelFormat.Format32bppArgb, temporaryData);
    26. info.Buffer = someBuffer;
    27. info.Bitmap = pBitmap;
    28. }
    29. //Zurückgeben
    30. return info;
    31. }


    Im nächsten Schritt musst du irgendwie die Konturen finden.
    Wenn du ein Bild mit vielen Farben hast musst du eine Segmentierung vornehmen. Dazu gibt es recht viele Algorithmen.

    Anschließend musst du schauen dass du die Dimensionen der Buchstaben bekommst.
    @~blaze~ Hatte da eine richtig gute Idee für einen Algorithmus.

    Wenn ich genauer ins Detail gehen soll, dann kann ich das gern' machen, musst du nur sagen, dann erkläre ich die weiteren Schritte.
    @hurricane
    Du meinst einen Abgleich mit Pixeln eines Buchstabens, die du schon kennst?
    Ja das geht. In dem Sinne bieten sich de.wikipedia.org/wiki/Neuronales_Netz (Neuronale Netzte) an.
    codeproject.com/Articles/11285/Neural-Network-OCR
    codeproject.com/Articles/3907/…r-Recognition-OCR-applica

    Bei dem Thema ist das hier ein richtig geiles Projekt.
    codeproject.com/Articles/19616…or-Image-Recognition-in-C



    Das beinhaltet sogar Drehung von Buchstaben etc.
    Geht aber auch in die höhere Mathematik ein. (Vektoren, komplexe Zahlen)
    Das Ergebnis ist aber der Wahnsinn. Extrem schnell und effektiv. (Besser als das vorherige)

    Da brauchst du aber auch Einiges an Geduld.
    Wenn du es anders machen will, aber trotzdem nicht alles selber kannst du dir mal OpenCV anschauen. Das beinhaltet sehr viele schnelle Methoden zur Bildsegmentierung und Analyse.

    Grüße

    hurricane schrieb:

    immer gleich sind?
    Das mag in 90% der Fälle gut gehen, sicher ist das jedenfalls nicht.
    Was machst Du, wenn dann genau so was geändert wird?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!