Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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!

Geschrieben

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.

Geschrieben

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?

Geschrieben

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.

Geschrieben

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!

Geschrieben

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

Geschrieben

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..:(

Geschrieben

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.

Geschrieben

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

Geschrieben

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?

Geschrieben

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.

Geschrieben

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.

Geschrieben

Ich wollte es so haben das wenn man das Program startet ein Dialog kommt wo an dann eine beliebige Datei auswählen kann.

Ok ich werds dann mal versuchen!

Geschrieben

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?

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...