Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

c# Histogram

Empfohlene Antworten

Veröffentlicht

Hallo liebe Community!

Ich möchte in C# ein Histogram erstellen, dass den Farbverlauf (rot, gelb, blau ; jeweils einzeln) von dunkel zu hell darstellt. Dies soll auf Grundlage eines Fotos passieren.

Mir fehlt der richtige Ansatz bzw. Vorgehensweise.:confused:

Könnt ihr mir helfen?

Danke schonmal!

Moin!

Der Ansatz sollte von Dir kommen.

Hier mal ein paar Anstöße:

1.) Wie willst Du die Daten für die Histogramme sammeln?

2.) Was musst Du vor dem Sammeln mit dem Bild tun?

3.) Was musst Du tun um aus einem Bild (oder einer beliebiegen Menge an Werten) ein Histogramm zu erstellen?

Falls Du noch Fragen hast, nachdem Du Dir die o.g. Punkte beantwortet hast, einfach fragen.

  • Autor

Vielen Dank für die Antworten!

@Goulasz : Klar, ich hab auch einige Dinge beim googlen gefunden. Diese verstehe ich aber nicht sonst würde ich hier nciht fragen;)

@Pointerman : 1) Die Daten sollten ja im besten in Arrays gespeichert werden.

2) Das Bild muss ja erstmal gelesen werden

3) Weiß ich leider nicht.

Die Grundideen hab ich jetzt. Nur die Umsetzung macht mir so einige Probleme.

Meine Ansätze sehen folgendermaßen aus(nur grob, kein richtiger Quellcode!!).

class erstellen. in der class: steamreader, static Color[,] ArrayBitmap (Bitmap Bild), int Breite , int Höhe, Color[,] c= new Color[breite, Höhe]. for (int i=0;i<Höhe;i++){ for(int j =0;j<=;j++) c[j,i]= Miami.GetPixel(j,i)} return c; Class hier zuende!

Danach zweite class: static Bitmap BitmapArry ( Color [,] Farbe) , int Breite = Farbe.GetLength(0), int Höhe =Farbe.GetLength(0),

für Rote Farbe z.B. : Bitmap Rot= new Bitmap (Breite,Höhe); for(int i=0; i<0;i++){ for(int j =0;j<=;j++){Rot.SetPixel(j,i,Farbe[j,i])}} return Rot;

kann ich das so für alle Farben machen?

Ist das so der richtige Ansatz?

Das mit den Arrays klingt doch schon gut. Du brauchst also drei Arrays. Sie müssen so groß sein, dass sie jeweils alle Werte eines Kanals aufnehmen können. Im Falle eines Bildes mit 8Bit pro Kanal also 256 Elemente groß.

Wie Du ein Bild einliest solltest Du schnell ergoogeln können.

Wenn Du das Bild geladen hast, musst Du über alle Pixel des Bildes iterieren und Dir die Farbe des Pxiels holen (Tip: Bitmap.GetPixel). Wenn Du den Color-Wert des Pixels hast, kannst Du über die member R, G und B die jeweiligen Farbwerte auslesen und erhöhst für den jewiligen Wert das entsprechende Element im Array.

  • Autor

Ich weiß nicht, wie ich das mit den Array umsetzen kann. Könntest du mir vielleicht einen beispielhaften Quellcode zeigen?

Du scheinst dich schließlich sehr gut auszukennen. Damit würdest du mir sehr helfen!

Ich denke, dass es Dir nicht hilft, wenn ich Dir gleich das fertige Programm gebe.

Aber ersteinmal zu den Arrays: Wie gesagt brauchst Du für jede Farbe ein Array mit genug Elementen, um für jeden Farbkanal alle Werte abzudecken. Wenn wir der einfachheit halber von 24 bzw 32Bit Farbtiefe ausgehen, dann haben wir 8Bit pro Kanal und brauchen daher 256 Elemente in den Arrays:


var valuesPerPixel = 256;

var redHistogram = new int[valuesPerPixel ];

var greenHistogram = new int[valuesPerPixel ];

var blueHistogram = new int[valuesPerPixel ];

Jetzt mir zwei verschachtelte Schleifen (X und Y) über alle Pixel des Bildes laufen und die Farbe des Pixels abfragen. Wie oben schon gesagt, kommst Du an die rot, grün und blau Anteile heran. Wenn z.B. Der Blauanteil den Wert 55 hat, dann musst Du das 55. Element Deines Blauhistogramms erhöhen:

blueHistogram[colorVal.B]++;

  • Autor

Nein, dass war mir nicht klar!

Es wäre sehr hilfreich wenn ich einmal den kompletten Quellcode bekommen könnte. Ich hab sonst überhaupt keinen Überblick wo was hin muss..:(

Sinn des ganzen sollte sein, dass Du Dir selbst gedanken machst, wie Du das Problem lösen kannst. Tips, wie Du vorgehen kannst hast Du ja schon bekommen. Wenn es dazu Fragen gibt, dann einfach fragen.

Sinnvoller wäre es, wenn Du Deinen Code zeigen würdest (an die Codetags denken) und wir Dir dann weiterhelfen.

  • Autor

class ArrayausBitmap

{

StreamReader reader = new StreamReader("Bild");

static Color[,] ArrayBitmap (Bitmap Bild)

{

int Breite = Bild.Width;

int Höhe = Bild.Height;

Color[,] c = new Color[breite, Höhe];

for (int i = 0; i < Höhe; i++)

{

for (int j = 0; j < Höhe; j++)

{

c[j, i] = Bild.GetPixel(j, i);

}

}

return c;

}

}

class BitmapausArray

{

static Bitmap BitmapausArray(Color[,] Farbe)

{

int Breite = Farbe.GetLength(0);

int Höhe = Farbe.GetLength(0);

Bitmap Rot = new Bitmap(Breite, Höhe);

for (int i = 0; i < 0; i++)

{

for (int j = 0; j < 0; j++)

{

Rot.SetPixel(j,i,Farbe[j,i]);

}

}

return Rot;

}

}

class Program

{

static void Main(string[] args)

{

System.Windows.Forms.OpenFileDialog dlg = new System.Windows.Forms.OpenFileDialog();

System.Windows.Forms.DialogResult res = dlg.ShowDialog();

if (res == System.Windows.Forms.DialogResult.OK) // Wurde „Öffnen“ geklickt?

{

string file = dlg.FileName;

}

Bitmap Bild = new Bitmap;

Graphics g = Graphics.FromImage(Bild);

g.Clear(Color.White);

g.DrawLine(new Pen(Color.Red, 2),0,0,100.5f, 100.5f);

g.Dispose();

Color c = ;

byte r = c.R;

byte gr = c.G;

byte b = c.B;

Console.WriteLine("Zum Beenden bel. Taste drücken!");

Console.ReadKey();

Vom Histogramm ist da ja noch nichts zu sehen.

Ich habe mir das einlesen des Bildes einfacher gemacht:


Image image = Bitmap.FromFile(dlg.FileName);

Bitmap bmp = new Bitmap(image);

Schon hast Du das Bild von der Platte in die Bitmap geladen und kannst darauf arbeiten.

Was willst Du mit ArrayToBitmap und BitmapToArray erreichen?

  • Autor

Aber so wie du das gemacht hast kann man dann doch kein beliebiges Bild auswählen oder?

Ich wollte i Prinzip erst die Werte "einlesen" und dann wieder ausgeben in Form des Histograms.

Warum denn nicht? Mit

Bitmap.FromFile(dlg.FileName);
würde doch die Datei mit dem entsprechenden Namen als Image geladen werden und nach
Bitmap bmp = new Bitmap(image);

kannst Du dann einfach auf die Bitmap zugreifen und alle Methoden der Bitmap-Klasse verwenden.

Wenn Du also die Bitmap hast kannst Du Dich an den interessanten Teil machen, nämlich das bzw. die Histogramme erstellen.

Von der Bitmap bekommst Du die benötigten Informationen wie Höhe und Breite, mit denen Du dann die Schleifen "bestücken" kannst. In den Schleifen wanderst Du über alle Pixel und kannst Dort mit getPixel die Farbwerte auslesen.

  • Autor

Ich habe es versuch, bin aber nicht weit gekommen.

Das:var valuesPerPixel = 256;

var redHistogram = new int[valuesPerPixel ];

var greenHistogram = new int[valuesPerPixel ];

var blueHistogram = new int[valuesPerPixel ];

habe ich eingefügt und var durch int erseztzt. Das ganze habe ich in eine neue class getan. "valuesPerPixel" wird rot unterkringelt.

Was muss ich tun?

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.