Hallo. Ich habe schon eine weile gegoogelt und bin aber bis jetzt nicht
wirklich weitergekommen. Ich möchte in einem digitalisierten Bild
(schwarz-weiß), anhand der Farbwerte, Kreise in dem Bild zählen. Die
Kreise sind dabei nicht regelmäßig, haben aber einen anderen Farbwert
gegenüber der Umgebung. Für ein paar Anregungen, Denkanstöße oder links
zu skripten wäre ich sehr dankbar.
Maik
poste doch mach ein Beispielbild. Wir haben damals an der UNI ein
Programm (in Matlab) schreiben müssen, was den Gesamtwert der Münzen
auf nem Foto ausgibt, villeicht lässt sich das ähnlich lösen.
Ich habe leider noch kein Beispielbild, aber die Kreise auf dem Bild
sind Zellen. Das ganze soll in einem biomedizinischen Institut
eingesetzt werden um den Wachstumsprozess der Zellen in einer Probe zu
registrieren, d.h. es sollen die Zellen auf dem Bild gezählt werden.
Aber das was du da in der Uni gemacht hast geht ja eigentlich genau in
die Richtung, jedenfalls von den notwendigen Überlegungen her denke
ich. Könntest du mir da eventuell ein paar Infos über Algorithmus oder
die Vorgehensweise geben? Da würde ich dann zumindest schon mal ein
Paar Anhaltspunkte haben mit denen ich dann weiter machen kann.
Vielen Dank!!
Also Du willst das in Matlab schreiben und zwar unter Zuhilfenahme der
Image Processing Toolbox. Dafür gibt es auch Demos unter
www.mathworks.com wie es geht. Wenn Du Glück hast gibt es sogar ein
fertiges Skript oder es gibt was auf www.matlabcentral.com
Alpha
hallo. nein ich werde es mit der VisualDSP++ software von Analog Devices
schreiben, aber mir gehts um allgemeine Herangehensweisen für das
Problem welches ja dann von Matlab auf die entsprechende
Programmiersprache umgesetzt werden kann. ich schau mir das mal in
Matlab an, dankeschön...obwohl natürlich Matlab auch eine Variante wäre
das zu machen. muß ich also mal schauen, danke für die Hilfe/Idee!
Denke ich auch, die Zellen werden wohl kaum so schnell wachsen, dass es
der Echtzeitfähigkeiten eines DSPs bedarf. Da ist es schon legitim, die
Algorithmen erst einmal für den PC zu entwickeln.
Betr. Münzerkennung
leider finde ich die M-files jetzt nicht mehr, aber das Verfahren
basierte auf jeden Fall auf Kantenerkennung mittels Hochpassfilter.
Anschließend wurden die resultierenden Ringe noch schwarz gefüllt und
mit einer Funktion (hab den Namen vergessen) aus der Image Prozessing
Toolbox gezählt und der Flächeninhalt bestimmt.
Ich glaube aber nicht, dass sich dieses Verfahren auf dein Problem
anwenden lässt, da es auf harte Übergänge der zu erkennenden Objekte
angewiesen ist.
Gruß, Thomas
Ich habe doch schon geschrieben: Hough-Raum oder Hough-Transformation
hier ist der Link:
http://de.wikipedia.org/wiki/Hough-Transformation
ist extra dafür gedacht, simpel genug und erfüllt alle Bedingungen, was
will man mehr?
Kest
Hallo Kest,
die Null-Reaktion auf Deinen Hough-post zeigt, daß die
Houghtransformation sträflich unterschätzt wird. Das ist nicht
gerechtfertigt, da kann man sehr schnell parametrisierbare Objekte
erkennen, das ist nen mächtiger Hebel für schnelle Bildverarbeitung.
Sehr schön auch anzusehen, die Hough-Räume. Maik, poste doch mal nen
jpg von Deinen Zellen, die schieb ich dann mal durch meine Hough Matlab
Scripts.
Cheers
Detlef
Hallo
Ich habe die Hough-Transformation mal zur Erkennung eines Balles
ausprobiert, das Bild stammt von einer Gameboy-Kamera und wurde noch
durch einen einfachen Kantenerkennung-Algorithmus geschickt.
Rot = 'Bildpixel'
Blau = Häufungspunkte für einen vermuteten Kreismittelpunkt, je heller
desto wahrscheinlicher (Für jeden roten (=gesetzten) Pixel wird auf
allen Punkten, die sein Kreismittelpunkt für einen Kreis mit Radius
20-30 sein könnten, die Farbe etwas aufgehellt.)
Der Ball wird zwar schön erkannt, aber leider gibt es auch überall dort
Häufungspunkte wo einfach zufällig viele Pixel sind. Hat irgend jemand
einen Vorschlag, wie man das eliminieren könnte?
Dann nochwas - ist ja irre, was da für Rechenleistung gebraucht wird!
Mein AVR kommt da nicht mehr mit, das macht praktisch alles der PC. Was
steckt denn da so für Hardware drin z.B. bei den Fussballrobotern?
Gruss
Michael
Hab letztens die RoboWM gesehen im ZDF - da waren Notebooks in den
Robotern. Die Daten wurden über 802.11b ausgetauscht.
Macht ja auch sinn da nen Laptop rein zu hauen - so'n Popelchip kann
halt keine schnelle Grafikberechnungen machen! Leider :-/
Bei den Fussballrobotern wird dieses Verfahren meines Wissens nach nicht
verwendet. Die erkennen Ball und Spieler anhand der Farbe, dafür gibt es
auch strenge Auflagen, was die Farben und Beleuchtung betrifft.
Bei der Small-Size Leage kommen die Roboter mit kleinen 8Bittern aus,
die sich nur um die Steuerung kümmern müssen. Die Position von Spielern
und Ball wird von einer Kamera über dem Spielfeld erfasst und an die
beiden Kontrollrechner der Mannschaften übertragen. Diese kümmern sich
dann um Bilderkennung und Strategie. Die Kommunikation zu den Bots geht
über Bluetooth.
Die Roboter der Mid-Size Leage schleppen meines Wissens nach alle ne
moderne PC Hardware mit sich rum.
Um das Ergebnis zu verbessern würde mir jetzt spontan einfallen den
blauen Punkten eine immer größere Gewichtung zu geben, wenn ein bereits
gesetzter Punkt nochmal von einer Position die auf dem gleichem
Kreisbogen liegen könnte gesetzt wird. Das sollte den Mittelpunkt eines
Kreises deutlicher von anderen Punkten absetzen.
Gruß, Thomas
Grrr,
ein bereits gesetzter Punkt kann natürlich nur von einer Position die
auf dem gleichem Kreisbogen liegt nochmal gesetzt werden!
Was ich dabei eigentlich im Kopf hatte war sowas wie:
Für jeden Punkt ein Array anlegen und darin alle Winkel speichern, von
denen aus er gesetzt wird. Je breiter die Winkel dann am Ende gestreut
sind, desto mehr Gewichtung erhält der Punkt pro abgespeicherten Wert.
Was vielleicht auch was bringen könnte währe nicht immer zu
inkrementieren, sondern ab dem zweiten Treffer immer mit einem Faktor
zu multiplieren, so setzten sich Punkte mit mehreren Treffern
deutlicher ab.
Hi mr. chip,
Hough erkennt den Ball sicher, selbst bei der schlechten Qualität. Im
angehängten Bild sind die Bildpixel und das Ergebnis der Transformation
überlagert. Die Spitze im Ballzentrum ist doppelt so hoch wie die
nächsthöchste, Hough würde auch noch schlechtere Kreise erkennen.
Du muß die Houghtransformation für jeden Radius getrennt berechnen. Ich
habe als Kreisradius geschätzte 55 Pixel angenommen.
Hough ist schnell: Das Ball-Bild hat bei mir 2840 gesetzte Pixel, mein
Kreis hat 429 Peripheriepunkte, macht gut eine Million ADDITIONEN, nix
Multiplikation!
Matlab-script für Interessierte hängt hinten dran!
Cheers
Detlef
clear
a=imread('c:\MATLAB6p1\myfiles\ballerkennung.jpg');
a=double(a);
i=size(a);i=i(1:2);
dd=sqrt((292*ones(i)-a(:,:,1)).^2+(0*ones(i)-a(:,:,2)).^2+(39*ones(i)-a(
:,:,2)).^2);
dd=dd<100;
plot(a(:,25,3))
[zp,sp]=find(dd);
imagesc(dd);
axis('square');
w=linspace(0,2*pi,fix(6.5*66));
r=55;
zk=fix(r*sin(w));
sk=fix(r*cos(w));
hr=zeros(i);
for(k=1:length(w))
zz=zp+zk(k);
ss=sp+sk(k);
ind=find(zz >0 );zz=zz(ind);ss=ss(ind);
ind=find(zz<=i(1));zz=zz(ind);ss=ss(ind);
ind=find(ss >0 );zz=zz(ind);ss=ss(ind);
ind=find(ss<=i(2));zz=zz(ind);ss=ss(ind);
hr((ss-1)*i(1)+zz)=hr((ss-1)*i(1)+zz)+1;
end;
hr((sp-1)*i(1)+zp)=max(max(hr));
colormap('default')
imagesc(hr)
axis('square');
return
@Detlef: Habe soeben die ersten Erfolge gehabt! Das mit dem Radius war
mein Fehler. Hoffentlich bringe ich das ganze dann irgendwie auf nem
AVR zum laufen - der Speicher dürfte aber kritisch werden.