AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Bilderkennung

Offene Frage von "bernhard_LA"
Ein Thema von zobien123 · begonnen am 3. Apr 2018 · letzter Beitrag vom 20. Apr 2018
Antwort Antwort
Seite 1 von 2  1 2   
zobien123

Registriert seit: 3. Mär 2017
Ort: Öhringen
94 Beiträge
 
Delphi 10.3 Rio
 
#1

Bilderkennung

  Alt 3. Apr 2018, 13:28
Hallo Zusammen,

ich versuche mich gerade an der Bilderkennung. Das Ziel ist es, Kreise in einem Bild zu zählen. Dabei muss man noch von anderen Formen unterscheiden, welche im Bild sind (siehe Bsp Bild).

Jedoch hakt es bereits wie ich in einem Bild überhaupt mal einen Kreis erkenne. Ich habe leider im Internet keinen anstoß gefunden, welcher mich weiter bringt oder wo ich mich einlesen kann.


Schonmal vor ab, vielen Dank für jede Hilfe!

Edit: Das ist eine Übungsaufgabe aus dem Internet. https://0xf.at/play/35?pw= Wer es selbst mal versuchen möchte
Angehängte Grafiken
Dateityp: png 106f9b9c9f021a0769221441d4486047.png (1,7 KB, 59x aufgerufen)
Jörn
Linux wird nie das meistinstallierte Betriebssystem sein, wenn man bedenkt, wie oft man Windows neu installieren muss!

Geändert von zobien123 ( 3. Apr 2018 um 13:39 Uhr)
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.108 Beiträge
 
Delphi 2009 Professional
 
#2

AW: Bilderkennung

  Alt 3. Apr 2018, 13:40
Eigentlich nicht schwer, da kann man von der Zeilenzahl einstellig bleiben.
Code:
FUNKTION Kreiserkennung(VARIABLE Ergebnis: Integer);
  GEHE Bild VON oben NACH unten DURCH
    GEHE Bild VON links NACH rechts DURCH
      WENN Farbe NICHT weiß DANN
        WENN Farbe ein Pixel links unten NICHT weiß DANN // ggf. Abfrage für ganz links bzw. oben
          ERHÖHE Ergebnis;
        FÜLLE BEREICH an aktueller Position MIT weiß;
Delphi-Referenz durchsuchenVCL.Graphics.TCanvas
Code:
Irgendwas := 0;
Kreiserkennung(Irgendwas);
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.316 Beiträge
 
Delphi 12 Athens
 
#3

AW: Bilderkennung

  Alt 3. Apr 2018, 13:49
@Redeemer: Damit zählst du auch die Rechtecke, obwohl er nur die Kreise haben will.
* Außenkannte des gefundenen Bereichs suchen und schauen welche Form er hat

Da fehlt dann noch die Bei Google suchenDelphi Mustererkennung.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.108 Beiträge
 
Delphi 2009 Professional
 
#4

AW: Bilderkennung

  Alt 3. Apr 2018, 21:00
@Redeemer: Damit zählst du auch die Rechtecke, obwohl er nur die Kreise haben will.
Nö, tue ich nicht. Da steht doch, dass ich unten links unter dem aktuellen Pixel gucke, ob es weiß ist. Ist es da weiß, handelt es sich um ein Rechteck.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Bilderkennung

  Alt 3. Apr 2018, 23:38
Wenn es von dem Ablauf her Erlaubt wäre eine "Hintergrund" Farbe zu bestimmen um die Objekte rauszufiltern (oder basierend darauf ein Raster erstellen?) würde das Vorhaben die übriggebliebenen Objekte einer Form zuzuorden weitaus einfacher machen.
Vielleicht könntest Du auch diese Komponente umbiegen das Sie nach Kreisen und Rechtecken sucht?
Gruß vom KodeZwerg

Geändert von KodeZwerg ( 3. Apr 2018 um 23:47 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.367 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Bilderkennung

  Alt 4. Apr 2018, 09:12
Mal mein Brainstorming-Senf dazu, weil mir gerade danach war:

Voraussetzung:
1. Alle grafischen Objekte sind komplett freigestellt. D.h.: keine Berührungen oder Überschneidungen der Objekte.
2. Es soll eine Positiv-Erkennung geben. Also nicht prüfen, ob ein Objekt kein Kreis ist. Es könnte ja sein, dass später noch andere Objekte dazu kommen (Dreiecke, Polyeder, etc.)

Das Problem würde ich in 2 Schritten angehen.
1. Alle Objekte (farbige, zusammenhängende Bereiche) ermitteln
2. Die Objekte prüfen

zu 1:
Die Grafik nach Pixeln untersuchen, die nicht mit der Hintergrundfarbe übereinstimmen. Zusammenhängende Bereiche bestimmen und diese in einer Objekt-Liste speichern.

zu 2:
Vorüberlegung:
Was sind Kreise? Es sind Objekte, die durch ihren Radius/Durchmesser bestimmt sind. Also genügt es, diesen zu bestimmen. Für die weiteren Prüfungen wird der Durchmesser verwendet. Der Radius (also Durchmesser durch 2) könnte in weiteren Prüfungen Rundungsfehler verursachen. Da es potentiell noch mehr Rundungsprobleme geben kann, sollten diese sich nicht akkumulieren.
Bei der Prüfung der Objekt kann man einfach den obersten Punkt bestimmen. Dazu wird der tiefste senkrecht darunter liegende bestimmt. Die Länge ergibt den Durchmesser, falls es ein Kreis ist.
Erste Prüfung (kann auch entfallen):
Analog zum senkrechten Durchmesser kann der horizontale Durchmesser bestimmt werden. Diese müssen gleich sein. Vorsicht: Auch bei einem Quadrat ist das so. Bei einer Ellipse allerdings nicht, es sei denn es ist eine gedrehte Ellipse. Zumindest dient es als erste einfache Prüfung. Den Sonderfall, dass die Grafik auf einem 4:3-Monitor erstellt wurde und jetzt auf einen 16:10-Monitor dargestellt wird (Verzerrung) ignoriere ich mal.
Zweite Prüfung (nur, falls erste Prüfung erfolgreich):
Jetzt muss der Mittelpunkt bestimmt werden. Dies klingt erstmal einfach, ist aber es nicht. Bei sehr großen Kreisen hat man auch an den äußersten Punkten mehrere Pixel auf der selben Linie liegen. Also muss man das zusätzlich prüfen und dort die Mitte finden. Bei gerader Anzahl von Pixeln sind jetzt schon Probleme abzusehen, da bei allen weiteren Prüfungen geringfügige Abweichungen/Rundungsfehler berücksichtigt werden müssen.
Es steht jetzt alles zur Verfügung, um einen Kreis zu definieren (Mittelpunkt und Durchmesser). Auf dieser Basis wird nun ein Kreis "erzeugt", der im Idealfall deckungsgleich mit dem Prüfobjekt ist. Es sollte genügen, den Kreisrand zu prüfen.
Allerdings darf man die Rundungsprobleme nicht außer acht lassen und muss entsprechende Toleranzen einplanen.

Besondere Probleme:
- Rundungsfehler
- besonders große Kreise (wie weiter oben schon angedeutet)
- besonders kleine Kreise: Ist ein einzelnes Pixel eine Kreis oder ein Quadrat?
Peter
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: Bilderkennung

  Alt 4. Apr 2018, 09:07
@Redeemer: Damit zählst du auch die Rechtecke, obwohl er nur die Kreise haben will.
Nö, tue ich nicht. Da steht doch, dass ich unten links unter dem aktuellen Pixel gucke, ob es weiß ist. Ist es da weiß, handelt es sich um ein Rechteck.
Ich meine in dem Vorschaubild da sollte das sogar funktionieren aber falls andere Bilder da einen Hauch anders/komplexer sind dann klappt das nicht mehr.
Delphi-Quellcode:
// Wie viele Kreise sind (laut deinem Algorithmus) in diesem Bild?
# # # # # # #
 # # # # # # #
# # # # # # #
Antwort: Zu viele
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.108 Beiträge
 
Delphi 2009 Professional
 
#8

AW: Bilderkennung

  Alt 4. Apr 2018, 11:45
@Redeemer: Damit zählst du auch die Rechtecke, obwohl er nur die Kreise haben will.
Nö, tue ich nicht. Da steht doch, dass ich unten links unter dem aktuellen Pixel gucke, ob es weiß ist. Ist es da weiß, handelt es sich um ein Rechteck.
Ich meine in dem Vorschaubild da sollte das sogar funktionieren aber falls andere Bilder da einen Hauch anders/komplexer sind dann klappt das nicht mehr.
Delphi-Quellcode:
// Wie viele Kreise sind (laut deinem Algorithmus) in diesem Bild?
# # # # # # #
 # # # # # # #
# # # # # # #
Antwort: Zu viele
Die Frage ist für 1x1 und 2x2 Pixel nicht lösbar. Wenn die Anforderung des TE ist, die verlinkte Frage zu lösen, dann ist mein Algorithmus dazu in der Lage. Das Bild enthält nämlich nur mindestens 7x7 große Objekte. Mein Algorithmus ist zudem, wie ich auch ausdrücklich geschrieben habe, nicht in der Lage, Objekte zu unterscheiden, die ganz links (im Original hatte ich noch "oben" geschrieben, aber das stimmt nicht) am Bildrand sind, was bei der verlinkten Frage nicht auftritt.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Headbucket

Registriert seit: 12. Dez 2013
Ort: Dresden
172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

AW: Bilderkennung

  Alt 3. Apr 2018, 13:59
Ein kurzer vllt etwas naiver Denkanstoß, wie ich an die Sache rangehen würde:

Ich würde alle Pixel von Links oben der Reihe nach durchgehen.
Wenn ich farbiges Pixel finde, dann würde ich zunächst die Höhe des Objektes herausfinden, indem ich Pixel nach unten gehe, bis kein farbiges Pixel mehr auftaucht. Dann würde nach folgendem "Konstrukt" suchen:


Reihe X: Anzahl der farbigen Pixel in aktueller Reihe
Reihe X+1: Anzahl der farbigen Pixel in vorheriger Reihe + Bestimmten Faktor
Reihe X+2: Anzahl der farbigen Pixel in vorheriger Reihe + Bestimmten Faktor
...
Reihe X+y: Maximale Anzahl farbiger Pixel
...
Reihe X+n-2: Anzahl der farbigen Pixel in dritter Reihe
Reihe X+n-1: Anzahl der farbigen Pixel in zweiter Reihe
Reihe X+n: Anzahl der farbigen Pixel in erster Reihe


Da man einen Kreis leicht unterschiedlich zeichen kann, sollte die Auswertung der Pixelbreite etwas flexibel bleiben. Gerade flexibel genug, um einen Kreis von einer Ellipse zu unterschieden

Wie gesagt - nur mein erster Gedanke. Vllt bringt dich das auf neue Gedanken.

Grüße
Headbucket
  Mit Zitat antworten Zitat
hanvas

Registriert seit: 28. Okt 2010
171 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Bilderkennung

  Alt 3. Apr 2018, 15:08
Hallo Zusammen,
Jedoch hakt es bereits wie ich in einem Bild überhaupt mal einen Kreis erkenne. Ich habe leider im Internet keinen anstoß gefunden, welcher mich weiter bringt oder wo ich mich einlesen kann.
Kreise mit unterschiedlichen Radien lassen sich am besten mit Hilfe der sog. Hough-Transform(ation) erkennen. Einfach mal "Hough Transform Circle" mit oder ohne Delphi in eine Suchmaschine Deiner Wahl eingeben.

cu Ha-Joe
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz