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; }






Zitieren

Lesezeichen