morphologischer operator



  • hallo zusammen,

    ich möchte einen morphologischen operator (erosion) in c++ implementieren. falls es ne fertige funktion dafür gibt, bedanke ich mich schonmal im voraus 🙂

    ne kurze zusammenfassung des problems. also. ich habe bspw. ein bild von der größe von 10 pixel breite x 10 pixel höhe.
    es läuft eine schleife von der größe size (10x10, also 0..99) über das bild. somit kann ich jeden punkt berechnen.
    Also. die tabelle sieht demnach so aus:
    0 1 2 3 4 5 6 7 8 9
    10 11 12 13 14 15 16 17 18 19
    20 21 22 23 24 25 26 27 28 29
    30 31 32 33 34 35 36 37 38 39
    40 41 42 43 44 45 46 47 48 49
    50 51 52 53 54 55 56 57 58 59
    60 61 62 63 64 65 66 67 68 69
    70 71 72 73 74 75 76 77 78 79
    80 81 82 83 84 85 86 87 88 89
    90 91 92 93 94 95 96 97 98 99

    jetzt muss hier ein operator auf die einzelnen bildpunkte gelegt und berechnet werden. in meinem fall ein kreuz. aus den zahlen 1,10,11,12 und 21 soll die kleinste zahl (hier 1) an die position der mitte vom kreuz eingetragen werden (hier 11). Bei diesen zahlen würde die tabelle
    danach folgendermaßen aussehen:
    1 2 3 4 5 6 7 8
    11 12 13 14 15 16 17 18
    21 22 23 24 25 26 27 28
    31 32 33 34 35 36 37 38
    41 42 43 44 45 46 47 48
    51 52 53 54 55 56 57 58
    61 62 63 64 65 66 67 68
    71 72 73 74 75 76 77 78
    81 82 83 84 85 86 87 88

    Jetzt ist aber das problem, dass der rahmen nicht mehr da ist. und in diesen
    rahmen muss ich die orginalwerte reinschreiben.

    so...ich hoffe, ich konnte das soweit klar verständlich darstellen. jetzt zu meinem code

    //hilfsvektoren
    vector <double> vHelp, vHelp1;
    
    //das ist ne initialisierung von aktuellen und vorherigen bild im buffer	
    float *actualp = (mImageBuffer[mImageBuffer.size()-1])->adr(0,0);
    float *lastp =    mImageBuffer[mImageBuffer.size()-DIFFIMAGEDISTANCE-1])->adr(0,0);
    
    FloatImage *destination = new FloatImage(mRectDimx, mRectDimy);
    float *destinationp = destination->adr(0,0);
    
    //größe von der schleife	
    int size = mRectDimx*mRectDimy;
    
    //hier fülle ich die erste zeile des rahmens + den ersten wert der zweiten //spalte
    for(int z =0; z<(mRectDimx+1); z++){vHelp1.push_back(actualp[z]);}
    
    //die eigentlichliche schleife 
    for (int i = 0; i < size-1; i++) {
    
    //falls ich am ende der zeile bin, schreibe den wert am ende und den ersten wert // der nächsten zeiule in den vektor und erhöhe den zähler			
    if((i+1) % mRectDimx== (mRectDimx-1) && i!=0 && (i+mRectDimx+2)<=size-1){ 
    	vHelp1.push_back(actualp[i+mRectDimx+1]);
    	vHelp1.push_back(actualp[i+mRectDimx+2]);
    	i=i+2;
    }
    //falls dies nicht der fall ist und ich noch in der größe von size bin, berechne
    
    if((i+1) + (2*mRectDimx)<=size-1){
    
    //jetzt werden alle werte in den hilfsvektor geschrieben
    	vHelp.push_back(actualp[i+1]);
    	vHelp.push_back(actualp[i+mRectDimx]);
    	vHelp.push_back(actualp[(i+1)+mRectDimx]);
            vHelp.push_back(actualp[(i+2)+mRectDimx]);
    	vHelp.push_back(actualp[(i+1)+(2*mRectDimx)]);
    
    //davon das minimum berechnet und in einen anderen vektor reingeschrieben
    	vHelp1.push_back(*(min_element(vHelp.begin(), vHelp.end())));
    //und der hilfsvektor wird gelöscht
    	vHelp.clear();
    
    }
    
    }
    
    //jetzt noch die letzte zeile des rahmens in die matrix
    for(int z =0; z<(mRectDimx-1); z++) vHelp1.push_back(actualp[(size-(mRectDimx-1))+z]);
    
    //hier werden die minimalen werte in destination geschrieben
    for (int j=0 ; j<size; j++)
    	destinationp[j] = vHelp1[j] ;	
    
    }
    

    so..ich weiß, auf den ersten blick schaut das sicher komisch aus...kann mir aber trotzdem jemand helfen und sagen, wo ich meinen denkfehler gemacht habe, denn es funtzt nicht!

    schonmal danke im voraus...

    viele grüße

    shuo



  • Das hört sich sehr interessant an. Wenn du fertig bist kannst du uns ja bescheid sagen

    Gruß headhunter



  • shuo schrieb:

    //die eigentlichliche schleife 
    for (int i = 0; i < size-1; i++) {
    
        //falls ich am ende der zeile bin, schreibe den wert am ende und den ersten wert // der nächsten zeiule in den vektor und erhöhe den zähler			
        if((i+1) % mRectDimx== (mRectDimx-1) && i!=0 && (i+mRectDimx+2)<=size-1){ 
            vHelp1.push_back(actualp[i+mRectDimx+1]);
            vHelp1.push_back(actualp[i+mRectDimx+2]);
            i=i+2;
        }
        /* else */ // Werner: oder kein else, das ist hier die Frage
        //falls dies nicht der fall ist und ich noch in der größe von size bin, berechne
    
        if((i+1) + (2*mRectDimx)<=size-1){
        //jetzt werden alle werte in den hilfsvektor geschrieben
             vHelp.push_back(actualp[i+1]);
             vHelp.push_back(actualp[i+mRectDimx]);
             // usw.
    

    Ich steig' durch Deinen Code nicht durch - ich kann nur vermuten, dass hinter dem ersten if in der Schleife evt. ein else fehlt. (s.o.) Das schließe ich aus Deinem Kommentar 🕶

    Gruß
    Werner


Log in to reply