Ich benutze den Borland C++ Version 6 da damit Objektorientiertes Programmieren kinderleicht ist.
Habe nun folgendes Problem mit meinem Gauss Filter.
Beim Filtern werden die Farben verändert!
Er glättet zwar wunderbar, aber wie gesagt die Farben ändern sich dadurch auch. Bei s/w Bildern bleiben die Grauwerte wie gehabt.
Ich denke ich mache irgendwas falsch beim Zugriff auf die Farben. Soweit ich weiß liegen die Farben RGB nebeneinander quasi in einem Pixel. Deswegen kopiere ich auch mein Bild in ein dynamisches UCHAR - Array, mit 3*Width (Breite des Bildes) und versuche dann jeden Farbkanal einzeln zu bearbeiten. Aber irgenwo hab ich da nen Wurm drin und finde ihn nicht.
Code folgt:
Jetzt Sprung in die CImage.cpp, dort wo der Filter bearbeitet wird.
Ich hoffe der QuellText ist verständlich. Bei Unklarheiten bitte fragen.
Hoffe jemand kann mir auf die Sprünge helfen, danke.
Gut nacht erstmal...
Habe nun folgendes Problem mit meinem Gauss Filter.
Beim Filtern werden die Farben verändert!
Er glättet zwar wunderbar, aber wie gesagt die Farben ändern sich dadurch auch. Bei s/w Bildern bleiben die Grauwerte wie gehabt.
Ich denke ich mache irgendwas falsch beim Zugriff auf die Farben. Soweit ich weiß liegen die Farben RGB nebeneinander quasi in einem Pixel. Deswegen kopiere ich auch mein Bild in ein dynamisches UCHAR - Array, mit 3*Width (Breite des Bildes) und versuche dann jeden Farbkanal einzeln zu bearbeiten. Aber irgenwo hab ich da nen Wurm drin und finde ihn nicht.
Code folgt:
Code:
if(OpenDialog1->FileName != ""){
BYTE* SpaltenPtr;
CImage pic_gauss((Image1->Width)*3, Image1->Height); //CImage Objekt anlegen //zum arbeiten
for(int i=0; i<=Form1->Image1->Height-1; ++i){ //Bild in mein CImage Objekt //kopieren
SpaltenPtr=(BYTE*)Form1->Image1->Picture->Bitmap->ScanLine[i];
for(int j = 0; j<=(Form1->Image1->Width-1)*3; ++j)
pic_gauss.ret_Bild()[i][j]=SpaltenPtr[j];
}
pic_gauss.gauss_filter(); //filter aufrufen Sprung zum 2. Code
for(int i=0; i<=Form1->Image1->Height-1; ++i){ // das geänderte Bild in mein //ursprüngliches Bild kopieren
SpaltenPtr=(BYTE*)Form1->Image1->Picture->Bitmap->ScanLine[i];
for(int j = 0; j<=(Form1->Image1->Width-1)*3; ++j)
SpaltenPtr[j]=pic_gauss.ret_Bild()[i][j];
}
Image1->Refresh(); // Bild refreshen...
}
else
ShowMessage("Kein Bild geladen!");
Jetzt Sprung in die CImage.cpp, dort wo der Filter bearbeitet wird.
Code:
void CImage::gauss_filter() {
//Maske 1 2 1 2 4 2 1 2 1
CImage GAUSS(m_width,m_height);
vector<int> vec_mask_r; // jeweils ein Vector für jeden Farbkanal rgb
vector<int> vec_mask_g;
vector<int> vec_mask_b;
for(int i = 1; i< m_height-1; ++i)
for(int j = 1; j < (m_width-1); ++j){
vec_mask_r.push_back(m_pBild[i-1][j-1]);
vec_mask_r.push_back(2*m_pBild[i-1][j]);
vec_mask_r.push_back(m_pBild[i-1][j+1]);
vec_mask_r.push_back(2*m_pBild[i][j-1]);
vec_mask_r.push_back(4*m_pBild[i][j]);
vec_mask_r.push_back(2*m_pBild[i][j+1]);
vec_mask_r.push_back(m_pBild[i+1][j-1]);
vec_mask_r.push_back(2*m_pBild[i+1][j]);
vec_mask_r.push_back(m_pBild[i+1][j+1]);
vec_mask_g.push_back(m_pBild[i-1][j-1]);
vec_mask_g.push_back(2*m_pBild[i-1][j]);
vec_mask_g.push_back(m_pBild[i-1][j+1]);
vec_mask_g.push_back(2*m_pBild[i][j-1]);
vec_mask_g.push_back(4*m_pBild[i][j]);
vec_mask_g.push_back(2*m_pBild[i][j+1]);
vec_mask_g.push_back(m_pBild[i+1][j-1]);
vec_mask_g.push_back(2*m_pBild[i+1][j]);
vec_mask_g.push_back(m_pBild[i+1][j+1]);
vec_mask_b.push_back(m_pBild[i-1][j-1]);
vec_mask_b.push_back(2*m_pBild[i-1][j]);
vec_mask_b.push_back(m_pBild[i-1][j+1]);
vec_mask_b.push_back(2*m_pBild[i][j-1]);
vec_mask_b.push_back(4*m_pBild[i][j]);
vec_mask_b.push_back(2*m_pBild[i][j+1]);
vec_mask_b.push_back(m_pBild[i+1][j-1]);
vec_mask_b.push_back(2*m_pBild[i+1][j]);
vec_mask_b.push_back(m_pBild[i+1][j+1]);
GAUSS.ret_Bild()[i][j] = gauss(vec_mask_r); /soll dem roten kanal den neuen //berechneten Wert zuweisen. Analog für die beiden folgenden Zeilen.
GAUSS.ret_Bild()[i][j+1] = gauss(vec_mask_g);
GAUSS.ret_Bild()[i][j+2] = gauss(vec_mask_b); // Funktion zum berechnen //des gauss aufrufen
vec_mask_r.clear();
vec_mask_g.clear();
vec_mask_b.clear();
}
memcpy(m_pBuffer, GAUSS.m_pBuffer, m_width*m_height);
}
// GAUSS - RECHNER
int CImage::gauss(std::vector<int> vec_gauss){
int sum = 0;
for(int i = 0; i < vec_gauss.size() ; ++i)
sum = sum + vec_gauss[i];
return (sum / 16);
}
Ich hoffe der QuellText ist verständlich. Bei Unklarheiten bitte fragen.
Hoffe jemand kann mir auf die Sprünge helfen, danke.
Gut nacht erstmal...