Laden...

variable Matrix über Array legen

Erstellt von MarC611 vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.743 Views
M
MarC611 Themenstarter:in
81 Beiträge seit 2009
vor 14 Jahren
variable Matrix über Array legen

Hallo,

ich habe ein Problem und hoffe jemand, dass mir jemand helfen kann. Und Zwar habe ich ein zweidimensionales Array mit bekannter Anzahl an Zeilen und Spalten.

Nun möchte ich über dieses Array eine Matrix legen (zum Beispiel: eine 3x3 oder 5x5 oder 7x7 Matrix). Die Matrix soll anschließend über das ganze Array gehen und jeweils aus den in der Matrix eingeschlossenen Werte den Durchschnitt bilden.

Im Anhang ist ein Bild, da ist das ganze eventuell noch mal deutlicher.

Habe das ganze mal wie folgt versucht aber es funktioniert nicht wirklich.
Es wird nur eine Zeile oder Spalte gemacht.
Falls jemand noch eine Information zur Größe braucht iheight ist 420, iwidth ist 336


public void glaze(byte[] imageContent, int imaxValue, int iheight, int iwidth, int Kernel, String format)		// Kernel soll bei eine 3x3 Matrix zum beispiel 3 sein
		{
			byte[,] zweiArray = zweidimArray(imageContent, iheight, iwidth);		//iheight und iwidth ist Höhe und Breite

			int average = 0;
			byte[] imageContentGlaze;
			imageContentGlaze = new byte[imageContent.Length];
			int Maske = Kernel * Kernel;
			int k = 0;
			int index = 0;
			int l = 0;

			for (int l = 0; l < iwidth; l++)			
			{
				l++;
				average = average + zweiArray[k, l];

				if (l == (Kernel - 1))
				{
					k++;
					l = l - (Kernel);
				}

				if (k == (Kernel + index))	
				{
					k = k - (Kernel - 1);		
					l = 0;
					l = l - 1;

					average = average / Maske;
					imageContentGlaze[index] = System.Convert.ToByte(average);
					index++;
					average = 0;
					
				}

			}
		}

Oder weiß jemand vielleicht einen viel besseren (leichtern) Ansatz?

Gruß Marc

K
62 Beiträge seit 2009
vor 14 Jahren

Ohne jetzt deinen ganzen Ansatz komplett nachvollzogen zu haben, scheinen mir da doch einige Ungereimtheiten drin zu sein.

Zum einen benutzt du eine lokale Variable l sowie l als Index für die for-schleife. Abgesehen davon das sich der Code so nicht kompilieren lässt, ist so auch nicht ganz nachzuvollziehen welches l wann genutzt werden soll.

Soll die Matrix über das gesamte 2-dimensionale Array laufen, sind wohl auch zwei verschachtelte for-schleifen angebracht, im Moment durchläufst Du ja nur einmal die Breite deines Arrays (wobei Du dann auch noch in jedem Schritt nur einen Wert deiner Matrix hinzurechnest).

Falls ich dich nicht ganz missverstanden habe, möchtest Du z.B. eine 3x3 Matrix von oben links über alle Spalten/Zeilen wandern lassen und jeweils den Mittelwert der 9 Werte berechnen.

Das könnte dann so in diese Richtung aussehen.


// zweidimensionales Array durchlaufen
for (int y=0; y<hoehe-matrixHoehe; ++y) {
  for (int x=0; x<breite-matrixBreite; ++x) {
    // Die Matrix an sich durchlaufen
    for (int ym=0; ym<matrixHoehe; ++ym) {
      for (int xm=0; xm<matrixBreite; ++xm) {
          // Wert aus dem Array
          zweiDim[x+xm, y+ym]
       }
      }
    }
  }
}

So würdest Du zumindest schon mal das gesamte Array durchlaufen und die Werte "über denen deine Matrix momentan liegt" bekommen.

1.130 Beiträge seit 2007
vor 14 Jahren

warum umständlich, wenns einfach geht?


T[] ExtractArray<T>(T[,] array,xstart,ystart,width,height)
{
T[,] result=new T[width,height]
for(int y=0;y<height;y++)
for(int x=0;x<width;x++)
{
result[x,y]=array[x+xstart,y+ystart];
}
return result;
}

Projekte:Jade, HttpSaver
Zum Rechtschreiben gibts doch schon die Politiker. Aber die bauen auch nur mist!

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo MarC611,

siehe auch LowLevelGraphicsLibrary: Neighbouring Modell

herbivore

M
MarC611 Themenstarter:in
81 Beiträge seit 2009
vor 14 Jahren

Hallo,

erst einmal danke für Eure bisherige Hilfe.

Ich habe die Version von Kileak ausprobiert und das ganze sieht jetzt so aus:


int index = 0;
			int index1 = 0;
			int anzahlFelder = Kernel * Kernel;
			int average = 0;


			//zweidimensionales Array durchlaufen
			for (int y = 0; y <= iheight - Kernel; ++y)
			{
				for (int x = 0; x <= iwidth - Kernel; ++x)
				{
					// Die Matrix an sich durchlaufen
					for (int ym = 0; ym < Kernel; ++ym)
					{
						for (int xm = 0; xm < Kernel; ++xm)
						{
							// Wert aus dem Array
							//byte test = zweiArray[x + xm, y + ym];
							byte test = zweiArray[y + ym, x + xm];

							average = average + System.Convert.ToInt16(test);

							index1++;

							if (index1 == anzahlFelder)
							{
								average = average / anzahlFelder;

								ausgabeArray[index] = System.Convert.ToByte(average);
								index1 = 0;
								average = 0;
								index++;
							}
						}
					}
				}
			}

Das Problem ist allerdings, dass ich so noch nicht alle Werte bekomme da die Randwerte fehlen.
Das heißt die die Matrix muss also zum Beispiel weiter nach rechts (über den Rand laufen) um alle Werte zu bekommen.
Das heißt ich habe in meinem Ausgabe Array weniger Werte als in meinem ursrünglichen zweidimensionalem Array.

Das gleiche gilt auch für die Höhe.

Ich habe paar Möglichkeiten ausprobiert jedoch bisher noch ohne Erfolg.

Hat jemand einen Vorschlag oder ne Idee wie ich das lösen könnte?

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo MarC611,

tue so, als wäre das Ausgangs Array an den Kanten und Ecken gespiegelt. Dann kannst du auch an den Kanten und Ecken genauso viele Werte zusammenrechnen, wie im inneren.

herbivore