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:
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;
}
... ist eine Faltung mit dem horizontalen und vertikalen Sobel-Operator.
Lesezeichen