<?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[Mehrfache Bildüberlagerung statt Filterung, Zeigerproblem??]]></title><description><![CDATA[<p>Hallo !!<br />
Ich hab ein Problem in c++ und kann einfach die Ursache nicht finden..</p>
<p>Ich habe einen Gaussfilter sowohl in Csharp als auch in c++ geschrieben.<br />
Er funktioniert in c# ohne Probleme und zwar mit dynamischen 2d-Arrays.</p>
<p>Der einzige Unterschied c++ zu c#:<br />
C++ arbeitet mit dynamischen 1d-Arrays auf deren Elemente in der Form index=x*Höhe+y<br />
zugegriffen wird (Bitte nicht wundern! Ich habe aus reiner Konvention die Bildstruktur so geändert, dass ich mit x,y arbeiten kann, statt y,x. Funktioniert auch bei Abbildung der Arrays im Sinne &quot;hin und wieder zurück&quot; ohne Fehler).</p>
<p>Nun taucht in C++ der Fehler auf, dass dieselbe Filterfunktion die 9 verschiedenen Anteile der Filterberechnung nicht im richtigen Punkt addiert. Stattdessen ergibt sich eine Überlagerung von 9 Bildern die exakt um 1/3 der Bildgrösse zueinander versetzt sind.</p>
<p>Ich finde einfach nicht heraus warum das so ist. Ist irgendwo ein Zeiger den ich nicht sehe, der aus x+-1 x+- 1/3 Bildbreite macht ????</p>
<p>Ich habe bereits mehrfach die Indexberechnungen im Debugmode schrittweise überprüft. Es müsste eigentlich richtig sein....</p>
<p>Filter:</p>
<pre><code class="language-cpp">static bool prefiltering_gauss(DOUBLEARRAY_OFIMAGE &amp;gaussfilter,double gaussnorm,DOUBLEARRAY_OFIMAGE &amp;filteredImage, DOUBLEARRAY_OFIMAGE &amp;Image, double &amp;maxval, double &amp;minval, int Width, int Height)
{
	maxval = 128;
	minval = 128;
	double sum =0;
	for (int dx = 1; dx &lt; (Width-1); dx++)
            {
                for (int dy = 1; dy &lt; (Height-1); dy++)
                {
		for (int j = -1; j &lt; 2; j++)
                    {
                        for (int k = -1; k &lt; 2; k++)
                        {
			    //int n=(dx+j)*(Height)+(dy+k);
			    sum += Image.getv(dx + j,dy + k) * gaussfilter.getv(j+1,k + 1);					
                        }
                   }
		sum = sum/gaussnorm;
		filteredImage.setv(dx,dy,sum);
		//filteredImage[dx][dy] = Image[dx][dy]*1;
		if (sum &lt; minval) minval = sum;
		if (sum &gt; maxval) maxval = sum;
		sum =0;
                }
            }
            if (maxval == minval)
            {
                maxval = 255;
                minval = 0;
	   }
	return true;
}
</code></pre>
<p>Bildstruktur (und Filterkernelstruktur nur 3*3 grösse):<br />
Body:</p>
<pre><code class="language-cpp">int border = 1;
double maxgrey =255;
double mingrey =0;
double gaussnorm =0;
double sigma =0.33;
DOUBLEARRAY_OFIMAGE ImageField(psImage-&gt;uiHeight+2*border,psImage-&gt;uiWidth+2*border);
DOUBLEARRAY_OFIMAGE pregaussed(psImage-&gt;uiHeight+2*border,psImage-&gt;uiWidth+2*border);
DOUBLEARRAY_OFIMAGE gaussfilter(3 ,3);
defgaussfilter(gaussfilter, gaussnorm, sigma); // berechnung 3*3 gaussfilter und renormierungsgrösse
prefiltering_gauss(gaussfilter,gaussnorm,pregaussed,ImageField,maxgrey,mingrey,Width,Height); // vorfilterung mit gaussfilter
</code></pre>
<p>Header</p>
<pre><code class="language-cpp">class DOUBLEARRAY_OFIMAGE 
{
// data
public:
	int				uiWidth;
	int				uiHeight;
	BOOL			      	bColor;
	int				iSource;
	LPCTSTR				lpszSourceName;
private: 
        double*                               Value;

public: 
        DOUBLEARRAY_OFIMAGE(int Hoehe,int Breite) 
        { 
            uiHeight = Hoehe; 
            uiWidth = Breite; 
            // 2-Dimensionales Array auf 1-Dimensionales abbilden 
            Value = new double[uiWidth * uiHeight]; 
        }
	double getv(int x, int y)
	{
		return Value[x*uiHeight+y];
	}
	void setv(int x, int y, double v)
	{
		Value[x*uiHeight+y]=v;
	}

        double* operator[](int Spalte) 
        { 
            // Array liegt &quot;spaltenweise&quot; im Speicher damit zugriff [x][y] konventionell b zu w ist 
            return &amp; Value[Spalte * uiHeight]; 
        } 
        ~DOUBLEARRAY_OFIMAGE() 
        { 
            delete [] Value; 
        } 
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/273834/mehrfache-bildüberlagerung-statt-filterung-zeigerproblem</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 22:39:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/273834.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 14 Sep 2010 08:07:20 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Mehrfache Bildüberlagerung statt Filterung, Zeigerproblem?? on Tue, 14 Sep 2010 08:40:03 GMT]]></title><description><![CDATA[<p>Hallo !!<br />
Ich hab ein Problem in c++ und kann einfach die Ursache nicht finden..</p>
<p>Ich habe einen Gaussfilter sowohl in Csharp als auch in c++ geschrieben.<br />
Er funktioniert in c# ohne Probleme und zwar mit dynamischen 2d-Arrays.</p>
<p>Der einzige Unterschied c++ zu c#:<br />
C++ arbeitet mit dynamischen 1d-Arrays auf deren Elemente in der Form index=x*Höhe+y<br />
zugegriffen wird (Bitte nicht wundern! Ich habe aus reiner Konvention die Bildstruktur so geändert, dass ich mit x,y arbeiten kann, statt y,x. Funktioniert auch bei Abbildung der Arrays im Sinne &quot;hin und wieder zurück&quot; ohne Fehler).</p>
<p>Nun taucht in C++ der Fehler auf, dass dieselbe Filterfunktion die 9 verschiedenen Anteile der Filterberechnung nicht im richtigen Punkt addiert. Stattdessen ergibt sich eine Überlagerung von 9 Bildern die exakt um 1/3 der Bildgrösse zueinander versetzt sind.</p>
<p>Ich finde einfach nicht heraus warum das so ist. Ist irgendwo ein Zeiger den ich nicht sehe, der aus x+-1 x+- 1/3 Bildbreite macht ????</p>
<p>Ich habe bereits mehrfach die Indexberechnungen im Debugmode schrittweise überprüft. Es müsste eigentlich richtig sein....</p>
<p>Filter:</p>
<pre><code class="language-cpp">static bool prefiltering_gauss(DOUBLEARRAY_OFIMAGE &amp;gaussfilter,double gaussnorm,DOUBLEARRAY_OFIMAGE &amp;filteredImage, DOUBLEARRAY_OFIMAGE &amp;Image, double &amp;maxval, double &amp;minval, int Width, int Height)
{
	maxval = 128;
	minval = 128;
	double sum =0;
	for (int dx = 1; dx &lt; (Width-1); dx++)
            {
                for (int dy = 1; dy &lt; (Height-1); dy++)
                {
		for (int j = -1; j &lt; 2; j++)
                    {
                        for (int k = -1; k &lt; 2; k++)
                        {
			    //int n=(dx+j)*(Height)+(dy+k);
			    sum += Image.getv(dx + j,dy + k) * gaussfilter.getv(j+1,k + 1);					
                        }
                   }
		sum = sum/gaussnorm;
		filteredImage.setv(dx,dy,sum);
		//filteredImage[dx][dy] = Image[dx][dy]*1;
		if (sum &lt; minval) minval = sum;
		if (sum &gt; maxval) maxval = sum;
		sum =0;
                }
            }
            if (maxval == minval)
            {
                maxval = 255;
                minval = 0;
	   }
	return true;
}
</code></pre>
<p>Bildstruktur (und Filterkernelstruktur nur 3*3 grösse):<br />
Body:</p>
<pre><code class="language-cpp">int border = 1;
double maxgrey =255;
double mingrey =0;
double gaussnorm =0;
double sigma =0.33;
DOUBLEARRAY_OFIMAGE ImageField(psImage-&gt;uiHeight+2*border,psImage-&gt;uiWidth+2*border);
DOUBLEARRAY_OFIMAGE pregaussed(psImage-&gt;uiHeight+2*border,psImage-&gt;uiWidth+2*border);
DOUBLEARRAY_OFIMAGE gaussfilter(3 ,3);
defgaussfilter(gaussfilter, gaussnorm, sigma); // berechnung 3*3 gaussfilter und renormierungsgrösse
prefiltering_gauss(gaussfilter,gaussnorm,pregaussed,ImageField,maxgrey,mingrey,Width,Height); // vorfilterung mit gaussfilter
</code></pre>
<p>Header</p>
<pre><code class="language-cpp">class DOUBLEARRAY_OFIMAGE 
{
// data
public:
	int				uiWidth;
	int				uiHeight;
	BOOL			      	bColor;
	int				iSource;
	LPCTSTR				lpszSourceName;
private: 
        double*                               Value;

public: 
        DOUBLEARRAY_OFIMAGE(int Hoehe,int Breite) 
        { 
            uiHeight = Hoehe; 
            uiWidth = Breite; 
            // 2-Dimensionales Array auf 1-Dimensionales abbilden 
            Value = new double[uiWidth * uiHeight]; 
        }
	double getv(int x, int y)
	{
		return Value[x*uiHeight+y];
	}
	void setv(int x, int y, double v)
	{
		Value[x*uiHeight+y]=v;
	}

        double* operator[](int Spalte) 
        { 
            // Array liegt &quot;spaltenweise&quot; im Speicher damit zugriff [x][y] konventionell b zu w ist 
            return &amp; Value[Spalte * uiHeight]; 
        } 
        ~DOUBLEARRAY_OFIMAGE() 
        { 
            delete [] Value; 
        } 
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1952316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1952316</guid><dc:creator><![CDATA[ghostwhisperer]]></dc:creator><pubDate>Tue, 14 Sep 2010 08:40:03 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrfache Bildüberlagerung statt Filterung, Zeigerproblem?? on Tue, 14 Sep 2010 08:46:57 GMT]]></title><description><![CDATA[<p>Reformat'ted:</p>
<pre><code class="language-cpp">static bool prefiltering_gauss(DOUBLEARRAY_OFIMAGE &amp;gaussfilter,double gaussnorm,DOUBLEARRAY_OFIMAGE &amp;filteredImage, DOUBLEARRAY_OFIMAGE &amp;Image, double &amp;maxval, double &amp;minval, int Width, int Height)
{
    maxval = 128;
    minval = 128;
    double sum =0;
    for (int dx = 1; dx &lt; (Width-1); dx++) // siehe getv/setv: x*uiHeight .. hier: Width :confused:
    {
        for (int dy = 1; dy &lt; (Height-1); dy++) 
        {
            for (int j = -1; j &lt; 2; j++)
            {
                for (int k = -1; k &lt; 2; k++)
                {
                    sum += Image.getv(dx + j,dy + k) * gaussfilter.getv(j+1,k + 1);                   
                }
            }
            sum = sum/gaussnorm;
            filteredImage.setv(dx,dy,sum);

            if (sum &lt; minval) minval = sum;
            if (sum &gt; maxval) maxval = sum;
            sum =0;
        }
    }
    if (maxval == minval)
    {
        maxval = 255;
        minval = 0;
    }
    return true;
}
</code></pre>
<p>Warum nicht <code>DOUBLEARRAY_OFIMAGE(int Hoehe,int Breite) : uiHeight(Hoehe), uiWidth(Breite), Value(new double[Hoehe*Breite]) {}</code> ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1952331</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1952331</guid><dc:creator><![CDATA[padreigh]]></dc:creator><pubDate>Tue, 14 Sep 2010 08:46:57 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrfache Bildüberlagerung statt Filterung, Zeigerproblem?? on Tue, 14 Sep 2010 10:18:43 GMT]]></title><description><![CDATA[<p>padreigh schrieb:</p>
<blockquote>
<p>Warum nicht <code>DOUBLEARRAY_OFIMAGE(int Hoehe,int Breite) : uiHeight(Hoehe), uiWidth(Breite), Value(new double[Hoehe*Breite]) {}</code> ?</p>
</blockquote>
<p>Sorry, hab keine Ahnung was du da andeutest oder was das bewirkt....<br />
Zu deiner Frage:<br />
Ich hab die Klassendefinition als eine von mehreren Möglichkeiten hier im Forum gefunden, wie man mehr-d-Arrays abbilden kann.</p>
<p>padreigh schrieb:</p>
<blockquote>
<p>for (int dx = 1; dx &lt; (Width-1); dx++) // siehe getv/setv: x*uiHeight .. hier: Width</p>
</blockquote>
<p>Hier ist x die Anzahl der Spalten, und das Array enthält die Bilddaten in Spaltenlängen &quot;strukturiert&quot; im Speicher. x {0...width-1} y {0..height-1}</p>
<p>MFG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1952343</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1952343</guid><dc:creator><![CDATA[ghostwhisperer]]></dc:creator><pubDate>Tue, 14 Sep 2010 10:18:43 GMT</pubDate></item><item><title><![CDATA[Reply to Mehrfache Bildüberlagerung statt Filterung, Zeigerproblem?? on Tue, 14 Sep 2010 12:13:59 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">// google: &quot;initialisierungsliste c++&quot; 
DOUBLEARRAY_OFIMAGE(int Hoehe,int Breite) : uiHeight(Hoehe), uiWidth(Breite), Value(new double[Hoehe*Breite]) {}
// versus
DOUBLEARRAY_OFIMAGE(int Hoehe,int Breite) // alle member werden per Defaultkonstruktor konstruiert (falls kein POD)
{
   uiHeight = Hoehe; // und dann per zuweisung &quot;überschrieben&quot;
   uiWidth = Breite;
   Value = new double[Hoehe*Breite];
}
</code></pre>
<p>Initialisierungsliste ist schneller hab ich mir sagen lassen ... bei PODs egal. Generell kann man sich das aber angewöhnen da bei komplexeren Typen Zeit eingespart wird.</p>
<p>Das sind deine getter/setter:</p>
<pre><code class="language-cpp">double getv(int x, int y)           { return Value[x*uiHeight+y]; }
void   setv(int x, int y, double v) { Value[x*uiHeight+y]=v;      }
</code></pre>
<p>Über das Bild läufst du mit (hab mal die Faltung rausgenommen da ich vermute die Pixel werden nicht korrekt gewählt ==&gt; simpler):</p>
<pre><code class="language-cpp">for (int dx = 0; dx &lt; Width; dx++)
    {
        for (int dy = 0; dy &lt; Height; dy++)
        {
            sum = Image.getv(dx,dy);
            filteredImage.setv(dx,dy,sum);
        }
    }
</code></pre>
<p>Nu sezt da mal statt getv und setv deren Definition ein und Spiels mit einem asym. Bild von 1*3 Pixel durch. Deine Array indexe sind immer valide ... aber treffen die auch den Pixel den du willst?</p>
<p>Alternativ verpass mal getv/setv ein ASSERT(x &lt; uiWidth) ASSERT (y &lt; uiHeigth)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1952439</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1952439</guid><dc:creator><![CDATA[padreigh]]></dc:creator><pubDate>Tue, 14 Sep 2010 12:13:59 GMT</pubDate></item></channel></rss>