2013-11-28 3 views
0

Я пытаюсь сделать что-то, на что я надеюсь, просто: измените общую яркость в результирующем изображении, если общая яркость исходного изображения прошла через определенное пороговое значение.Я правильно настраиваю яркость изображения?

Моя логика до сих пор довольно проста:

  1. получить разницу между целевой макс. яркость и источник изображения общая яркость
  2. нормализовать разницу
  3. , если разность больше, чем 0, то использовать разницу нормализованной яркости для «DIMM»/вычитания яркости на результирующий пикселе

I» ве получил очень простой «работоспособный» прототип, написанный на Processing/(Java), чтобы проиллюстрировать идею, но язык программирования является менее важным

import java.util.Arrays; 
PImage normal,dimmed; 

int s = 40;//preview scale factor 
int w = 8;//pixels width 
int h = 8;//pixels height 
int np = w*h;//total number of pixels 
int b = 255;//current pixel brush brightness 
float nb = 0;//normal image brightness 
float mb = 64;//max brightness 
float db = 0;//dimmed image brightness 

void setup(){ 
    noSmooth();fill(127); 
    size(w*s*2,h*s); 
    normal = createImage(w,h,RGB); 
    dimmed = createImage(w,h,RGB); 
} 
void draw(){ 
    image(normal,0,0,w*s,h*s); 
    image(dimmed,w*s,0,w*s,h*s); 
    text("original brightness: "+nb+" max: " + mb +"\ndimmed brightness: " + db,10,15); 
} 
void mouseDragged(){ 
    if(mouseX < w*s){ 
    normal.set(mouseX/s,mouseY/s,color(b)); 
    //average brightness 
    nb = getBrightness(normal); 
    //dimm if needed 
    float bd = (nb-mb)/255.0;//normalized brightness difference 
    println(nb-mb+"/"+bd); 
    for(int i = 0 ; i < np; i++) 
     dimmed.pixels[i] = color(brightness(normal.pixels[i]) - (bd > 0 ? bd * 255.0 : 0));//copy brightness and subtract 
    dimmed.updatePixels(); 
    //done dimming, compare 
    db = getBrightness(dimmed); 
    } 
} 
void keyPressed(){ 
    if(key == '-' && b > 0) b--; 
    if(key == '=' && b < 255) b++; 
    if(key == ' ') {Arrays.fill(normal.pixels,0);normal.updatePixels();} 
} 
float getBrightness(PImage img){ 
    float ab = 0; 
    for(int i = 0 ; i < np; i++) ab += brightness(img.pixels[i]); 
    return (ab/np); 
} 

Do моя логика имеет смысл или я должен придерживаться другого подхода? Кроме того, я правильно применяю эту логику в коде. Я сомневаюсь, потому что иногда общая яркость результирующего изображения выше целевой/максимальной яркости, и я не уверен, почему.

Любые подсказки?

ответ

0

Часть проблемы может быть связана с обработкой цветов в обработке. Вот версия модификатора, которая просто использует 2d-массив из целых чисел (значения яркости):

int s = 40;//preview scale factor 
int w = 8;//pixels width 
int h = 8;//pixels height 
int np = w*h;//total number of pixels 
int b = 255;//current pixel brush brightness 
float nb = 0;//normal image brightness 
float mb = 64;//max brightness 
float db = 0;//dimmed image brightness 

int[][] normal,dimmed; 

void setup(){ 
    noSmooth();fill(127); 
    size(w*s*2,h*s); 
    normal = new int[w][h]; 
    dimmed = new int[w][h]; 
} 
void draw(){ 
    background(0);//clear 
    for(int y = 0; y < h ; y++){ 
    for(int x = 0; x < w ; x++){ 
     fill(normal[x][y]); 
     rect(x*s,y*s,s,s);//draw a scaled pixel representation 
     fill(dimmed[x][y]); 
     rect((x*s)+(w*s),y*s,s,s); 
    } 
    } 
    fill(127);text("original brightness: "+nb+" max: " + mb +"\ndimmed brightness: " + db,10,15); 
} 
void mouseDragged(){ 
    if((mouseX > 0 && mouseX < w*s)&&(mouseY > 0 && mouseY < h*s)){ 
    normal[mouseX/s][mouseY/s] = b; 
    //average brightness 
    nb = getBrightness(normal); 
    //dimm if needed 
    float bd = (nb-mb)/255.0;//normalized brightness difference 
    println(nb-mb+"/"+bd); 

    for(int y = 0; y < h ; y++) 
     for(int x = 0; x < w ; x++) 
     dimmed[x][y] = normal[x][y] - (int)(bd > 0 ? bd * 255.0 : 0); 
    //done dimming, compare 
    db = getBrightness(dimmed); 
    } 
} 
void keyPressed(){ 
    if(key == '-' && b > 0) b--; 
    if(key == '=' && b < 255) b++; 
    if(key == ' ') { 
    for(int y = 0; y < h ; y++) 
     for(int x = 0; x < w ; x++) 
     normal[x][y] = 0; 
    } 
} 
float getBrightness(int[][] img){ 
    float ab = 0; 
    for(int y = 0; y < h ; y++) 
    for(int x = 0; x < w ; x++) 
     ab += img[x][y]; 
    return (ab/np); 
} 
0

Если вы хотите изменить только яркость можно использовать tint(b) с одним аргументом, где:

  • b = 255 (исходное изображение)

  • b = 0 (темное изображение)

В коде вы только что изменили draw()

void draw(){ 
    image(normal,0,0,w*s,h*s); 
    tint(b); 
    image(dimmed,w*s,0,w*s,h*s);  
} 
Смежные вопросы