Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » Bildfilter

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] [ 2 ] [ 3 ] [ 4 ] > 5 < [ 6 ]
040
03.09.2003, 16:44 Uhr
Pablo
Supertux
(Operator)



C++:
void filter(int* picture,int xdim, int ydim){
  int* newpic;
  newpic = new int[xdim*ydim];
  for(int y=0; y<ydim-1; ++y)
    for (int x=0; x<xdim-1; ++x)
      newpic[x+y*xdim] = _filter[0]*picture[x-1+(y-1)*xdim] + _filter[1]*picture[x+(y-1)*xdim] +_filter[2]*picture[x+1+(y-1)*xdim]
    + _filter[3]*picture[x-1+y*xdim] + _filter[4]*picture[x+y*xdim]+ _filter[5]*picture[x+1+y*xdim]
    + _filter[6]*picture[x-1+(y+1)*xdim] +  _filter[7]*picture[x+(y-1)*xdim] + _filter[8]*picture[x+1+(y+1)*xdim];
  picture = newpic;
  delete [] newpic;
}



Das ändert gar nicht. Die Output Datei ist gleich wie die Input Datei.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
041
03.09.2003, 16:45 Uhr
Pablo
Supertux
(Operator)


Als Referenz? Das ist mir ja ganz neu, in C hätte ich sowas nie machen müssen. Jetzt verstehe ich wieso die Ausgabe sich nicht ändert.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
042
03.09.2003, 16:48 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


das wäre dann die version die du machen wolltest
ist ne ganz gute idee weil man sich das kopieren am ende spart

C++:
void filter(int* &picture,int xdim, int ydim){
int i,j,k,l;
int minwert,maxwert;
int *temp;

    temp = new int[xdim*ydim];

    for(j=0;j<ydim;j++){
        for(i=0;i<xdim;i++){
            temp[i+j*xdim]=0;
            for(k=j?0:1;k<(ydim-1-j?3:2);k++){
                for(l=i?0:1;l<(xdim-1-i?3:2);l++){
                    temp[i+j*xdim]+= picture[i-1+l + (j-1+k)*xdim] * laplacefilter[l+3*k];
                }
            }
        }
    }


    maxwert=minwert=temp[0];
    for(i=0;i<xdim*ydim;i++){
        if(maxwert<temp[i])maxwert=temp[i];
        if(minwert>temp[i])minwert=temp[i];
    }
    
    for(i=0;i<xdim*ydim;i++)
        if(maxwert==minwert) temp[i]=0;
        else temp[i]=(temp[i]-minwert)*256/(maxwert-minwert);    

    delete [] picture;
    //for(i=0;i<xdim*ydim;i++)picture[i]=temp[i]; //das hier kann man sich sparen
    picture = temp;
}


--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 03.09.2003 um 16:48 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
043
03.09.2003, 16:49 Uhr
Pablo
Supertux
(Operator)


Ich kann das nicht kompilieren:

bild.cpp: In function `int main()':
bild.cpp:145: call of overloaded `filter (int *&, int &, int &)' is ambiguous
bild.cpp:7: candidates are: void filter(int *, int, int)
bild.cpp:107: void filter(int *&, int, int)


Mein Aufruf:
filter(picture, xdim,ydim);
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 03.09.2003 um 16:49 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
044
03.09.2003, 16:51 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


kommentier mal alle funktion die filter heissen aus ausser der die du benutzen willst
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
045
03.09.2003, 16:55 Uhr
Pablo
Supertux
(Operator)


Ich benutze nur eine Funktion. Wenn ich aber filter(picture, xdim,ydim); kommentiere, dann bekomme ich den Fehler nicht.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
046
03.09.2003, 16:57 Uhr
Pablo
Supertux
(Operator)


Ich bin ja so blöd, ich hab den Prototyp nicht geändert.

--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 03.09.2003 um 16:58 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
047
03.09.2003, 16:59 Uhr
Pablo
Supertux
(Operator)


Diesesmal hat schon was geändert aber nicht wie das Bild, das du mir geschickt hast.

Und meine Funktion mit den Pixels tut dasselbe.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 03.09.2003 um 17:00 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
048
03.09.2003, 17:04 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


poste mal deinen komplette code sonst kann ich nichts dazu sagen
bei mir funzt das alles wunderbar

oder warte ich poste gleich mal meinen kompletten krempel probier mal damit

C++:
#include <iostream>
using namespace std;

int* bmp2raw(char* bmp_filename){
FILE *fp=fopen(bmp_filename,"rb");
int *raw_data;
int xdim,ydim,i,j;

fseek(fp,10,SEEK_CUR);
j=fgetc(fp);
j+=fgetc(fp)*256;
j+=fgetc(fp)*256*256;
j+=fgetc(fp)*256*256*256;
fseek(fp,4,SEEK_CUR);
xdim=fgetc(fp);
xdim+=fgetc(fp)*256;
xdim+=fgetc(fp)*256*256;
xdim+=fgetc(fp)*256*256*256;
ydim=fgetc(fp);
ydim+=fgetc(fp)*256;
ydim+=fgetc(fp)*256*256;
ydim+=fgetc(fp)*256*256*256;
raw_data= new int[xdim*ydim];
fseek(fp,j-26,SEEK_CUR);
for(j=ydim-1;j>=0;j--){
    for(i=0;i<xdim;i++){
        raw_data[i+j*xdim]=fgetc(fp);
    }
}
fclose(fp);
return raw_data;
}



void raw2bmp(int* raw_data,char* bmp_filename, int xdim, int ydim){
FILE *fp;
int i,j;
fp=fopen(bmp_filename,"wb");
i=xdim*ydim + 4*256 + 54;        //Dateilaenge ermitteln

//Datei-Header schreiben

    fputc(66,fp);fputc(77,fp);    //Magic Number
    
    j=i%256;                        fputc(j,fp);    //Dateilaenge                        
    j=(i%(256*256))/256;            fputc(j,fp);
    j=(i%(256*256*256))/(256*256);    fputc(j,fp);
    j=i/(256*256*256);                fputc(j,fp);

    fputc(0,fp);fputc(0,fp);fputc(0,fp);fputc(0,fp);//4 reservierte Byts
    
    fputc(54,fp);fputc(4,fp);fputc(0,fp);fputc(0,fp);//Zeiger auf Datenanfang

//Format-Header schreiben
    
    fputc(40,fp);fputc(0,fp);fputc(0,fp);fputc(0,fp);//Format-Header-Laenge
    
    j=xdim%256;                            fputc(j,fp);    //Bildbreite                        
    j=(xdim%(256*256))/256;                fputc(j,fp);
    j=(xdim%(256*256*256))/(256*256);    fputc(j,fp);
    j=xdim/(256*256*256);                fputc(j,fp);

    j=ydim%256;                            fputc(j,fp);    //Bildhoehe                        
    j=(ydim%(256*256))/256;                fputc(j,fp);
    j=(ydim%(256*256*256))/(256*256);    fputc(j,fp);
    j=ydim/(256*256*256);                fputc(j,fp);
    
    fputc(1,fp);fputc(0,fp);                //Anzahl der Ebenen

    fputc(8,fp);fputc(0,fp);                //Bits pro Pixel

    fputc(0,fp);fputc(0,fp);fputc(0,fp);fputc(0,fp);    //Kompression
                
    i=xdim*ydim;
    j=i%256;                        fputc(j,fp);    //Groesse der Pixeldaten                        
    j=(i%(256*256))/256;            fputc(j,fp);
    j=(i%(256*256*256))/(256*256);    fputc(j,fp);
    j=i/(256*256*256);                fputc(j,fp);

    fputc(0,fp);fputc(0,fp);fputc(0,fp);fputc(0,fp);    //x-Auflösung(in Pixel pro Meter)    
    
    fputc(0,fp);fputc(0,fp);fputc(0,fp);fputc(0,fp);    //y-Auflösung(in Pixel pro Meter)

    fputc(0,fp);fputc(0,fp);fputc(0,fp);fputc(0,fp);    //Anzahl genutzter Farben
    
    fputc(0,fp);fputc(0,fp);fputc(0,fp);fputc(0,fp);    //Anzahl wichtiger Farben

    for(i=0;i<256;i++){fputc(i,fp);fputc(i,fp);fputc(i,fp);fputc(0,fp);}
    
    for(j=ydim-1;j>=0;j--){
        for(i=0;i<xdim;i++){
            fputc(raw_data[i+j*xdim],fp);
        }
    }
    fclose(fp);
}


int laplacefilter[] ={1,0,1,0,-4,0,1,0,1};

void filter(int* picture,int xdim, int ydim){
int i,j,k,l;
int minwert,maxwert;
int *temp;

    temp = new int[xdim*ydim];

    for(j=0;j<ydim;j++){
        for(i=0;i<xdim;i++){
            temp[i+j*xdim]=0;
            for(k=j?0:1;k<(ydim-1-j?3:2);k++){
                for(l=i?0:1;l<(xdim-1-i?3:2);l++){
                    temp[i+j*xdim]+= picture[i-1+l + (j-1+k)*xdim] * laplacefilter[l+3*k];
                }
            }
        }
    }


    maxwert=minwert=temp[0];
    for(i=0;i<xdim*ydim;i++){
        if(maxwert<temp[i])maxwert=temp[i];
        if(minwert>temp[i])minwert=temp[i];
    }
    
    for(i=0;i<xdim*ydim;i++)
        if(maxwert==minwert) temp[i]=0;
        else temp[i]=(temp[i]-minwert)*256/(maxwert-minwert);    

    for(i=0;i<xdim*ydim;i++)picture[i]=temp[i];
    delete [] temp;

}

int main(){
int xdim,ydim,*pic;
xdim=1392;
ydim=1040;
pic=bmp2raw("test.bmp");

filter(pic,xdim,ydim);
raw2bmp(pic,"filterpic.bmp",xdim,ydim);

return 0;
}


--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
049
03.09.2003, 17:11 Uhr
Pablo
Supertux
(Operator)



C++:
#include <iostream>
#include <stdio.h>
using namespace std;

//int _filter[] ={1,0,1,0,-4,0,1,0,1};
//int _filter[] ={1,1,1,1,1,1,1,1,1}; //glättungsfilter
//int _filter[] ={-1,-1,-1,0,0,0,1,1,1}; //gradientenfilterx
//int _filter[] ={-1,0,1,-1,0,1,-1,0,1}; //gradientenfiltery
//int _filter[] ={1,2,1,0,0,0,-1,-2,-1}; //sobelfilterx
//int _filter[] ={-1,0,1,-2,0,-2,-1,0,-1}; //sobelfiltery
int _filter[] ={1,2,1,2,4,2,1,2,1};//binominalfilter
#define c 120
//int _filter[] ={-1,2,-1,-2,12+c,-2,-1,2,-1};  //laplace-binominalfilter


void filter(int* &picture,int xdim, int ydim);

int* bmp2raw(char* bmp_filename, int& xdim, int& ydim){
  FILE *fp=fopen(bmp_filename,"rb");
  int *raw_data;
  int i,j;
  
  fseek(fp,10,SEEK_CUR);
  j=fgetc(fp);
  j+=fgetc(fp)*256;
  j+=fgetc(fp)*256*256;
  j+=fgetc(fp)*256*256*256;
  fseek(fp,4,SEEK_CUR);
  xdim=fgetc(fp);
  xdim+=fgetc(fp)*256;
  xdim+=fgetc(fp)*256*256;
xdim+=fgetc(fp)*256*256*256;
ydim=fgetc(fp);
ydim+=fgetc(fp)*256;
ydim+=fgetc(fp)*256*256;
ydim+=fgetc(fp)*256*256*256;
raw_data= new int[xdim*ydim];
fseek(fp,j-26,SEEK_CUR);
for(j=ydim-1;j>=0;j--){
   for(i=0;i<xdim;i++){
     raw_data[i+j*xdim]=fgetc(fp);
   }
}
fclose(fp);
return raw_data;
}

void raw2bmp(int* raw_data,char* bmp_filename, int xdim, int ydim){
  FILE *fp;
  int i,j;
  fp=fopen(bmp_filename,"wb");
  i=xdim*ydim + 4*256 + 54;        //Dateilaenge ermitteln
  
  //Datei-Header schreiben
  
  fputc(66,fp);fputc(77,fp);    //Magic Number
  
  j=i%256;                        fputc(j,fp);    //Dateilaenge                        
  j=(i%(256*256))/256;            fputc(j,fp);
  j=(i%(256*256*256))/(256*256);    fputc(j,fp);
  j=i/(256*256*256);                fputc(j,fp);
  
  fputc(0,fp);fputc(0,fp);fputc(0,fp);fputc(0,fp);//4 reservierte Byts
  
  fputc(54,fp);fputc(4,fp);fputc(0,fp);fputc(0,fp);//Zeiger auf Datenanfang

  //Format-Header schreiben
  
  fputc(40,fp);fputc(0,fp);fputc(0,fp);fputc(0,fp);//Format-Header-Laenge
  
  j=xdim%256;                            fputc(j,fp);    //Bildbreite                        
  j=(xdim%(256*256))/256;                fputc(j,fp);
  j=(xdim%(256*256*256))/(256*256);    fputc(j,fp);
  j=xdim/(256*256*256);                fputc(j,fp);
  
  j=ydim%256;                            fputc(j,fp);    //Bildhoehe                        
  j=(ydim%(256*256))/256;                fputc(j,fp);
  j=(ydim%(256*256*256))/(256*256);    fputc(j,fp);
  j=ydim/(256*256*256);                fputc(j,fp);
  
  fputc(1,fp);fputc(0,fp);                //Anzahl der Ebenen
  
  fputc(8,fp);fputc(0,fp);                //Bits pro Pixel
  
  fputc(0,fp);fputc(0,fp);fputc(0,fp);fputc(0,fp);    //Kompression
  
  i=xdim*ydim;
  j=i%256;                        fputc(j,fp);    //Groesse der Pixeldaten                        
  j=(i%(256*256))/256;            fputc(j,fp);
  j=(i%(256*256*256))/(256*256);    fputc(j,fp);
  j=i/(256*256*256);                fputc(j,fp);
  
  fputc(0,fp);fputc(0,fp);fputc(0,fp);fputc(0,fp);    //x-Auflösung(in Pixel pro Meter)    
  
  fputc(0,fp);fputc(0,fp);fputc(0,fp);fputc(0,fp);    //y-Auflösung(in Pixel pro Meter)
  
  fputc(0,fp);fputc(0,fp);fputc(0,fp);fputc(0,fp);    //Anzahl genutzter Farben
  
  fputc(0,fp);fputc(0,fp);fputc(0,fp);fputc(0,fp);    //Anzahl wichtiger Farben
  
  for(i=0;i<256;i++){fputc(i,fp);fputc(i,fp);fputc(i,fp);fputc(0,fp);}
    
  for(j=ydim-1;j>=0;j--){
    for(i=0;i<xdim;i++){
      fputc(raw_data[i+j*xdim],fp);
    }
  }
  fclose(fp);
}

int Pixel(int* picture,int x, int y,int xdim, int ydim)
{
  if (x<0 || y <0 || x > xdim - 1 || y > ydim -1) return 0;
  return picture[x+y*xdim];
}

void filter(int* &picture,int xdim, int ydim){
  int newpixel;
  int* newpic;
  newpic = new int[xdim*ydim];
  for(int y=0; y<ydim-1; ++y) {
    for (int x=0; x<xdim-1; ++x) {
      newpixel = _filter[0]*Pixel(picture, x-1,y-1,xdim,ydim) + _filter[1]*Pixel(picture, x,y-1,xdim,ydim) +_filter[2]*Pixel(picture, x+1,y-1,xdim,ydim)
    + _filter[3]*Pixel(picture, x-1,y,xdim,ydim) + _filter[4]*Pixel(picture, x,y,xdim,ydim) +_filter[5]*Pixel(picture, x+1,y,xdim,ydim)
    + _filter[6]*Pixel(picture, x-1,y+1,xdim,ydim) + _filter[7]*Pixel(picture, x,y-1,xdim,ydim) +_filter[8]*Pixel(picture, x+1,y+1,xdim,ydim);
      newpic[x+y*xdim] = newpixel;
    }
  }
  picture = newpic;
  //delete [] newpic;
}

int main(int argc, char** argv)
{
  int* pic;
  if (argc < 3) {
    cout << "usage: "  << argv[0] << " [input file] [output file]\n";
    return 0;
  }
  int xdim, ydim, *picture;
  picture = bmp2raw(argv[1], xdim, ydim);
  filter(picture, xdim,ydim);
  raw2bmp(picture, argv[2], xdim,ydim);
}


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] [ 2 ] [ 3 ] [ 4 ] > 5 < [ 6 ]     [ Rätselecke ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: