Warning: session_start(): open(/var/lib/php/sessions/sess_vc33p2dld0p3sv45kpve75b85o, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
set flag LeanMode.
final sclass IntegralImage {
final int w, h;
final int[] data; // 3 ints per pixel
*(BufferedImage img) {
w = img.getWidth();
h = img.getHeight();
if (longMul(w, h) > 8000000) fail("Image too big: " + w + "*" + h);
int[] pixels = pixelsOfBufferedImage(img);
data = new int[w*h*3];
int i = 0, j = 0, sumR = 0, sumG = 0, sumB = 0;
for x to w: {
int rgb = pixels[j++];
data[i++] = (sumR += (rgb >> 16) & 0xFF);
data[i++] = (sumG += (rgb >> 8) & 0xFF);
data[i++] = (sumB += rgb & 0xFF);
}
for (int y = 1; y < h; y++) {
sumR = sumG = sumB = 0;
for x to w: {
int rgb = pixels[j++];
sumR += (rgb >> 16) & 0xFF;
sumG += (rgb >> 8) & 0xFF;
sumB += rgb & 0xFF;
data[i] = sumR + data[i-w*3];
data[i+1] = sumG + data[i-w*3+1];
data[i+2] = sumB + data[i-w*3+2];
i += 3;
}
}
}
// gets the integral value at x/y for given RGB channel
public double getIntegralValue(int x, int y, int channel) {
ret x < 0 || y < 0 || x >= w || y >= h ? 0
: data[(y*w+x)*3+channel];
}
// gets sum of the 3 channels
public double getIntegralValue aka get(int x, int y) {
if (x < 0 || y < 0 || x >= w || y >= h) ret 0;
int i = (y*w+x)*3;
ret data[i]+data[i+1]+data[i+2];
}
double averageBrightness() {
ret doubleRatio(get(w-1, h-1), w*h*3*255.0);
}
toString {
ret "IntegralImage " + w + "*" + h + ", brightness: " + averageBrightness();
}
public BufferedImage getBufferedImage() { ret integralImageToBufferedImage(this); }
public int getWidth() { ret w; }
public int getHeight() { ret h; }
double rectSum(int x1, int y1, int x2, int y2, int channel) {
double bottomLeft = getIntegralValue(x1-1, y2-1, channel);
double bottomRight = getIntegralValue(x2-1, y2-1, channel);
double topLeft = getIntegralValue(x1-1, y1-1, channel);
double topRight = getIntegralValue(x2-1, y1-1, channel);
ret bottomRight+topLeft-topRight-bottomLeft;
}
double rectSum(int x1, int y1, int x2, int y2) {
double bottomLeft = getIntegralValue(x1-1, y2-1);
double bottomRight = getIntegralValue(x2-1, y2-1);
double topLeft = getIntegralValue(x1-1, y1-1);
double topRight = getIntegralValue(x2-1, y1-1);
ret bottomRight+topLeft-topRight-bottomLeft;
}
}