Willkommen auf unserem Seminar-Blog

Immer auf dem aktuellen Stand bleiben

Dieser Seminar-Blog befindet sich noch im Aufbau und wird in den kommenden Tagen entsprechend verfeinert.

Member Login

Lost your password?

Registration is closed

Sorry, you are not allowed to register by yourself on this site!

You must either be invited by one of our team member or request an invitation by email at viad.info {at} zhdk {dot} ch.

04 Average Color

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>