<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[morphologischer operator]]></title><description><![CDATA[<p>hallo zusammen,</p>
<p>ich möchte einen morphologischen operator (erosion) in c++ implementieren. falls es ne fertige funktion dafür gibt, bedanke ich mich schonmal im voraus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>ne kurze zusammenfassung des problems. also. ich habe bspw. ein bild von der größe von 10 pixel breite x 10 pixel höhe.<br />
es läuft eine schleife von der größe size (10x10, also 0..99) über das bild. somit kann ich jeden punkt berechnen.<br />
Also. die tabelle sieht demnach so aus:<br />
0 1 2 3 4 5 6 7 8 9<br />
10 11 12 13 14 15 16 17 18 19<br />
20 21 22 23 24 25 26 27 28 29<br />
30 31 32 33 34 35 36 37 38 39<br />
40 41 42 43 44 45 46 47 48 49<br />
50 51 52 53 54 55 56 57 58 59<br />
60 61 62 63 64 65 66 67 68 69<br />
70 71 72 73 74 75 76 77 78 79<br />
80 81 82 83 84 85 86 87 88 89<br />
90 91 92 93 94 95 96 97 98 99</p>
<p>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<br />
danach folgendermaßen aussehen:<br />
1 2 3 4 5 6 7 8<br />
11 12 13 14 15 16 17 18<br />
21 22 23 24 25 26 27 28<br />
31 32 33 34 35 36 37 38<br />
41 42 43 44 45 46 47 48<br />
51 52 53 54 55 56 57 58<br />
61 62 63 64 65 66 67 68<br />
71 72 73 74 75 76 77 78<br />
81 82 83 84 85 86 87 88</p>
<p>Jetzt ist aber das problem, dass der rahmen nicht mehr da ist. und in diesen<br />
rahmen muss ich die orginalwerte reinschreiben.</p>
<p>so...ich hoffe, ich konnte das soweit klar verständlich darstellen. jetzt zu meinem code</p>
<pre><code class="language-cpp">//hilfsvektoren
vector &lt;double&gt; vHelp, vHelp1;

//das ist ne initialisierung von aktuellen und vorherigen bild im buffer	
float *actualp = (mImageBuffer[mImageBuffer.size()-1])-&gt;adr(0,0);
float *lastp =    mImageBuffer[mImageBuffer.size()-DIFFIMAGEDISTANCE-1])-&gt;adr(0,0);

FloatImage *destination = new FloatImage(mRectDimx, mRectDimy);
float *destinationp = destination-&gt;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&lt;(mRectDimx+1); z++){vHelp1.push_back(actualp[z]);}

//die eigentlichliche schleife 
for (int i = 0; i &lt; 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) &amp;&amp; i!=0 &amp;&amp; (i+mRectDimx+2)&lt;=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)&lt;=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&lt;(mRectDimx-1); z++) vHelp1.push_back(actualp[(size-(mRectDimx-1))+z]);

//hier werden die minimalen werte in destination geschrieben
for (int j=0 ; j&lt;size; j++)
	destinationp[j] = vHelp1[j] ;	

}
</code></pre>
<p>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!</p>
<p>schonmal danke im voraus...</p>
<p>viele grüße</p>
<p>shuo</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/131760/morphologischer-operator</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 07:26:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/131760.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 05 Jan 2006 16:21:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to morphologischer operator on Thu, 05 Jan 2006 16:21:22 GMT]]></title><description><![CDATA[<p>hallo zusammen,</p>
<p>ich möchte einen morphologischen operator (erosion) in c++ implementieren. falls es ne fertige funktion dafür gibt, bedanke ich mich schonmal im voraus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>ne kurze zusammenfassung des problems. also. ich habe bspw. ein bild von der größe von 10 pixel breite x 10 pixel höhe.<br />
es läuft eine schleife von der größe size (10x10, also 0..99) über das bild. somit kann ich jeden punkt berechnen.<br />
Also. die tabelle sieht demnach so aus:<br />
0 1 2 3 4 5 6 7 8 9<br />
10 11 12 13 14 15 16 17 18 19<br />
20 21 22 23 24 25 26 27 28 29<br />
30 31 32 33 34 35 36 37 38 39<br />
40 41 42 43 44 45 46 47 48 49<br />
50 51 52 53 54 55 56 57 58 59<br />
60 61 62 63 64 65 66 67 68 69<br />
70 71 72 73 74 75 76 77 78 79<br />
80 81 82 83 84 85 86 87 88 89<br />
90 91 92 93 94 95 96 97 98 99</p>
<p>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<br />
danach folgendermaßen aussehen:<br />
1 2 3 4 5 6 7 8<br />
11 12 13 14 15 16 17 18<br />
21 22 23 24 25 26 27 28<br />
31 32 33 34 35 36 37 38<br />
41 42 43 44 45 46 47 48<br />
51 52 53 54 55 56 57 58<br />
61 62 63 64 65 66 67 68<br />
71 72 73 74 75 76 77 78<br />
81 82 83 84 85 86 87 88</p>
<p>Jetzt ist aber das problem, dass der rahmen nicht mehr da ist. und in diesen<br />
rahmen muss ich die orginalwerte reinschreiben.</p>
<p>so...ich hoffe, ich konnte das soweit klar verständlich darstellen. jetzt zu meinem code</p>
<pre><code class="language-cpp">//hilfsvektoren
vector &lt;double&gt; vHelp, vHelp1;

//das ist ne initialisierung von aktuellen und vorherigen bild im buffer	
float *actualp = (mImageBuffer[mImageBuffer.size()-1])-&gt;adr(0,0);
float *lastp =    mImageBuffer[mImageBuffer.size()-DIFFIMAGEDISTANCE-1])-&gt;adr(0,0);

FloatImage *destination = new FloatImage(mRectDimx, mRectDimy);
float *destinationp = destination-&gt;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&lt;(mRectDimx+1); z++){vHelp1.push_back(actualp[z]);}

//die eigentlichliche schleife 
for (int i = 0; i &lt; 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) &amp;&amp; i!=0 &amp;&amp; (i+mRectDimx+2)&lt;=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)&lt;=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&lt;(mRectDimx-1); z++) vHelp1.push_back(actualp[(size-(mRectDimx-1))+z]);

//hier werden die minimalen werte in destination geschrieben
for (int j=0 ; j&lt;size; j++)
	destinationp[j] = vHelp1[j] ;	

}
</code></pre>
<p>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!</p>
<p>schonmal danke im voraus...</p>
<p>viele grüße</p>
<p>shuo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/957962</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/957962</guid><dc:creator><![CDATA[shuo]]></dc:creator><pubDate>Thu, 05 Jan 2006 16:21:22 GMT</pubDate></item><item><title><![CDATA[Reply to morphologischer operator on Thu, 05 Jan 2006 16:22:41 GMT]]></title><description><![CDATA[<p>Das hört sich sehr interessant an. Wenn du fertig bist kannst du uns ja bescheid sagen</p>
<p>Gruß headhunter</p>
]]></description><link>https://www.c-plusplus.net/forum/post/957966</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/957966</guid><dc:creator><![CDATA[hädhunter]]></dc:creator><pubDate>Thu, 05 Jan 2006 16:22:41 GMT</pubDate></item><item><title><![CDATA[Reply to morphologischer operator on Thu, 05 Jan 2006 20:52:46 GMT]]></title><description><![CDATA[<p>shuo schrieb:</p>
<blockquote>
<pre><code class="language-cpp">//die eigentlichliche schleife 
for (int i = 0; i &lt; 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) &amp;&amp; i!=0 &amp;&amp; (i+mRectDimx+2)&lt;=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)&lt;=size-1){
    //jetzt werden alle werte in den hilfsvektor geschrieben
         vHelp.push_back(actualp[i+1]);
         vHelp.push_back(actualp[i+mRectDimx]);
         // usw.
</code></pre>
</blockquote>
<p>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 <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f576.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--sunglasses"
      title=":sunglasses:"
      alt="🕶"
    /></p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/958242</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/958242</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Thu, 05 Jan 2006 20:52:46 GMT</pubDate></item></channel></rss>