protected void dilate(boolean isInverted){
  int currIdx=0;
  int maxIdx=pixels.length;
  int[] out=new int[maxIdx];
  if (!isInverted) {
    while (currIdx < maxIdx) {
      int currRowIdx=currIdx;
      int maxRowIdx=currIdx + width;
      while (currIdx < maxRowIdx) {
        int colOrig, colOut;
        colOrig=colOut=pixels[currIdx];
        int idxLeft=currIdx - 1;
        int idxRight=currIdx + 1;
        int idxUp=currIdx - width;
        int idxDown=currIdx + width;
        if (idxLeft < currRowIdx)         idxLeft=currIdx;
        if (idxRight >= maxRowIdx)         idxRight=currIdx;
        if (idxUp < 0)         idxUp=0;
        if (idxDown >= maxIdx)         idxDown=currIdx;
        int colUp=pixels[idxUp];
        int colLeft=pixels[idxLeft];
        int colDown=pixels[idxDown];
        int colRight=pixels[idxRight];
        int currLum=77 * (colOrig >> 16 & 0xff) + 151 * (colOrig >> 8 & 0xff) + 28 * (colOrig & 0xff);
        int lumLeft=77 * (colLeft >> 16 & 0xff) + 151 * (colLeft >> 8 & 0xff) + 28 * (colLeft & 0xff);
        int lumRight=77 * (colRight >> 16 & 0xff) + 151 * (colRight >> 8 & 0xff) + 28 * (colRight & 0xff);
        int lumUp=77 * (colUp >> 16 & 0xff) + 151 * (colUp >> 8 & 0xff) + 28 * (colUp & 0xff);
        int lumDown=77 * (colDown >> 16 & 0xff) + 151 * (colDown >> 8 & 0xff) + 28 * (colDown & 0xff);
        if (lumLeft > currLum) {
          colOut=colLeft;
          currLum=lumLeft;
        }
        if (lumRight > currLum) {
          colOut=colRight;
          currLum=lumRight;
        }
        if (lumUp > currLum) {
          colOut=colUp;
          currLum=lumUp;
        }
        if (lumDown > currLum) {
          colOut=colDown;
          currLum=lumDown;
        }
        out[currIdx++]=colOut;
      }
    }
  }
 else {
    while (currIdx < maxIdx) {
      int currRowIdx=currIdx;
      int maxRowIdx=currIdx + width;
      while (currIdx < maxRowIdx) {
        int colOrig, colOut;
        colOrig=colOut=pixels[currIdx];
        int idxLeft=currIdx - 1;
        int idxRight=currIdx + 1;
        int idxUp=currIdx - width;
        int idxDown=currIdx + width;
        if (idxLeft < currRowIdx)         idxLeft=currIdx;
        if (idxRight >= maxRowIdx)         idxRight=currIdx;
        if (idxUp < 0)         idxUp=0;
        if (idxDown >= maxIdx)         idxDown=currIdx;
        int colUp=pixels[idxUp];
        int colLeft=pixels[idxLeft];
        int colDown=pixels[idxDown];
        int colRight=pixels[idxRight];
        int currLum=77 * (colOrig >> 16 & 0xff) + 151 * (colOrig >> 8 & 0xff) + 28 * (colOrig & 0xff);
        int lumLeft=77 * (colLeft >> 16 & 0xff) + 151 * (colLeft >> 8 & 0xff) + 28 * (colLeft & 0xff);
        int lumRight=77 * (colRight >> 16 & 0xff) + 151 * (colRight >> 8 & 0xff) + 28 * (colRight & 0xff);
        int lumUp=77 * (colUp >> 16 & 0xff) + 151 * (colUp >> 8 & 0xff) + 28 * (colUp & 0xff);
        int lumDown=77 * (colDown >> 16 & 0xff) + 151 * (colDown >> 8 & 0xff) + 28 * (colDown & 0xff);
        if (lumLeft < currLum) {
          colOut=colLeft;
          currLum=lumLeft;
        }
        if (lumRight < currLum) {
          colOut=colRight;
          currLum=lumRight;
        }
        if (lumUp < currLum) {
          colOut=colUp;
          currLum=lumUp;
        }
        if (lumDown < currLum) {
          colOut=colDown;
          currLum=lumDown;
        }
        out[currIdx++]=colOut;
      }
    }
  }
  System.arraycopy(out,0,pixels,0,maxIdx);
}

protected void dilate ( boolean isInverted ) { int currIdx = 0 ; int maxIdx = pixels . length ; int [ ] out = new int [ maxIdx ] ; if ( ! isInverted ) { while ( currIdx < maxIdx ) { int currRowIdx = currIdx ; int maxRowIdx = currIdx + width ; while ( currIdx < maxRowIdx ) { int colOrig , colOut ; colOrig = colOut = pixels [ currIdx ] ; int idxLeft = currIdx - 1 ; int idxRight = currIdx + 1 ; int idxUp = currIdx - width ; int idxDown = currIdx + width ; if ( idxLeft < currRowIdx ) idxLeft = currIdx ; if ( idxRight >= maxRowIdx ) idxRight = currIdx ; if ( idxUp < 0 ) idxUp = 0 ; if ( idxDown >= maxIdx ) idxDown = currIdx ; int colUp = pixels [ idxUp ] ; int colLeft = pixels [ idxLeft ] ; int colDown = pixels [ idxDown ] ; int colRight = pixels [ idxRight ] ; int currLum = 77 * ( colOrig > > 16 & 0xff ) + 151 * ( colOrig > > 8 & 0xff ) + 28 * ( colOrig & 0xff ) ; int lumLeft = 77 * ( colLeft > > 16 & 0xff ) + 151 * ( colLeft > > 8 & 0xff ) + 28 * ( colLeft & 0xff ) ; int lumRight = 77 * ( colRight > > 16 & 0xff ) + 151 * ( colRight > > 8 & 0xff ) + 28 * ( colRight & 0xff ) ; int lumUp = 77 * ( colUp > > 16 & 0xff ) + 151 * ( colUp > > 8 & 0xff ) + 28 * ( colUp & 0xff ) ; int lumDown = 77 * ( colDown > > 16 & 0xff ) + 151 * ( colDown > > 8 & 0xff ) + 28 * ( colDown & 0xff ) ; if ( lumLeft > currLum ) { colOut = colLeft ; currLum = lumLeft ; } if ( lumRight > currLum ) { colOut = colRight ; currLum = lumRight ; } if ( lumUp > currLum ) { colOut = colUp ; currLum = lumUp ; } if ( lumDown > currLum ) { colOut = colDown ; currLum = lumDown ; } out [ currIdx ++ ] = colOut ; } } } else { while ( currIdx < maxIdx ) { int currRowIdx = currIdx ; int maxRowIdx = currIdx + width ; while ( currIdx < maxRowIdx ) { int colOrig , colOut ; colOrig = colOut = pixels [ currIdx ] ; int idxLeft = currIdx - 1 ; int idxRight = currIdx + 1 ; int idxUp = currIdx - width ; int idxDown = currIdx + width ; if ( idxLeft < currRowIdx ) idxLeft = currIdx ; if ( idxRight >= maxRowIdx ) idxRight = currIdx ; if ( idxUp < 0 ) idxUp = 0 ; if ( idxDown >= maxIdx ) idxDown = currIdx ; int colUp = pixels [ idxUp ] ; int colLeft = pixels [ idxLeft ] ; int colDown = pixels [ idxDown ] ; int colRight = pixels [ idxRight ] ; int currLum = 77 * ( colOrig > > 16 & 0xff ) + 151 * ( colOrig > > 8 & 0xff ) + 28 * ( colOrig & 0xff ) ; int lumLeft = 77 * ( colLeft > > 16 & 0xff ) + 151 * ( colLeft > > 8 & 0xff ) + 28 * ( colLeft & 0xff ) ; int lumRight = 77 * ( colRight > > 16 & 0xff ) + 151 * ( colRight > > 8 & 0xff ) + 28 * ( colRight & 0xff ) ; int lumUp = 77 * ( colUp > > 16 & 0xff ) + 151 * ( colUp > > 8 & 0xff ) + 28 * ( colUp & 0xff ) ; int lumDown = 77 * ( colDown > > 16 & 0xff ) + 151 * ( colDown > > 8 & 0xff ) + 28 * ( colDown & 0xff ) ; if ( lumLeft < currLum ) { colOut = colLeft ; currLum = lumLeft ; } if ( lumRight < currLum ) { colOut = colRight ; currLum = lumRight ; } if ( lumUp < currLum ) { colOut = colUp ; currLum = lumUp ; } if ( lumDown < currLum ) { colOut = colDown ; currLum = lumDown ; } out [ currIdx ++ ] = colOut ; } } } System . arraycopy ( out , 0 , pixels , 0 , maxIdx ) ; }
generic dilate / erode filter using luminance values as decision factor . [ toxi 050728 ]
