for Schleifen und MAtrizen Fragen



  • Danke fuer dein ANtwort ,eine Frage habe ich noch was Matrizen angeht?

    Sagen wir ich habe einen 5*5 Matrix,
    was bedeutet dann dieser Schleife:
    for(i=-1; i<5-1; i++)
    for(j=-1 j<5-1; j++)
    {Anweisungen}

    und dann will ich einen 3*3 MAtrix A=1,1,1
    1,1,1
    1,1,1
    auf jeden passenden 3*3 Flaeche auf den 5*5 MAtrix anwenden,der zum Beispiel
    alle 3*3 Spalten/Zeilen Elementen addiert bzw. multipliziert und dann einen Mittelwert daraus produziert,der seinerseits auf das (1,1) Pixel des 5*5 Matrixs geschrieben werden soll?
    Koenntest du mir sagen ,wie man im Allgemeinen vorgeht,oder welcher Gedanken
    dahinter steht?(Es geht um Faltung endeffekt aber ich habe ein paar Schwierigeiten das in meiner Kopf zu realisieren?Ich moechte nicht denAlgorithmus,wie das geht ,aber nur die gesamte Ueberlegung ,wenn das moeglich ist !!

    d.h es geht aus dem Rand des MAtrixs raus,aber wenn es so ist warum wird so was benutzt? Ich meinewenn es auf einen undefinierten Berech hinaus geht ?
    Kilomat
    Danke



  • Hallo,

    zu dem ersten mit den schleiffen man kann doch nicht auf -1 zugreifen das muss do weren des proramm ablaucfs zu speicherfälern füren oder?

    das zweite habe ich so festanden das du [0][0] bis [2][2] addiren/multiplizierten wilst und dan in [0][0] von der 5*5 matrex speicher möchtest. ist das richtig?

    MFG TaccoGo



  • Ja so sit Richtig es muss nicht (o,o) sein sondern ein beliebiges Pixel in dieser Matrix unter derVoraussetzung dass in dem Bereich ist,in dem der 3*3 Matrix angewendet wurde!

    Was deine erste BEmerkung angeht ,glaube ich nicht das es Speicherfehler kommt solange man nicht auf dieser Bereich etwas tut/schreibt,weil man will diesen 3*3 Matrix auf 1 auessere Raendern der 5*5 Matrix anwenden!Im Fall dass es ausgeht (if i-m<0 --> tue nichts).Ich meine ,ich habe es so verstanden!Das ist der Fall wenn man verschieden Filter (Soebel,Prewit) usw auf Bilder anwenden will und einen durch ein FIlter(MAtrix 3*3) bestimmte Eigenschaften der Objekte aud den Bilder herausfiltern bzw unterdruecken will!Z.B Zeig mir alle horizontale Kanten oder vertikalle ,und wenn ja dann so dass man sie erkennen kann(Grauwertstufe erhoehen/erniedrigen.
    Danke
    Kilomat



  • ok wen man nicht schriebt aber -1 gehört nicht mer zum feld als stet da speicher mull.

    das ander über denke ich dan beim essen wiel jetzt kleich mittagspause ist.

    MFG TaccoGo



  • wie das in etwa geht hab ich dir doch schon hier gepostet...http://www.c-plusplus.net/forum/viewtopic.php?t=88942

    was verstehst du denn daran nicht?



  • also das mit den 3*3 feld berechnen macht man ja in einer geschachtelten for-schleiffe und das speichern in das 5*5 wider. also insgesamt 4 ferschahtlungen.

    aber wo in der 5*5 das ergebnis aus der 3*3 hinkomt hab ich nicht gans ferstanden.



  • Im zentralen Pixel von 3*3 Matrix aber dann entsprechend ,z.b in dr oberen Ecke des 5*5 Matrix.

    ------------
    | | | |
    ------------
    --------------------
    | | X | | | | |
    --------------------
    --------------------
    | | | | | | |
    --------------------
    ----------------
    | | | | | |
    ----------------
    ----------------
    | | | | | |
    ----------------
    ----------------
    | | | | | |
    ----------------

    Grosse Matrix 5*5 oben links 3*3 und wird der Matrix immer verschoben(rechts) und deswegen muss man auch dieses Minus benutzen denn es muss von der ausseren Rand anfangen



  • na du brauchst dir das doch quasi nur mal auf nem karierten DIN A Blatt aufzumalen
    nehmen wir mal nochmal den bespielcode den ich gepostet habe

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

    so das mit dem f_dim2/2 ist nur um am rand keine probleme zu bekommen... nehmen wir mal an wir haben eine 3x3 matrix... dan ist f_dim/2 1 da abgerundet wird...

    wir haben also dann keine probleme diese 3x3 matrix durchs bild zu jagen wenn wir von j=1 bis j<y-1 laufen lassen... analog für x...

    so nehmen wir mal das konkrete pixel x=5 und y=7 aus einem belibigen bild...

    bleiben dann in dem fall noch die beiden inneren schleifen übrig..

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

    so k gibt die aktuelle spalte der filtermatrix an und l die akutelle zeile...

    der neue wert des pics an der stelle (du musst natürlich einen zwischenspeicher nehmen weil du sonst schon werte über schreibst du du noch später zum rechnen brauchst) x=5 und y=7 ist im falle der verwendung der 3x3 matrix f wie folgt...

    pixel (x=4, y=6)*filter(0,0) + pixel(5,6) * filter(1,0) usw... bis pixel (6,8)*filter(2,2)...

    nd das ganze wird in der zeile zugewiesen...

    filterbuffer[i+j*x]+= pic[i-f_dim/2+l + (j-f_dim/2+k)*x] * f[l+f_dim*k];
    

    i+j*x //das aktuelle pixel...

    i-1+ l das ist der x wert des jeweilgen pixel
    j-1 +k das ist der y wert des jeweiligen pixel (multipliziert mit x weil zeilenweise gespiechert)

    so und diesen pixelwert mit dem filter f gewichtet wird draufaddiert... fertig ist der ganze spass... jetzt kannst du natürlich mittelwert bilden... ich hab da das ganze auf min und maxwert neu skaliert.. mittelwert bilden ist vermutlich einfacher...



  • JEtzt habe ich das verstanden!
    Ich bedanke mich !Sehr gut erklaert!
    Eine Frage noch ,kennst ein BUch/Skript/Tutorium ,das mit solchen Themen beschaeftigt oder etwas aehnliches womit ich meine Kenntnissen mit solchen
    Berechnungen etwa vertiefen kann!Ich meine ich habe zwar ein paar Buecher uebe C gelesen aber nirgends kommt so was vor(Gut was Matrizen angeht gipt es ,aber wieder nicht immer so klar).Oder deiner Meinung nach womit sollte ich mich mehr oder weniger beschaeftigen?Meinst du dass die Buecher ueber C ausreichen?
    Danke
    kilomat



  • keine ahnung ich kenn mich mit büchern nicht aus... das einzige was ich mir vor kurzem geleistet habe war des stroustrup an sonsten hab ich mir das nur mit dumm fragen in foren oder tutoriels beigebracht... auch bietet das internet so schon fast alles wenn man google fragt so das sich die frage buch (wo ich dann 50 Euronen hinlege für eigentlich nur 10 Seiten die ich haben will, weil ich den rest nicht brauch) nie gestellt hat...

    sowas hat auch weniger mit buch zu tun als einfach nur mit logischen denken. Ich glaub nicht das dir sowas ein buch einfach beibringen kann... du musst einfach mal versuchen wenn du nicht auf anhieb dahintersteigst wie du es dem kompiler in c sagst dir das aufzumalen und an konkreten fallbeispielen durchzuspielen dann kommt man meist auch reatliv leicht auf den c-code...


Anmelden zum Antworten