H
hi
ja das ist ne lookup table. es geht um thinnig. sobel habe ich schon. das sind ja convolution filter. aber wenn man mit sobel rueber geht, und dann die kanten verstärkt hat, will man eventuell mit euler thinning machen udn dann vektoriersiern. also ich habe das jetzt programmiert. habe es rekusiv gemacht, das zaehlen der ecken und kannten im dem 3x3 array. ich weiss gar nicht ob das funktioniert. habe nur ein paar ausgewaehlte faelle nachvollzogen
nun ja wie dem auch sei. so richtig funktionieren tut das nicht aber nun ja.
kann den code mal posten aber ist auch nicht so der hit und weiss auch nich ob das richtig ist.mh
void MainWindow::euler_flaeche(bool u[3][3],bool orig[3][3],int posx,int posy,struct euler &ergebnis) const
{
/struct euler ret;
int f;
int e;
int k;/
ergebnis.f++;
ergebnis.e += 4;
ergebnis.k += 4;
u[posx][posy]= false; //besucht
if((posx+1 < 3)){
if(orig[posx+1][posy]){//ist gesetzt ?
ergebnis.e -=2;
ergebnis.k -=1;
if(u[posx+1][posy]) // ist es schon mal besucht worden ?
euler_flaeche(u,orig,posx+1,posy,ergebnis);
}
}
if((posy+1 < 3)){
if(orig[posx][posy+1]){//ist gesetzt ?
ergebnis.e -=2;
ergebnis.k -=1;
if(u[posx][posy+1]) //ist es schon mal besucht worden ?
euler_flaeche(u,orig,posx,posy+1,ergebnis);
}else{
if(posy+1 < 3 && posx+1 < 3 ){ //diagonal
if(orig[posx+1][posy+1]){//ist gesetzt ?
if(u[posx+1][posy+1]){ //ist es schon mal besucht worden ?
ergebnis.e -=1;
euler_flaeche(u,orig,posx+1,posy+1,ergebnis);
}
}
}
if(posy-1 >= 0 && posx-1 >= 0 ){ //diagonal
if(orig[posx-1][posy-1]){//ist gesetzt ?
if(u[posx-1][posy-1]){ //ist es schon mal besucht worden ?
ergebnis.e -=1;
euler_flaeche(u,orig,posx-1,posy-1,ergebnis);
}
}
}
}
}
int MainWindow::euler_characteristic(bool u[3][3]) const
{
int E=0,e=0,f=0,k=0;
bool back[3][3];
memcpy(back,u,sizeof(char)*9);
for(int y=0;y<3;++y) {
for(int x=0;x<3;++x) {
if(u[x][y]){//gesetzt
struct euler tmp;
tmp.e=0;
tmp.f=0;
tmp.k=0;
euler_flaeche(u,back,x,y,tmp);
e+=tmp.e;
f+= tmp.f;
k += tmp.k;
}
}
}
E = e - k + f;
return E;
}
hm hatte noch nen fehler gefunden aber kp ob es jetzt fehlerfrei ist. denke eher nicht. hmmh dazu muss man auch sagen, dass das pixel in der mitte nie gesetzt ist, weil dieses ja auf eine löschung hin ueberprueft werden soll. so richtig funzen tut das bei mir leider auch nicht..hm
hier noch mal das inniten der LUT ,hhm
for(int i=0;i<256;++i) {
for(int y=0;y<3;++y) {
for(int x=0;x<3;++x) {
if(x==1 && y == 1){
u[y][x]=false;
continue ;
}
if((x<=1 && y<=1)|| y<1 ){
u[x][y] = ((i >> 3y+x) & 0x1) == 1;
}else{
u[x][y] = ((i >> 3y+x-1) & 0x1) == 1;
}
}
}
eulerLUT[i] = euler_characteristic(u)==1;
}