Euler Charakteristik LUT



  • hi
    ich will den algorithmus zum skeletierne von kanten via euler charakteristik proragmieren. Nun brauche ich fuer die 3x3 umgebungen eine LUT, ob sich die charakteristic aendert oder nicht. wie inizialisiere ich die LUT. das hat doch bestimmt schon jemand vor mir gemacht E = e -k + f
    aber das zaehlen der ecken und kanten ist irgendwie scheisse. wie soll ich das dem rechner beibringen. nja waere schoen wen da einer bereits was haette.
    bye



  • Ein bißchen weiter mußt Du schon ausholen. Was ist Deine genaue Problemstellung? Für mich klingt es ein bißchen, als hättest Du als Eingabe ein Bild oder sowas vorliegen. Die Euler-Charakteristik ist ein graph-theoretisches Konzept, insofern ist da der direkte Zusammenhang nicht klar. Soll LUT eine Lookup-Tabelle sein? Wenn ja, was willst Du in der Tabelle nachschlagen, welche Werte nimmt man zum Nachschlagen und was kommt dann raus?


  • Mod



  • 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 >> 3
    y+x-1) & 0x1) == 1;
    }
    }
    }
    eulerLUT[i] = euler_characteristic(u)==1;
    }


Anmelden zum Antworten