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 99jetzt 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 88Jetzt 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