ich brauche für ein Projekt einen 3d gauss filter in c++ ....hat da vll jemand nen code? oder kann man für ein 3d objekt auch einen 2d filter verwenden?
Den in 2d findet man ja hier schon...vll kann man den auch einfach umschreiben nur meiner einer ist dazu leider nicht im stande .
vll kann man den auch einfach umschreiben nur meiner einer ist dazu leider nicht im stande
Dann fang doch einfach schonmal an damit und wenn du dann tatsächlich auf Probleme stößt fragst du im entsprechenden Forum nach. Eine Fertiglösung wirst du hier im Forum wohl kaum einfach vorgesetzt bekommen.
ich brauche für ein Projekt einen 3d gauss filter in c++ ....hat da vll jemand nen code? oder kann man für ein 3d objekt auch einen 2d filter verwenden?
Den in 2d findet man ja hier schon...vll kann man den auch einfach umschreiben nur meiner einer ist dazu leider nicht im stande .
Guck Dir mal die Vigra-Bildverarbeitungsbibliothek an. Die ist ausgesprochen gut und realisiert viele Algorithmen für den allgemeinen Fall von n-dimensionalen Bildern. Einen Gauss-Filter für dreidimensionale Bilder findest Du da auf jeden Fall.
_________________ "The problem with quotes on the Internet is that it is hard to verify their authenticity" - Abraham Lincoln
Zuletzt bearbeitet von Gregor am 12:52:38 26.06.2009, insgesamt 1-mal bearbeitet
Will einen Mittelwertfilter beliebiger Größe separieren, also erst die Zeilen und danach die Spalten durchlaufen. Das ganze ist über Borland c++ geschrieben und hab ne eigene Klasse, die mein geladenes Bild in einen Array des Typs unsigned char. Hier mal der Code:
Image* Image::MWSep(int Maske){
if (Maske % 2 == 0) { //Es sollen nur ungrade Filtergrößen zugelassen werden return 0;
}
int radius = Maske / 2;
int pixel; //Zum Hochzählen
Image* ci = new Image( width, height,format); //2 neue Images angelegt, um das jeweilige Ergebnisbild zu speichern
Image* cj = new Image( width, height,format);
//MW Filter Spalten for (int i = 0; i < chanel; i++) { // Alle Kanäle for (int j = 0; j < height ; j++) { // Alle Zeilen for (int k = 0; k < width ; k++) { // Alle Spalten if(k<radius||k>height-radius){ //Rand bekommt das Ursprungsbild
ci->Data[i][j*width+k]=Data[i][j*width+k];
}
else{
//eigendlicher Mittelwertfilter, über alle Zeilen
pixel = 0;
for(int l=k-radius; l<= k+radius; l++){ //Zeilen
pixel+= Data[i][l*width+j];
}
ci->Data[i][j*width+k]=(double) pixel /Maske + 0.5;
}
}
}
}
//MW Filter Über alle Spalten for (int i = 0; i < chanel; i++) { // Alle Kanäle for (int j = 0; j < height ; j++) { // Alle Zeilen for (int k = 0; k < width ; k++) { // Alle Spalten if(k<radius||k>width-radius){ //Randbehandlung
cj->Data[i][j*width+k]=Data[i][j*width+k];
}
else{
Image* Image::MWSep(int Maske){
if (Maske % 2 == 0) { //Es sollen nur ungrade Filtergrößen zugelassen werden return 0;
}
int radius = Maske / 2;
int pixel; //Zum Hochzählen
Image* ci = new Image( width, height,format); //2 neue Images angelegt, um das jeweilige Ergebnisbild zu speichern
Image* cj = new Image( width, height,format);
//MW Filter Spalten for (int i = 0; i < chanel; i++) { // Alle Kanäle for (int j = 0; j < height ; j++) { // Alle Zeilen for (int k = 0; k < width ; k++) { // Alle Spalten if(k<radius||k>height-radius){ //Rand bekommt das Ursprungsbild
ci->Data[i][j*width+k]=Data[i][j*width+k];
}
else{
//eigendlicher Mittelwertfilter, über alle Zeilen
pixel = 0;
for(int l=k-radius; l<= k+radius; l++){ //Zeilen
pixel+= Data[i][l*width+j];
}
ci->Data[i][j*width+k]=(double) pixel /Maske + 0.5;
}
}
}
}
//MW Filter Über alle Spalten for (int i = 0; i < chanel; i++) { // Alle Kanäle for (int j = 0; j < height ; j++) { // Alle Zeilen for (int k = 0; k < width ; k++) { // Alle Spalten if(k<radius||k>width-radius){ //Randbehandlung
cj->Data[i][j*width+k]=Data[i][j*width+k];
}
else{
Image* Image::MWSep(int Maske){
if (Maske % 2 == 0) { //Es sollen nur ungrade Filtergrößen zugelassen werden return 0;
}
int radius = Maske / 2;
int pixel; //Zum Hochzählen
Image* ci = new Image( width, height,format); //2 neue Images angelegt, um das jeweilige Ergebnisbild zu speichern
Image* cj = new Image( width, height,format);
//MW Filter Spalten for (int i = 0; i < chanel; i++) { // Alle Kanäle for (int j = 0; j < height ; j++) { // Alle Zeilen for (int k = 0; k < width ; k++) { // Alle Spalten if(k<radius||k>height-radius){ //Rand bekommt das Ursprungsbild
ci->Data[i][j*width+k]=Data[i][j*width+k];
}
else{
//eigendlicher Mittelwertfilter, über alle Zeilen
pixel = 0;
for(int l=k-radius; l<= k+radius; l++){ //Zeilen
pixel+= Data[i][l*width+j];
}
ci->Data[i][j*width+k]=(double) pixel /Maske + 0.5;
}
}
}
}
//MW Filter Über alle Spalten for (int i = 0; i < chanel; i++) { // Alle Kanäle for (int j = 0; j < height ; j++) { // Alle Zeilen for (int k = 0; k < width ; k++) { // Alle Spalten if(k<radius||k>width-radius){ //Randbehandlung
cj->Data[i][j*width+k]=Data[i][j*width+k];
}
else{
Also die Performancediskussion ... MMX und SSEx sind wie geschaffen fuer diese Operationen. Auch kann man es direkt auf seiner Grafikkarte ueber Shader realisieren.
Zum geposteten Code: Ich persoenlich finde ihn nicht schoen. Was solls ...
_________________ If it were not for laughter, there would be no Tao.
Sie können einen Beitrag nicht so schnell nach Ihrem letzten absenden, bitte warten Sie einen Augenblick.
Nächstes Thema anzeigen Vorheriges Thema anzeigen
Sie können keine Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums
für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de
Werbekostenerstattung verdient werden kann.
Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de
enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt
(vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in
privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden.
Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere
übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.