Martrizen auf Matrizen



  • Hallo an allen ,ich will auf einen z.b(500*500) Matrix einen 3*3 oder 55 anwenden!Z.b -1 0 -1
    -1 0 -1
    -1 0 -1 (passend und dann verschieben usw..)
    Der 500
    500 Matrix hat natuerlich an jeder Stelle bestimmten Werte!(Gefuellt)´
    Der 3*3 muss an jeder 3*3 oassende Stelle der 500*500 Matrix angewendet werden z.b Multiplikation der Elemente(entsprechen einen 3*3 Teil aus der 500*500 Matrix ,einen Mittelwert machen und den Mittelewert in der mittleren Element des 500*500 Matrix reinschreiben!!Es ist w´etwaas unverstaendlicher was ich schreibe aber wenn jemand weiss was ich damit meine ,wuerde ich mich freuen auf sein Antwort!! Ich kann es leider nicht besser erklaeren!ODer ich habe einen Filter(3*3 Matrix) den ich auf einen Bild anwende muss ,um aus dem Bild die Stoerungen die er hat herausfiltern!!
    Danke



  • hab ich nicht ganz verstanden... was willst du machen?
    meinst du ne Faltung?...



  • Nein ein Filter FUnktion in Form einer Matrix(3*3 oder 5*5) auf einen Bild anwenden und entsprechend die betroffene Pixel aendern!Ich wollte eigentlich wissen wie man es mit der for Schleifen machen wurde:

    for( i=0; i<Im->Cols; i++)
    for(j=0; j<Im->Rows; j++)
    {
    for(k=0; k<3; k++) //Matrix anwenden!!
    for(l=0 l<3; l++)
    { ANweisungen;
    }
    So ungefähr!!



  • also doch falten 😃 ...

    hmm ohne das zu testen würd ichs spontan so in der art machen...

    sagen wir mal wir haben ein 8 bit picture zeilenweise in einem unsigend char array und wollen ne quadratische matrix (mit ungerader dimension) rüberjagen...
    der filter ist auch ein in einem eindimensional zeilenweise gespeichertes array

    void filter_pic(unsigned char *pic, int x,int y,int* f,int f_dim){
    
      int i,j,k,l;
      int minwert,maxwert;
      int *filterbuffer;
    
      filterbuffer=new int[x*y]; //zwischenspeiher für die bildberechnung allokieren
    
      memset(filterbuffer,0,x*y*sizeof(int)); //speicher auf 0 setzen
      //bild mit filtermatrix falten ,der rand wird hier mal unberücksichtigt gelassen wenn nicht sich selber was ausdenken was mit dem rand gemacht werden soll
      for(j=f_dim/2;j<y-f_dim/2;++j)
        for(i=f_dim/2;i<x-f_dim/2;++i)
          for(k=0;k<f_dim;++k)
            for(l=0;l<f_dim;++l)
              filterbuffer[i+j*x]+= pic[i-f_dim/2+l + (j-f_dim/2+k)*x] * f[l+f_dim*k];
      //max und min ermitteln
      maxwert=minwert=filterbuffer[f_dim/2 + x*(f_dim/2)];
      for(j=f_dim/2;j<y-f_dim/2;++j)
        for(i=f_dim/2;i<x-f_dim/2;++i){
          if(maxwert<filterbuffer[i+j*x])maxwert=filterbuffer[i+j*x];
          if(minwert>filterbuffer[i+j*x])minwert=filterbuffer[i+j*x];
        }		}
    
      //bild auf 0 bis 255 skalieren...
      if(maxwert!=minwert)
      for(i=0;i<x*y;++i)
        pic[i]=(int)( (filterbuffer[i]-minwert)*255 /(maxwert-minwert) + 0.5);
    
      delete [] filterbuffer;
    }
    


  • ups hab mittendrin ganz vergessen das es ansi-c war...
    also das new und delete noch durch malloc und free ersetzen...


Anmelden zum Antworten