Not logged in.  Login/Logout/Register | List snippets | | Create snippet | Upload image Upload data

80
LINES

< > BotCompany Repo | #1019588 - IntegralImage (RGB, size limit 8 megapixels, uses 12 byte per pixel)

JavaX fragment (include) [tags: use-pretranspiled]

Libraryless. Click here for Pure Java version (3238L/20K).

final sclass IntegralImage implements MakesBufferedImage {
  final int w, h;
  final int[] data; // 3 ints per pixel
  
  *(RGBImage img) {
    w = img.w();
    h = img.h();
    if (longMul(w, h) > 8000000) fail("Image too big: " + w + "*" + h);
    data = new int[w*h*3];
    int i = 0;
    for y to h: {
      int sumR = 0, sumG = 0, sumB = 0;
      for x to w: {
        int rgb = img.getInt(x, y);
        sumR += (rgb >> 16) & 0xFF;
        sumG += (rgb >> 8) & 0xFF;
        sumB += rgb & 0xFF;
        data[i] = y > 0 ? sumR + data[i-w*3] : sumR;
        data[i+1] = y > 0 ? sumG + data[i-w*3+1] : sumG;
        data[i+2] = y > 0 ? sumB + data[i-w*3+2] : sumB;
        i += 3;
      }
    }
  }
  
  *(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;
    for y to h: {
      int sumR = 0, sumG = 0, sumB = 0;
      for x to w: {
        int rgb = pixels[j++];
        sumR += (rgb >> 16) & 0xFF;
        sumG += (rgb >> 8) & 0xFF;
        sumB += rgb & 0xFF;
        data[i] = y > 0 ? sumR + data[i-w*3] : sumR;
        data[i+1] = y > 0 ? sumG + data[i-w*3+1] : sumG;
        data[i+2] = y > 0 ? sumB + data[i-w*3+2] : sumB;
        i += 3;
      }
    }
  }
  
  // gets the integral value at x/y for given RGB channel
  int get(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
  int 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; }
  int w() { ret w; }
  int h() { ret h; }
  
  // serialization
  
  O _serialize() { ret litobjectarray(w, h, data); }
  static IntegralImage _deserialize(O[] l) { ret IntegralImage((int) l[0], (int) l[1], (int[]) l[2]); }
  *(int *w, int *h, int[] *data) {}
}

Author comment

Began life as a copy of #1009125

download  show line numbers  debug dex   

Travelled to 8 computer(s): cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, irmadwmeruwu, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, tvejysmllsmz

No comments. add comment

Snippet ID: #1019588
Snippet name: IntegralImage (RGB, size limit 8 megapixels, uses 12 byte per pixel)
Eternal ID of this version: #1019588/30
Text MD5: 46209972de10ffc2d1b116b5fad46421
Transpilation MD5: e1d4d3a4456642b9355f3e282578902f
Author: stefan
Category: javax / gui
Type: JavaX fragment (include)
Public (visible to everyone): Yes
Archived (hidden from active list): No
Created/modified: 2019-09-14 17:04:07
Source code size: 2404 bytes / 80 lines
Pitched / IR pitched: No / No
Views / Downloads: 109 / 396
Version history: 29 change(s)
Referenced in: [show references]