Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2308,24 +2308,27 @@ static class AdjustHistogramApplyFunction implements JavaImageProcessing.ApplyFu
private final int n_tiles;
private final int width;
private final int height;
private final int [] c_histogram;
private final int [] equal_value_lut; // look up table for performance

AdjustHistogramApplyFunction(float hdr_alpha, int n_tiles, int width, int height, int [] c_histogram) {
this.hdr_alpha = hdr_alpha;
this.n_tiles = n_tiles;
this.width = width;
this.height = height;
this.c_histogram = c_histogram;
}

private int getEqualValue(int histogram_offset, int value) {
int cdf_v = c_histogram[histogram_offset+value];
int cdf_0 = c_histogram[histogram_offset];
int n_pixels = c_histogram[histogram_offset+255];
float num = (float)(cdf_v - cdf_0);
float den = (float)(n_pixels - cdf_0);
int equal_value = (int)( 255.0f * (num/den) ); // value that we should choose to fully equalise the histogram
return equal_value;
this.equal_value_lut = new int[n_tiles*n_tiles*256];
for(int i=0;i<n_tiles*n_tiles;i++) {
int histogram_offset = 256*i;
int cdf_0 = c_histogram[histogram_offset];
int n_pixels = c_histogram[histogram_offset+255];
float den = (float)(n_pixels - cdf_0);
for(int value=0;value<256;value++) {
int cdf_v = c_histogram[histogram_offset+value];
float num = (float)(cdf_v - cdf_0);
int equal_value = (int)( 255.0f * (num/den) ); // value that we should choose to fully equalise the histogram
this.equal_value_lut[histogram_offset+value] = equal_value;
}
}
}

@Override
Expand Down Expand Up @@ -2369,10 +2372,10 @@ public void apply(JavaImageProcessing.CachedBitmap output, int thread_index, int
int histogram_offset10 = 256*((ix+1)*n_tiles+iy);
int histogram_offset01 = 256*(ix*n_tiles+iy+1);
int histogram_offset11 = 256*((ix+1)*n_tiles+iy+1);
int equal_value00 = getEqualValue(histogram_offset00, value);
int equal_value10 = getEqualValue(histogram_offset10, value);
int equal_value01 = getEqualValue(histogram_offset01, value);
int equal_value11 = getEqualValue(histogram_offset11, value);
int equal_value00 = equal_value_lut[histogram_offset00+value];
int equal_value10 = equal_value_lut[histogram_offset10+value];
int equal_value01 = equal_value_lut[histogram_offset01+value];
int equal_value11 = equal_value_lut[histogram_offset11+value];
float alpha = tx - ix;
float beta = ty - iy;

Expand All @@ -2384,25 +2387,25 @@ else if( ix >= 0 && ix < n_tiles-1 ) {
int this_y = (iy<0) ? iy+1 : iy;
int histogram_offset0 = 256*(ix*n_tiles+this_y);
int histogram_offset1 = 256*((ix+1)*n_tiles+this_y);
int equal_value0 = getEqualValue(histogram_offset0, value);
int equal_value1 = getEqualValue(histogram_offset1, value);
int equal_value0 = equal_value_lut[histogram_offset0+value];
int equal_value1 = equal_value_lut[histogram_offset1+value];
float alpha = tx - ix;
equal_value = (int)((1.0f-alpha)*equal_value0 + alpha*equal_value1);
}
else if( iy >= 0 && iy < n_tiles-1 ) {
int this_x = (ix<0) ? ix+1 : ix;
int histogram_offset0 = 256*(this_x*n_tiles+iy);
int histogram_offset1 = 256*(this_x*n_tiles+iy+1);
int equal_value0 = getEqualValue(histogram_offset0, value);
int equal_value1 = getEqualValue(histogram_offset1, value);
int equal_value0 = equal_value_lut[histogram_offset0+value];
int equal_value1 = equal_value_lut[histogram_offset1+value];
float beta = ty - iy;
equal_value = (int)((1.0f-beta)*equal_value0 + beta*equal_value1);
}
else {
int this_x = (ix<0) ? ix+1 : ix;
int this_y = (iy<0) ? iy+1 : iy;
int histogram_offset = 256*(this_x*n_tiles+this_y);
equal_value = getEqualValue(histogram_offset, value);
equal_value = equal_value_lut[histogram_offset+value];
}

int new_value = (int)( (1.0f-hdr_alpha) * value + hdr_alpha * equal_value );
Expand Down Expand Up @@ -2460,10 +2463,10 @@ public void apply(JavaImageProcessing.CachedBitmap output, int thread_index, byt
int histogram_offset10 = 256*((ix+1)*n_tiles+iy);
int histogram_offset01 = 256*(ix*n_tiles+iy+1);
int histogram_offset11 = 256*((ix+1)*n_tiles+iy+1);
int equal_value00 = getEqualValue(histogram_offset00, value);
int equal_value10 = getEqualValue(histogram_offset10, value);
int equal_value01 = getEqualValue(histogram_offset01, value);
int equal_value11 = getEqualValue(histogram_offset11, value);
int equal_value00 = equal_value_lut[histogram_offset00+value];
int equal_value10 = equal_value_lut[histogram_offset10+value];
int equal_value01 = equal_value_lut[histogram_offset01+value];
int equal_value11 = equal_value_lut[histogram_offset11+value];
float alpha = tx - ix;
float beta = ty - iy;

Expand All @@ -2475,25 +2478,25 @@ else if( ix >= 0 && ix < n_tiles-1 ) {
int this_y = (iy<0) ? iy+1 : iy;
int histogram_offset0 = 256*(ix*n_tiles+this_y);
int histogram_offset1 = 256*((ix+1)*n_tiles+this_y);
int equal_value0 = getEqualValue(histogram_offset0, value);
int equal_value1 = getEqualValue(histogram_offset1, value);
int equal_value0 = equal_value_lut[histogram_offset0+value];
int equal_value1 = equal_value_lut[histogram_offset1+value];
float alpha = tx - ix;
equal_value = (int)((1.0f-alpha)*equal_value0 + alpha*equal_value1);
}
else if( iy >= 0 && iy < n_tiles-1 ) {
int this_x = (ix<0) ? ix+1 : ix;
int histogram_offset0 = 256*(this_x*n_tiles+iy);
int histogram_offset1 = 256*(this_x*n_tiles+iy+1);
int equal_value0 = getEqualValue(histogram_offset0, value);
int equal_value1 = getEqualValue(histogram_offset1, value);
int equal_value0 = equal_value_lut[histogram_offset0+value];
int equal_value1 = equal_value_lut[histogram_offset1+value];
float beta = ty - iy;
equal_value = (int)((1.0f-beta)*equal_value0 + beta*equal_value1);
}
else {
int this_x = (ix<0) ? ix+1 : ix;
int this_y = (iy<0) ? iy+1 : iy;
int histogram_offset = 256*(this_x*n_tiles+this_y);
equal_value = getEqualValue(histogram_offset, value);
equal_value = equal_value_lut[histogram_offset+value];
}

int new_value = (int)( (1.0f-hdr_alpha) * value + hdr_alpha * equal_value );
Expand Down