findSeedPointOnFirstSlice()

in src/engine/actvolume/lungsfill/seedPoints.js [151:256]


  findSeedPointOnFirstSlice(vSeed) {
    const pixelsSrc = this.m_volTexSrc;
    const VAL_BLACK_BARRIER = 50;
    let holeFound = false;

    const NUM_7 = 7;
    const NUM_512 = 512;
    const sizeBlackAreaMin = Math.floor((this.m_xDim * NUM_7) / NUM_512);

    // for each point scan in 4 directions to find white barrier

    const MIN_RAT = 0.2;
    const MAX_RAT = 0.8;
    const yMin = Math.floor(this.m_yDim * MIN_RAT);
    const yMax = Math.floor(this.m_yDim * MAX_RAT);
    const xMin = Math.floor(this.m_xDim * MIN_RAT);
    const xMax = Math.floor(this.m_xDim * MAX_RAT);

    let cx, cy;
    const offZ = 2 * this.m_xDim * this.m_yDim;
    for (cy = yMin; cy < yMax && !holeFound; cy++) {
      const cyOff = cy * this.m_xDim;
      for (cx = xMin; cx < xMax && !holeFound; cx++) {
        const val = pixelsSrc[cx + cyOff + offZ];
        if (val >= VAL_BLACK_BARRIER) {
          continue;
        }
        // we have black current pixel
        let numWhiteBarriers = 0;

        let x, y, len;
        for (len = 0, y = cy - 1; y >= 0; y--, len++) {
          const off = cx + y * this.m_xDim + offZ;
          if (pixelsSrc[off] > VAL_BLACK_BARRIER) {
            if (len > sizeBlackAreaMin) {
              numWhiteBarriers++;
              break;
            }
          }
        } // for (y)
        for (len = 0, y = cy + 1; y < this.m_yDim; y++, len++) {
          const off = cx + y * this.m_xDim + offZ;
          if (pixelsSrc[off] > VAL_BLACK_BARRIER) {
            if (len > sizeBlackAreaMin) {
              numWhiteBarriers++;
            }
            break;
          }
        } // for (y)
        for (len = 0, x = cx - 1; x >= 0; x--, len++) {
          const off = x + cy * this.m_xDim + offZ;
          if (pixelsSrc[off] > VAL_BLACK_BARRIER) {
            if (len > sizeBlackAreaMin) {
              numWhiteBarriers++;
            }
            break;
          }
        } // for (x)
        for (len = 0, x = cx + 1; x < this.m_xDim; x++, len++) {
          const off = x + cy * this.m_xDim + offZ;
          if (pixelsSrc[off] > VAL_BLACK_BARRIER) {
            if (len > sizeBlackAreaMin) {
              numWhiteBarriers++;
            }
            break;
          }
        } // for (x)
        const MIN_BLACK_BARRIER = 17;
        const FOUR = 4;
        const TWO = 2;
        if (numWhiteBarriers === FOUR) {
          holeFound = true;
          vSeed.x = cx;
          vSeed.y = cy;
          let sum = 0;
          let minv = 255;
          let col = 0;
          for (let zz = 0; zz < TWO; zz++) {
            const zzOff = (zz + TWO) * this.m_xDim * this.m_yDim;
            for (let yy = -TWO; yy <= TWO; yy++) {
              const yyOff = (yy + cy) * this.m_xDim;
              for (let xx = -2; xx <= TWO; xx++) {
                let val = pixelsSrc[xx + cx + yyOff + zzOff];
                if (val < MIN_BLACK_BARRIER) {
                  sum = sum + val;
                  col++;
                  if (val < minv) {
                    minv = val;
                    vSeed.x = xx + cx;
                    vSeed.y = yy + cy;
                  }
                }
              } //for xx
            } //for yy
          } //for zz
          vSeed.z = Math.floor(sum / col);
          break;
        } // if 4 barriers
      } // for (cx)
    } // for (cy)
    if (!holeFound) {
      return 1;
    } else {
      return 0;
    }
  } //findSeedPointOnFirstSlice