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 ]
030
01.09.2003, 23:24 Uhr
Pablo
Supertux
(Operator)


Ich bin ja so blöd, ich hab x und y vertauscht, deshalb hat es nicht funktioniert
ich hatte pic[y+x*ydim], wo habe ich nur meinen Kopf!!!
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
031
03.09.2003, 14:56 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


und Pablo willst du noch probieren oder soll ich auflösen?
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
032
03.09.2003, 15:48 Uhr
Pablo
Supertux
(Operator)


Nein, noch nicht. Ich hatte gestern keine Zeit, weil ich was naderes machen musste. Wenn ich bis heute Nacht nichts gepostst habe, dann kannst du den Fall auflösen.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
033
03.09.2003, 16:10 Uhr
Pablo
Supertux
(Operator)


vorläufig:

hier sind die Ränder gar nicht mitgezählt:

C++:
int _filter[] ={1,0,1,0,-4,0,1,0,1};
void filter(int* picture,int xdim, int ydim){
  int newpixel;
  for(int y=1; y<ydim-1; ++y) { // Alles außer Rand.
    for (int x=1; x<xdim-1; ++x) {
      newpixel = _filter[0]*Pixel(picture, x-1,y-1,xdim) + _filter[1]*Pixel(picture, x,y-1,xdim) +_filter[2]*Pixel(picture, x+1,y-1,xdim)
    + _filter[3]*Pixel(picture, x-1,y,xdim) + _filter[4]*Pixel(picture, x,y,xdim) +_filter[5]*Pixel(picture, x+1,y,xdim)
    + _filter[6]*Pixel(picture, x-1,y+1,xdim) + _filter[7]*Pixel(picture, x,y-1,xdim) +_filter[8]*Pixel(picture, x+1,y+1,xdim);
      picture[x+y*xdim] = newpixel;
    }
  }
}



Irgendie geht das gar 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
034
03.09.2003, 16:18 Uhr
Pablo
Supertux
(Operator)


das wäre meine endgültige Lösung, sie funz aber net.


C++:
int _filter[] ={1,0,1,0,-4,0,1,0,1};
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;
  for(int y=0; y<ydim-1; ++y) { // Alles außer Rand.
    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);
      picture[x+y*xdim] = newpixel;
    }
  }
}


--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
035
03.09.2003, 16:28 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


als erstes würde ich mir deine Pixelfunktion schenken und das so machen

C++:
void filter(int* picture,int xdim, int ydim){
  for(int y=1; y<ydim-1; ++y)  // Alles außer Rand.
    for (int x=1; x<xdim-1; ++x)
      picture[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];
}



an sonsten hast du noch das transformieren auf den wertebereich zwischen 0..255 vergessen
ach ja und funzen kann deins nicht richtig weil du die alten werte ja gleich überschreibst, du brauchst ein neues array zum zwischenspeichern

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);    

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

}


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

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


wenn du lustig bist kannst du auch noch andere filter über das bild jagen


C++:
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 12  //was auch immer für ne constante
int filter[] ={-1,2,-1,-2,12+c,-2,-1,2,-1};  //laplace-binominalfilter


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


Das habe ich mir bereits überlegt, dass ich ein zweites brauche. Aber wenn ich mit new das neue Array erstellen, dann muss ich beim Verlassen der Funktion delete [] aufrufen, und dann kann ich nicht mehr picture = newpicture machen, oder doch?

Wie wäre es damit?

C++:
int* newpic;
newpic = new int[xdim*ydim];
...
picture = newpic;
delete [] newpic;



Wird dann picture auch gelöscht, oder 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
038
03.09.2003, 16:40 Uhr
Pablo
Supertux
(Operator)


Ich werde verrückt: ich hab das mit dem newpic gemacht, aber die Output Date sieht gleich aus, 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
039
03.09.2003, 16:43 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


wie du an meiner funktion siehst geht das weil du ja nur den speicherbereich löscht auf den newpic zeigt und nicht den auf den picture zeigt.

allerdings darfst du diese zeile auf gar keinen fall machen

C++:
picture = newpic;



um picture auf newpic zeigen zu lassen müsstest du den pointer auch als referenz übergebn, das sonst nur der pointer vom stack drauf zeigt der danach ja gelöscht wird. vorher müsstest du den speicher von picture löschen

ich habs jetzt nicht getestet aber wenn ich keinen denkfehler gemacht habe müsstest du das auch so machen können;


C++:
void filter(int* &picture,int xdim, int ydim){
int* newpic;
newpic = new int[xdim*ydim];
...
delete [] picture;
picture = newpic;



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

Dieser Post wurde am 03.09.2003 um 16:44 Uhr von Windalf editiert.
 
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: