Februar 27, 2012
In dieser Aufgabe erstellte ich aufbauend auf mein Pixelauslese - Code ein kleines Programm mit welchem es möglich ist, 3 Farben zu selektieren welche man aus dem Bild löschen möchte. Die gelöschten Pixel werden durch die Farbe Rot ersetzt. Ebenfalls habe ich ein Farbrechteck, welches an der Maus hängt, programmiert. Mit Hilfe dieses Rechtecks ist es möglich einen Farbmittelwert der analysierten Pixel zu erhalten, welcher zusätzlich auf der rechten seite des Rechteckes in schriftlicher Form dargestellt wird.Code:// Aufgabenstellung: Diashow erstellen mit 5 Bildern welche durch drücken der Leertaste wechseln. Anschliessend kann man mit der Maus über das Bild fahren und // sieht die Pixelwerte des unter dem Cursor liegende Pixels. PImage [] img; PFont font; PImage bearBild; String [] BildName; int[] hist = new int[256]; color[] saveColor = new color[3]; int welchesBild = 0; int histMax; int rectBreite = 40; int mittelwertR; int mittelwertG; int mittelwertB; float timer; float compRed, compGreen, compBlue; float r; float g; float b; boolean farbeja = false; boolean histogrammja = false; void setup() { font = loadFont("Dialog-20.vlw"); textFont(font, 20); smooth(); BildName = new String[5]; BildName[0] = "landschaft.jpg"; BildName[1] = "landschaft1.jpg"; BildName[2] = "landschaft2.jpg"; BildName[3] = "landschaft3.jpg"; BildName[4] = "landschaft4.jpg"; img = new PImage[5]; img[0] = loadImage(BildName[0]); img[1] = loadImage(BildName[1]); img[2] = loadImage(BildName[2]); img[3] = loadImage(BildName[3]); img[4] = loadImage(BildName[4]); size(1024,768); bildDurchsuchen(); } void draw() { loadPixels(); if(farbeja) { image(img[welchesBild],0,0); } else { img[welchesBild] = loadImage(BildName[welchesBild]); image(img[welchesBild],0,0); } stroke(255,255); //setzt die Strichfarbe auf Weiss if(histogrammja) { // Draw half of the histogram (skip every second value) for (int i = 0; i < img[welchesBild].width; i += 2) { // for-Schleife welche jede 2. Spalte durchläuft // Map i (from 0..img.width-1) to a location in the histogram (0..255) int which = int(map(i, 0, img[welchesBild].width, 0, 255)); // Wert wird generiert aus i welcher von 0 bis 255 ist // um die Darstellung auf die ganze Grösse zu machen. // Convert the histogram value to a location between // the bottom and the top of the picture int y = int(map(hist[which], 0, histMax, img[welchesBild].height, 0)); // nimmt den Wert aus dem Array welches dem Wert des Arrays entspricht und mapt diesen. line(i, img[welchesBild].height, i, y); } } //int c = (img[welchesBild].get(mouseX, mouseY)); fill(durchschnittsFarbeAnzeigen(img[welchesBild],mouseX-rectBreite,mouseY-rectBreite,rectBreite,rectBreite)); rect(mouseX-rectBreite,mouseY-rectBreite,rectBreite,rectBreite); // Speicherfelder fill(saveColor[2]); rect(width-60,10,40,40); fill(saveColor[1]); rect(width-120,10,40,40); fill(saveColor[0]); rect(width-180,10,40,40); fill(255); String dataStr1 = "Rotwert:" + mittelwertR; textSize(14); text(dataStr1,mouseX+10,mouseY); String dataStr2 = "Grünwert:" + mittelwertG; text(dataStr2,mouseX+10,mouseY-20); String dataStr3 = "Blauwert:" + mittelwertB; text(dataStr3,mouseX+10,mouseY-40); textSize(24); fill(255); String clockStr = str(hour()) + ":" + str(minute()) + ":" + str(second()) + " Farbmittelwertberechnung"; text(clockStr,20,40); textSize(16); String bildName = "Bildname: "+ BildName[welchesBild]; text(bildName,20,60); } void farbeSpeichern(float _timer,color _c) { if (saveColor[0] == 0 && timer <= 1) { timer = 0; saveColor[0] = _c; } else if (saveColor[1] == 0 && timer <= 1) { timer = 0; saveColor[1] = _c; } else if (saveColor[2] == 0 && timer <= 1) { timer = 0; saveColor[2] = _c; } else if ((saveColor[0] + saveColor[1] + saveColor[2]) != 0 ) { saveColor[0] = 0; saveColor[1] = 0; saveColor[2] = 0; } } void mouseClicked() { timer = 0; farbeSpeichern(timer,durchschnittsFarbeAnzeigen(img[welchesBild],mouseX-rectBreite,mouseY-rectBreite,rectBreite,rectBreite)); timer++; farbeErsetzen(); } void bildDurchsuchen() { //hist = new int[256]; for(int i=0;i< hist.length;i++) hist[i]=0; for (int i = 0; i < img[welchesBild].width; i++) { // diese Schleife geht durch die Spalten for (int j = 0; j < img[welchesBild].height; j++) { // diese Schleife geht die Pixel der Spalte durch int bright = int(brightness(img[welchesBild].get(i, j))); // get(i,j) liest die Farbinformation des Pixels mit den Koordinaten i,j aus / brightness() gibt die Helligkeit des Pixels aus hist[bright]++; // schreibt den Wert ins Array } } // Find the largest value in the histogram histMax = max(hist); // liest den höchsten Wert des Arrays aus } void farbeErsetzen() { //bearBild = createImage(img[welchesBild].width, img[welchesBild].height, RGB); img[welchesBild].loadPixels(); for (int x = 0; x < img[welchesBild].width; x++ ) { for (int y = 0; y < img[welchesBild].height; y++ ) { int loc = x + y*img[welchesBild].width; color farbeWert = color(img[welchesBild].pixels [loc]); for(int t = 0; t < saveColor.length; t++) { if((farbeWert <= saveColor[t]+10000) && (farbeWert >= saveColor[t]-10000)) { img[welchesBild].pixels[loc] = color(255,0,0); } } } } img[welchesBild].updatePixels(); farbeja = true; println(img[welchesBild]); println(saveColor[0]); } color durchschnittsFarbeAnzeigen(PImage _img, int _x, int _y, int breite, int hoehe) { int r = 0; int g = 0; int b = 0; for (int i = _x; i < _x+breite; i++) { for (int j = _y; j < _y+hoehe; j++) { r += int(red(_img.get(i,j))); g += int(green(_img.get(i,j))); b += int(blue(_img.get(i,j))); } } int anzahlPunkte = breite * hoehe; mittelwertR = r/anzahlPunkte; mittelwertG = g/anzahlPunkte; mittelwertB = b/anzahlPunkte; return(color(mittelwertR,mittelwertG,mittelwertB)); } void keyPressed() { switch(key) { case'1': welchesBild = 0; break; case'2': welchesBild = 1; break; case'3': welchesBild = 2; break; case'4': welchesBild = 3; break; case'5': welchesBild = 4; break; case' ': farbeja = false; break; case ENTER: if(histogrammja) { histogrammja = false; } else{ histogrammja = true; } break; default: welchesBild = 0; break; } bildDurchsuchen(); } <pre>