Wo ist der Fehler?

Hallo,
ich steh ja selbst nicht auf so unspezifische Fragen *grml*,
aber ich glaub ich hab keine andere Wahl... also, wo ist der Fehler?

Vorgeschichte:
Im Speicher liegt ein Bild in einem unsigned char (m_charBild) der Größe 640*480*3. Der Einfachheit habe ich einen einfachen weißen Kreis auf einen schwarzen Hintergrund gemalt.

Dieses Bild möchte ich nun mit einer 3*3 Maske abtasten und das Ergebnis in ein neues char (BildX) speichern. Dadurch entsteht in BildX eine Abbildung des ersten Bildes, wo lediglich die die Kanten des Kreises weiß bzw. hellgrau sind und der Rest (Flächen/Regionen) schwarz bzw. dunkelgrau.

Realisierung:
Code:
int Sobol(int P1, int P2, int P3, int P4, int P5, int P6, int P7, int P8, int P9)
{
	//Sobol-Maske für vertikale (x) Kanten
	int Result;
	int S1 = -1;
	int S2 = 0;
	int S3 = 1;
	int S4 = -2;
	int S5 = 0;
	int S6 = 2;
	int S7 = -1;
	int S8 = 0;
	int S9 = 1;

	Result = (S1*P1 + S2*P2 + S3*P3 + S4*P4 + S5*P5 + S6*P6 + S7*P7 + S8*P8 + S9*P9);
	return(abs(Result));
}

void CMesssystemDlg::OnCmd3KantenDet() 
{
	int width = 640;
	int height = 480;
	int i;
	div_t divResult;

	BildX = new unsigned char[width * height * 3];

	for (i=0; i<width*height*3; i+=3)
	{
		divResult = div(i/3,width);
		if ((divResult.quot != 0) && (divResult.quot != height-1) && (divResult.rem != 0) && (divResult.rem != width-1))
		{
			BildX[i] = Sobol(m_charBild[i+width-1], m_charBild[i+width], m_charBild[i+width+1], m_charBild[i-1], m_charBild[i], m_charBild[i+1], m_charBild[i-width-1], m_charBild[i-width], m_charBild[i-width+1]);
			BildX[i+1] = BildX[i];
			BildX[i+2] = BildX[i];
		}
		else
		{
			BildX[i] = 0;
			BildX[i+1] = 0;
			BildX[i+2] = 0;
		}
	}

	//Kopf/Header des Bildes erstellen
	BITMAPINFO bmi;
	bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	bmi.bmiHeader.biWidth = width;
	bmi.bmiHeader.biHeight = height;
	bmi.bmiHeader.biPlanes = 1;
	bmi.bmiHeader.biBitCount = 24;
	bmi.bmiHeader.biCompression = BI_RGB;
	bmi.bmiHeader.biSizeImage = 0;
	bmi.bmiHeader.biXPelsPerMeter = 1000;
	bmi.bmiHeader.biYPelsPerMeter = 1000;
	bmi.bmiHeader.biClrUsed = 0;
	bmi.bmiHeader.biClrImportant = 0;

	//"Zeichenblatt" holen
	CClientDC dc(this);

	//Bild anzeigen
	HBITMAP hBitmap;
	hBitmap =  CreateCompatibleBitmap(dc,width,height);
	SetDIBits(dc, hBitmap, 0, height, BildX, &bmi, DIB_PAL_COLORS);	
	pMyDlg->m_cCam.SetBitmap(hBitmap);
}

Ergebnis:
Es funktioniert fast perfekt *grml*
Aber irgendwo muss ich mich "verzählt" haben.
Als Ergebnis erscheint ein Kreis (weiße Kanten) genau an der richtigen Stelle, aber leider auch der selbe Kreis noch einmal ca. ein drittel der Bildbreite nach rechts verschoben.

Ich hoffe die sehr knappe Zusammenfassung war verständlich.
Falls nicht, fragt einfach...
bitte um dringende Hilfe...

Gruß,
Alex
 
Ich kann den Fehler mittlerweile etwas einschränken.

Die Funktion Sobol stellt eine 3*3 Pixel-Maske dar. Gezählt wird dabei von oben links nach unten rechts. P5 ist dabei der Pixel dem der neu errechnete Wert hinterher zugewiesen wird.

Sobol Maske:
| S1 | S2 | S3 |
|-----|------|-----|
| S4 | S5 | S6 |
|-----|------|-----|
| S7 | S8 | S9 |

mit dem im Programm gesetzten Werten liefert das bearbeiten mit dieser Maske ein Bild, in dem die vertikalen Kanten im Bild hervorgehoben werden.

Ich habe festgestellt, dass die Felder S1 bis S6 den richtigen Kreis berechnen und die Felder S7 bis S9 diesen fehlerhaft verschobenen.
 
Fehler endlich gefunden...

Diese Zeile
Code:
BildX[i] = Sobol(m_charBild[i+width-1], m_charBild[i+width], m_charBild[i+width+1], m_charBild[i-1], m_charBild[i], m_charBild[i+1], m_charBild[i-width-1], m_charBild[i-width], m_charBild[i-width+1]);
muss so heißen
Code:
BildX[i] = Sobol(m_charBild[i+3*(width-1)], m_charBild[i+3*width], m_charBild[i+3*(width+1)], m_charBild[i-3*1], m_charBild[i], m_charBild[i+3*1], m_charBild[i-3*(width-1)], m_charBild[i-3*width], m_charBild[i-3*(width+1)]);
 
Zurück