"Gegenstände" im bild zählen

  • hi,
    ich möchte in einem Bild die "Gegenstände" zählen.
    In meinem Fall wären das z.B. Körner.

    z.B. http://www.mebak.org/img/kornanomalien/intakte-koerner.jpg oder http://www.mebak.org/img/kornanomal…ene-koerner.jpg


    Mit PixelSearch werde ich da wohl nicht weit kommen.


    Hat jemand eine Idee wie man da ran gehen könnte?


    Eventuell hat ja jemand schonmal etwas ähnliches probiert.


    Danke schonmal und schöne Ostern :)

    //edit: Mir ist gerade noch eingefallen, dass man die Körner ja auch hintereinander anordnen könnte (z.B. in einer Rinne)...dann sollte das zählen einfacher sein oder?

  • Da gibt es verschiedene Herangehensweisen.

    Du könntest z.B. die Anzahl an dunkler Pixel gegen die Anzahl heller Pixel vergleichen oder die Anzahl der dunklen Pixel durch die Anzahl der Pixel eines Korns teilen, so kriegst du einen Näherungswert.

    Du könntest aber auch jedes Korn einzeln mit einer Farbe ausfüllen und die Nachbarpixel vergleichen ob sie eine ähnliche Farbe haben (noch im Korn).
    Sollte eine scharfe Kante kommen oder ein Schatten weißt du das dort eine Kante ist und nicht weitergehen solltest.

  • //edit: Mir ist gerade noch eingefallen, dass man die Körner ja auch hintereinander anordnen könnte (z.B. in einer Rinne)...dann sollte das zählen einfacher sein oder?

    ja dann könnte es gehen idealerweise sollten die Körner nicht ohne Zwischenabstand liegen. Wenn intakte und aufgesprungene zusammen auf einem Bild sind wird es aber auch dann fast unmöglich.

  • Hi,
    ich würde zunächst die Bilder per Sobel-Kantenfilter bearbeiten, Damit erhält man die Umrisse der Körner und ggf die "Trennlinie", welche beim geschlossenen Korn eine Linie, und beim geöffneten Korn eine größere Fläche ist.
    Weiterhin würde ich die Farben reduzieren/verstärken, um ggf Farbunterschiede von geöffneten/geschlossenen Körnern zu finden. In Verbindung mit der Kantendetektion sind imho schon recht gute Ergebnisse zu erzielen, das "Zählen" reduziert sich dann auf das zusammenzählen von Farbflächen.
    Von welchen Toleranzen/Toleranzfeldern ist beim Zählen auszugehen?

  • das mit dem filtern sollte ja mit gimp machbar sein....

    wenn bei einer fläche von z.B. einem A4 Blatt voller Körner (überlappungsfrei) ca. 10 falsch gezählt werden ist das ok :P

  • Ich würde von diesem Vorhaben absehen.

    Für Erkennungssoftware sind immer mehrere Faktoren ausschlaggebend. Man benötigt für eine gute Rate möglichst viele verschiedene eigenständige Erkennungsmethoden die jeweils die subjektive Wahrscheinlichkeit für einen Treffer zurückgeben. Diese werden dann gewichtet zusammengerechnet um so eine Gesamtwahrscheinlichkeit (für ein einziges Korn) zu finden. Mir fällt aber keine "einfache" Methode ein (also keine Methode die man "mal eben" hinschreibt).

    Meine Idee wäre:
    Das "Durchschnittskorn" von Hand erzeugen. Also z.B. 50 geschlossene/offene Körner zu einem Bild überlagern. Dieses Bild wird vom Programm automatisch gedreht und Skaliert und mit den Körnern auf dem Foto vergleichen. Da man 2 Durchschnittsbilder hat, kann man für beide eine Prozentuale übereinstimmung angeben (obacht, das geht jeweils von 0 bis 100%, also muss man beide Werte durch 2 Teilen. Dann bekommt man sowas in der Art: Offen: 45%, Geschlossen: 22%, Sonstiges = 100% - (Offen + Geschlossen) = 33%. Daraus kann man mit einer gewissen Unsicherheit darauf schließen, dass das untersuchte Korn offen ist. (Oder man normiert auf andere Weise. Ausgangswert war Offen = 90%, Geschlossen = 44%. -> Offen mit 1-90%/(90%+44%)=33% Irrtumswahrscheinlichkeit. Bin mir aber nicht sicher wie man Wahrscheinlichkeiten in diesem Fall auslegen muss, da muss ein Fachmann ran^^)

    Das zu programmieren ist aber nicht so leicht wie es auf den ersten Blick klingt...

  • wenn bei einer fläche von z.B. einem A4 Blatt voller Körner (überlappungsfrei) ca. 10 falsch gezählt werden ist das ok

    Na also, da hätte wir ja schon mal wenigstens eine Hausnummer, wo es hingehen soll....
    Poste mal einige (ca. 10) Bilder in möglichst guter Auflösung mit der "von Hand" ausgezählten Anzahl Körner. Dann haben wir Vorlagen, mit denen man Arbeiten kann!

  • hi,
    sorry das ich nicht mehr geantwortet hatte...ist bei mir untergegangen :)

    ich habe die bilder für euch (extern wegen der dateigröße) hochgeladen


    https://mega.nz/#F!vJ42UTrK!utxMs3E8VgBtojC3Olwedw

    bin gerade am probieren die bilder mit gimp so zu bearbeiten, dass es eventuell einfacher zum erkennen wird...

    diese sind ungezählt...allerdings könnte man ja einen (roten) punkt auf erkannte körner setzen...dann kann man mit mit dem auge grob sehen wieviele falsch sind...

    danke schonmal :)

  • bin gerade am probieren die bilder mit gimp so zu bearbeiten, dass es eventuell einfacher zum erkennen wird...

    Dazu gibt es verschiedene Filter die du anwenden kannst. Die sollte es auch bereits schon als UDF irgendwo im engl. Forum geben.
    Such dir die aus die das erkennen vereinfachen und dann leg sie mit einem Script drüber wenn du es später mit einem Script erkennst.

  • Leute die Bestückungsautomaten bauen (diese Dinger, die SMD-Bauteile auf 'ne Platine packen), beschäftigen sich mit solchen Problemstellungen.
    Ich kenne da jemanden, der sich erst kürzlich intensiv damit befasst hat, wilde Schüttungen von Bauteilen per Bilderkennung zu sortieren. Der Mann ist aber professionell unterwegs und programmiert außerdem in "C".

    Aber vielleicht hilft ja bereits das Stichwort "Bestückungsautomat" bei der Suche nach geeingeten Routinen.

    Ich code, also bin ich!

  • Ich habe mir die Bilder mal genauer angeschaut.
    Liegen die Körner auf einem Lichttisch? Auf einem der Bilder sind weiße Säume um die Körner erkennbar...
    Ansonsten schau mal, ob du bei der Kamera sämtliche "Verschlimmbesserungsfilter" abschalten kannst, Ausleuchtung der Bilder insgesamt ist schon grenzwertig, so wird das nix!
    Bevor du die Bilder in der Kamera als JPG speicherst, schau mal, ob es andere Dateiformate gibt, in der Vergrößerung wird der JPG-Pixelbrei echt störend. Zur Not geht RAW.
    LICHT auf die Körner! Viel hilft viel!

    Nach der Umwandlung in SW konnte man teilweise die Körner schon gut unterscheiden, allerdings wird es für das ganze Bild nix mit der Zählerei, wenn durch die Filter die unterschiedliche Ausleuchtung mitverstärkt und somit ca. die Hälfte des Bildes unbrauchbar wird!

    Um es grob zu beschreiben, ich wandle die Bilder in SW, lasse einige Filter drüberlaufen, so dass im Endeffekt nur noch "schwarze Flecken" übrig bleiben. Diese Flecken kann man zählen, indem man einfach vom ersten gefundenen schwarzen Pixel alle "Nachbarn" (rekursiv) auslöscht, also den "Fleck" komplett aus dem Bild eliminiert. Dann wird wieder der erste schwarze Pixel gesucht, Fleck gelöscht uswusf. Die Anzahl der "Flecken" sind letztendlich die Anzahl der Körner....

    Wie man allerdings die "aufgeplatzten" Körner findet, ist mir noch nicht klar, ggf über eine bestimmte Farbe.

    Elementar ist jedenfalls die Qualität der Bilder!

    Eine Idee hätte ich noch bzgl der Separierung der Körner auf dem Blatt. Es gibt doch Siebe, evtl. würde es helfen, die Körner auf ein entsprechendes Sieb oder ggf. auf eine Harfe auszuschütten und diese dann langsam hochzuheben, damit sich die Körner auf dem darunterliegenden Blatt Papier ausrichten . Was man mit einem Handgriff mechanisch verbessern kann, verbessert das nachträgliche "Bildbearbeitungsergebnis" extrem!

  • wow danke für die vielen Antworten!

    ich schaue mir das nochmal genau an....

    ich habe auch nochmal mit einem Bekannten gesprochen, er sagte mir das Stichwort: Canny-edge -> Threshold -> Blob detection
    habe ich mir auch mal z.B. bei youtube angeschaut, aber ich glaube das ist nur für grobere Sachen gut....und auch aus meiner Sicht nicht ganz einfach / zu starr....

    daher habe ich jetzt eine ganz andere Idee (unabhängig vom Korn):
    Körner kommen in eine Vorrichtung, wo immer nur ein Korn raus kommen kann (noch keine Idee wie)
    dieses Korn fällt dann auf eine Feinwaage.

    Feinwaagen gibt es schon für ca. 15€ und können im 10mg Bereich Unterschiede feststellen....
    Allerdings haben die keine Schnittstelle...daher würde ich den wert mittels cam und eventuell einem pi auswerten....oder halt windows mit autoit...
    Im einfachsten Falle schaue ich nur, ob sich das Display verändert...

    danach wird das Korn mit Druckluft von der Waage entfernt


    ich heiß hört sich ziemlich abenteuerlich an, könnte aber funktionieren oder?


    //edit: es gibt sogar Waagen mit Zählfunktion...ist halt die frage wie anfällig das in meinem Fall wäre....

  • Mal ne andere Idee. Färbe die Körner vorher mit schwarzer Lebensmittelfarbe. Dann haben geplatzte Körner auf jedenfall einen komplett andere Farbe als geschlossene.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • Oder auf 'ne Heizplatte schütten und mit 'ner Thermografiekamera arbeiten.
    Intakte Körner sollten sich in der Mitte langsamer erwärmen, als geplatze, weil sich die Wärme durch mehr Material hindurch wühlen muss.
    Demnach sollte in der Mitte geplatzer Körper relativ schnell ein Hotspot feststellbar sein, der intakten Körnern fehlt.

    Es wäre aber gut, mal mehr über das Projekt zu erfahren.
    Mir ist z. B. nicht klar, ob die Körner anschließend noch verwendet werden sollen - denn würde chips Vorschlag mit der Lebensmittelfarbe natürlich ausscheiden.

    Weiterhin ist mir unklar, um welche Mengen es geht. Wegen der Idee mit der Vereinzelung und der Feinwaage scheint es ja nur um geringe, stichprobenhafte Mengen zu gehen und nicht um derbe Massen, wie sie in einem Produktionsbetrieb anfallen.
    Es geht also anscheinend NICHT darum, ausnahmslos alle Körner zu untersuchen, bevor sie in eine Verpackung wandern?

    Zweite Idee:
    Bei relativ kleinen Stichproben, die anschließend getrost in die Tonne wandern können, wäre es denkbar die Körner auf ein vibrierendes Sieb zu schütten und von oben fluoreszierendes Pigment auf die Körner zu pudern.
    Wegen der Vibration fällt der meiste Puder oben von den Körnern ab und durch das Sieb. Aber in den Ritzen der geplatzen Körner sammelt sich besonders viel davon an.
    Dann mit UV-LEDs beleuchten.

    Dritte Idee:
    Druckluft durch ein enges Rohr blasen. Das Rohr hat oben eine Öffnung, durch die die Körner ins Rohr rieseln.
    Ich gehe davon aus, dass geplatze Körner ein anderes Flugverhalten haben, so dass sie sich automatisch von den intakten Körnern separieren.

    Vierte Idee:
    Die Körner eine Rille hinunter rutschen lassen. So, dass sie schön hintereinander kommen.
    Beleuchtung von der Seite (Die Rille könnte der Innenwinkel einer abgewinkelten Acrylglasplatte sein).
    Wegen der Beleuchtung von der Seite entsteht in geplatzen Körnern eine auswertbare Abschattung.

    Noch 'ne fünfte Idee:
    Man klebe einen geeigneten Teppich auf eine größere, schräge Fläche und lasse dort die Körner runter rutschen.

    Der Teppich soll so beschaffen sein, dass die intakten, äußerlich glatten Körner weitgehend ungehindert hinab rollen/gleiten, wohingegen die aufgeplatzten Körner in den Stoppeln hängen bleiben.

    Einfach mal mit 'ner Handvoll Körner in den Baumarkt latschen und dort verschiedene Teppiche direkt ausprobieren. Es muss vermutlich einer mit kurzen, offenendigen Stoppeln sein (wie 'ne Bürste).

    Vielleicht muss man noch etwas Vibration geeigneter Amplitude ins Spiel bringen, damit die glatten Körner wirklich hinab rutschen können, ohne das Brett gar zu steil stellen zu müssen. Denn bei zu steilen Brett würden sicherlich auch die geplatzten Körner zu leicht runter trudeln.
    Wenn alle Parameter stimmen, wären die Körner anschließend jedenfalls separiert und können bequem getrennt in der Menge erfasst werden, z. B. mit einer Zählwage.

    Btw. Waage: Ich habe nicht begriffen, warum in Posting 15 eine Feinwaage erwähnt wurde, zur Unterscheidung?
    Anscheinend wiegen die geplatzten Körner weniger. Warum ist das so?

    Gnaa, noch 'ne sechste Idee!
    Leider nur tauglich für Stichproben.

    Eventuell notwendige Vorbereitung:
    Mit einem Rakel etwas Vaseline dünn auf ein Bettlaken streichen. Dort die Körner drauf schütten und etwas verreiben, so dass sich die Außenseite mit Vaseline benetzt.
    Idee dabei: In die Öffnungen der glatten Körner kann die dünn auf das Tuch aufgetragene Vaseline nicht eindringen.

    Nun nehme man eine Platte aus diesem schaumstoffartigen Kunststoffzeug, mit dem manche Möbel, oder Fahrradsattel ausgestattet sind; das sich unter Druck einer Form temporär anpasst und bei Entlastung wieder die Ursprungsform annimmt (habe den Namen dieses Materials vergessen) und lege diese Platte oben druff, eventuell mit 'ner Glasplatte beschwert.
    Nach kurzer Zeit sollte das Zeug die Körner so halbwegs umhüllen und auch in die Öffnungen der geplatzen Körner eingedrungen sein.
    Nun die Platte abheben.

    Die glatten, zudem mit Vaseline umhüllten Körner, sollten fast unverzüglich wieder abfallen.
    Die geplatzen Körner hingegen, sollten wesentlich länger an der Platte haften bleiben.

    Eventuell muss nach jeder Anwendung die Spezialschaumstoff-Platte von der verbliebenen Vaseline gereinigt werden. Aber es sind diverse Abwandlungen dieses Prinzips denkbar und vielleicht geht es ja auch ohne Vaseline.

    Ist mir fast peinlich, aber ich habe eine siebte Idee:

    Davon ausgehend, dass die intakten Körner schwerer als Wasser sind:
    Die Körner in einer flachen Schale ausbreiten. Dann langsam Wasser einfüllen.
    Geplatzte Körner sollten nun wie kleine Schiffchen oben schwimmen.

    Falls das nicht ganz klappt:
    Schlagsahne über alle Körner und etwas durchmatschen. Die Sahne dringt in die offenen Körner ein und setzt sich dort fest. Nun schwimmen die geplatzten Körner ganz bestimmt und können leicht abgeschöpft werden.

    Die abschließende Quantifizierung muss dann (wie ursprüpnglich angedacht) per Kamera erfolgen, weil eine Zählwaage nun ausscheidet.

    Achte Idee (ööhh, hoffentlich nerve ich noch nicht):

    Man denke an eine Trillerpfeife: Kügelchen, Luftstrom, charakteristischer Sound.

    Leicht unregelmäßiges "Kügelchen" (intaktes Korn): Etwas unregelmäßigerer Sound, gegenüber einer echten Kugel, aber insgesamt doch relativ gleichmäßig "polternd".

    Sehr unregelmäßiges "Kügelchen" (geplatztes Korn): Extrem ungleichmäßiger, stellenweise immer wieder mal kurz stockender Sound.

    Auswertung per Mikrofon, bzw. an der "Pfreife" montierter Piezo-Sensor.
    Tiefpass (der nur das Poltern von wenigen Hz. durch lässt), Schmitt-Trigger, getorter Pulszähler.

    Nun bastele man sich eine Vorrichtung nach grob diesem Prinzip, wo die Körner im Idealfall vereinzelt hineinrutschen und nach einigem "Getriller" wieder heraus flutschen.


    Alternativ (fertigungstechnisch viel leichter zu machen):
    Die vereinzelten Körner einfach aus einiger Höhe auf 'ne Glasplatte plumpsen lassen, auf deren Unterseite ein Piezo montiert ist.
    Idee dabei: Intakte Körner purzeln ein gutes Stück länger herum, als geplatzte.

    Für das vorherige Vereinzeln der Körner habe ich eine gute Idee, die erkläre ich aber nur bei Bedarf.

    Ich code, also bin ich!

  • ihr habt ja Ideen :)
    darauf würde ich nie kommen...

    es geht allerdings nicht um kaputte körner ausfindig zu machen, sondern um das zählen der "Gegenstände"...in diesem fall verschiedene Körner....

    der Sinn der Sache ist, dann man dann ausrechnen kann wieviele Körner man für einen Hecktar benötigt (hochgerechnet von einem m2 bzw. von einem DinA4 Blatt)

    Ich würde eine waage benutzen, nicht zum wiegen, sondern um festzustellen ob etwas draufgefallen ist....sozusagen als counter

    Allerdings weiß ich noch nicht, wie die Vorrichtung funktionieren soll, dass immer nur ein Korn auf die Waage fällt....

  • Ah, die Körner müssen nicht unterschieden werden, sondern einfach nur gezählt; egal, ob geplatzt, oder nicht.
    Gut, das vereinfacht die Sache.

    Allerdings weiß ich noch nicht, wie die Vorrichtung funktionieren soll, dass immer nur ein Korn auf die Waage fällt....

    Das mit der Waage ist viel zu kompliziert und zu langsam.
    Mir fallen einige andere Wege ein, je nachdem, um welchen Durchsatz es geht. Erkläre ich auf Nachfrage gern.
    Aber mir dämmert gerade, dass das überhaupt alles Käse ist.
    Du willst von einem Quadratmeter hochrechnen. Warum willst Du dazu die Körner zählen?

    Breite die doch einfach nur einlagig auf einer Fläche von einem Quatratmeter aus und schütte sie anschließend in einen Messbecher.
    Dann hast Du das Volumen dieser Menge.
    Und wenn Du den Messbecher auf 'ne Waage stellst und das Tara abziehst, dann hast Du auch das Gewicht dieser Körnermenge.
    Das sind doch wohl beides die relevanten Parameter. Wozu also noch einzeln zählen?

    Ich code, also bin ich!

  • Mal eine Frage anbei: Wenn hier schon "Reallife Hacks" genutzt werden - Warum programmiert man das nicht?
    Ich bin mir sicher es gibt entsprechende Lektüre, um in geraumer Zeit etwas sinniges hin zu bekommen und ein passables Ergebnis zu haben.

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal