Я пытаюсь сделать что-то, на что я надеюсь, просто: измените общую яркость в результирующем изображении, если общая яркость исходного изображения прошла через определенное пороговое значение.Я правильно настраиваю яркость изображения?
Моя логика до сих пор довольно проста:
- получить разницу между целевой макс. яркость и источник изображения общая яркость
- нормализовать разницу
- , если разность больше, чем 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 моя логика имеет смысл или я должен придерживаться другого подхода? Кроме того, я правильно применяю эту логику в коде. Я сомневаюсь, потому что иногда общая яркость результирующего изображения выше целевой/максимальной яркости, и я не уверен, почему.
Любые подсказки?