Warum postet Ihr denn nicht einfach eure Codes? Oder wenigstens die Algos, wie zefram schon gesagt hat. Das würde vieles um Einiges einfacher machen.
Gruß
Johannes
Druckbare Version
Warum postet Ihr denn nicht einfach eure Codes? Oder wenigstens die Algos, wie zefram schon gesagt hat. Das würde vieles um Einiges einfacher machen.
Gruß
Johannes
Also ok, unter www.tu-chemnitz.de/~niko/biber gibts die .exe und ein paar Testbilder.
Bitte beachten: Das Prog schluckt im Moment nur .bmp mit 256 Graustufen.
Der C++ Algorithmus zur Kantenerkennung:
... ist eine Faltung mit dem horizontalen und vertikalen Sobel-Operator.Code:/**************************************************************************
* Methode: sobel_kombiniert *
* Sichtbarkeit: public *
* Parameter: schwelle *
* *
* *
* Funktion: führt eine Faltung mit dem beiden *
* Sobel-Operatoren aus (Gradientenverfahren), *
* benutzt den in 'schwelle' übergebenen Wert zur *
* Binearisierung des Bildes *
***************************************************************************/
bool TbiberImage::sobel_kombiniert(TbiberPix schwelle,TbiberPix *oldPix)
{TbiberPix kern1[3][3]={ {1,0,-1},
{2,0,-2},
{1,0,-1}};
TbiberPix kern2[3][3]={ {1,2,1},
{0,0,0},
{-1,-2,-1}};
int summe=0,s1=0,s2=0;
int x,y;
TbiberPix* newPix;
int *ykoord, y1,y2,y0;
if (!(newPix=(TbiberPix*)calloc(TbiberImage::size,sizeof(TbiberPix)))) return false;
if (!(ykoord=(int*)calloc(width,sizeof(int)))) return false;
if (oldPix) memcpy(oldPix,pixels,TbiberImage::size*sizeof(TbiberPix));
for (y=0;y<height;y++) ykoord[y]=y*width;
for (y=1;y<height-1;y++)
{ y0=ykoord[y];
y1=ykoord[y+1];
y2=ykoord[y-1];
for (x=1;x<width-1;x++)
{ s1=-getPix(y2+x-1)+getPix(y2+x+1)-2*getPix(y0+x-1)+2*getPix(y0+x+1)-getPix(y1+x-1)+getPix(y1+x+1);
s2=-getPix(y2+x-1)-2*getPix(y2+x)-getPix(y2+x+1)+getPix(y1+x-1)+2*getPix(y1+x)+getPix(y1+x+1);
// summe=sqrt(pow(s1,2)+pow(s2,2));
summe=(abs(s1)+abs(s2)) /2;
if (schwelle)
{ if (summe<schwelle) summe=0;
else summe=255;
}
else if (summe>255) summe=255;
newPix[y*width+x]=(TbiberPix)summe;
}
}
memcpy(pixels,newPix,TbiberImage::size*sizeof(TbiberPix));
free(newPix);
return true;
}
Das letzte Posting war von mir, sorry.
Noch was zu dem Programm: Lade mal das bild rechtecke2.bmp und wähle dann im Menü Segmentierung das Zeilenkoinzidenzverfahren. In der drop-down Liste kann man dann alle gefundenen Objekte durchgehen und unten wird angezeigt, ob es als Rechteck, Sechseck usw. erkannt wurde.
Dafür wird die Datei "objekte.dat" benötigt.
Hi!
Ich habe auch letztens mit graphischer Bearbeitung angefangen.
Nur habe ich als einzige Lösung, dass ich jeden Pixel einzelln auslese und die RGB werte Checke.
Dafür brauche ich dann pro Bild etwa 3s!!!!
Wenn ich mit mal eure Zeiten so angucke, naja!
Könnt ihr mit mal bitte posten, welche API's ihr benutzt und vieleicht noch ein bissele Code?
Wär echt net.
Mit freundlichen Grüßen
Baumrinde
Ach ja: Ich Code natürlich auch in VB!
Ich hab eigentlich keine APIs benutzt nur eine um die Zeit zu stoppen...
Wie bearbeitet ihr denn sonst die Bilder?
Ihr solltet die Bilder auf keinen Fall innerhalb irgendeiner PictureBox oder wie immer sich das Steuerelement unter VB nennt, bearbeiten. Kopiert euch die Pixel in ein großes Array im Speicher und führt eure Operationen dort aus. Die Zugriffe auf die einzelnen Pixel über die Steuerelement-Methoden zu machen, erzeugt eine ganze Menge Overhead, den man nicht braucht.
(VB ist vielleicht auch nicht unbedingt die beste Wahl für zeitkritische Operationen, aber das ist prinzipiell erstmal egal.)
Quellcode: Den Anfang hab ich gemacht, das Prog steht auch online, vielleicht zieht jemand nach ...
Ich denke du bist zefram?
Ich habe mir deine Sachen kurz angeschaut, aber vielleicht kannst du nochmal eine kurze Anleitung geben. Leider habe ich im Moment keine Zeit, selbst an dem Thema zu arbeiten. Ich verfolge den Thread aber trotzdem weiter.
Gruß
Johannes
Hallo,
ich habe mal eben ein kurzes Tutorial zum Thema Kantenerkennung geschrieben. Es geht nicht auf die Umsetzung in eines Programmiersprache um, sondern zeigt allein den Algorithmus.
Das Tutorial gibts hier als PDF unter http://www.tu-chemnitz.de/~niko/bibe...l/tutorial.pdf .
Bei entsprechendem Feedback bin ich auch gern bereit, das Tutorial weiter auszubauen und weitere Themen darzustellen. Das aber natürlich nur, wenn sich auch jemand ernsthaft für solche Sachen interessiert und es dann auch liest :)
Hallo zefram,
Ich habe das Tutorial gelesen und freue mich wirklich, dass ich nun
etwas handfestes habe auf dem ich meine Kantenerkennung aufbauen
kann. Wenn sich noch weiter Personen für dieses Projekt begeistern
könnten, würde ich mich über eine Fortsetzung des Tutorials sehr freuen.
Vielen Dank, Grüße nux