/*! * quadtreeGetChildren() * * Input: fpixa (mean, variance or root variance) * level, x, y (of current pixel) * &val00, val01, val10, val11 (<return> child pixel values) * Return: 0 if OK, 1 on error * * Notes: * (1) Check return value for error. On error, all return vals are 0.0. * (2) The returned child pixels are located at: * level + 1 * (2x, 2y), (2x+1, 2y), (2x, 2y+1), (2x+1, 2y+1) */ l_int32 quadtreeGetChildren(FPIXA *fpixa, l_int32 level, l_int32 x, l_int32 y, l_float32 *pval00, l_float32 *pval10, l_float32 *pval01, l_float32 *pval11) { l_int32 n; PROCNAME("quadtreeGetChildren"); if (!pval00 || !pval01 || !pval10 || !pval11) return ERROR_INT("&val* not all defined", procName, 1); *pval00 = *pval10 = *pval01 = *pval11 = 0.0; if (!fpixa) return ERROR_INT("fpixa not defined", procName, 1); n = fpixaGetCount(fpixa); if (level < 0 || level >= n - 1) return ERROR_INT("invalid level", procName, 1); if (fpixaGetPixel(fpixa, level + 1, 2 * x, 2 * y, pval00) != 0) return ERROR_INT("invalid coordinates", procName, 1); fpixaGetPixel(fpixa, level + 1, 2 * x + 1, 2 * y, pval10); fpixaGetPixel(fpixa, level + 1, 2 * x, 2 * y + 1, pval01); fpixaGetPixel(fpixa, level + 1, 2 * x + 1, 2 * y + 1, pval11); return 0; }
/*! * \brief fpixaDisplayQuadtree() * * \param[in] fpixa mean, variance or root variance * \param[in] factor replication factor at lowest level * \param[in] fontsize 4, ... 20 * \return pixd 8 bpp, mosaic of quadtree images, or NULL on error * * <pre> * Notes: * (1) The mean and root variance fall naturally in the 8 bpp range, * but the variance is typically outside the range. This * function displays 8 bpp pix clipped to 255, so the image * pixels will mostly be 255 (white). * </pre> */ PIX * fpixaDisplayQuadtree(FPIXA *fpixa, l_int32 factor, l_int32 fontsize) { char buf[256]; l_int32 nlevels, i, mag, w; L_BMF *bmf; FPIX *fpix; PIX *pixt1, *pixt2, *pixt3, *pixt4, *pixd; PIXA *pixat; PROCNAME("fpixaDisplayQuadtree"); if (!fpixa) return (PIX *)ERROR_PTR("fpixa not defined", procName, NULL); if ((nlevels = fpixaGetCount(fpixa)) == 0) return (PIX *)ERROR_PTR("pixas empty", procName, NULL); if ((bmf = bmfCreate(NULL, fontsize)) == NULL) L_ERROR("bmf not made; text will not be added", procName); pixat = pixaCreate(nlevels); for (i = 0; i < nlevels; i++) { fpix = fpixaGetFPix(fpixa, i, L_CLONE); pixt1 = fpixConvertToPix(fpix, 8, L_CLIP_TO_ZERO, 0); mag = factor * (1 << (nlevels - i - 1)); pixt2 = pixExpandReplicate(pixt1, mag); pixt3 = pixConvertTo32(pixt2); snprintf(buf, sizeof(buf), "Level %d\n", i); pixt4 = pixAddSingleTextblock(pixt3, bmf, buf, 0xff000000, L_ADD_BELOW, NULL); pixaAddPix(pixat, pixt4, L_INSERT); fpixDestroy(&fpix); pixDestroy(&pixt1); pixDestroy(&pixt2); pixDestroy(&pixt3); } w = pixGetWidth(pixt4); pixd = pixaDisplayTiledInRows(pixat, 32, nlevels * (w + 80), 1.0, 0, 30, 2); pixaDestroy(&pixat); bmfDestroy(&bmf); return pixd; }
/*! * quadtreeGetParent() * * Input: fpixa (mean, variance or root variance) * level, x, y (of current pixel) * &val (<return> parent pixel value), or 0.0 on error. * Return: 0 if OK, 1 on error * * Notes: * (1) Check return value for error. On error, val is returned as 0.0. * (2) The parent is located at: * level - 1 * (x/2, y/2) */ l_int32 quadtreeGetParent(FPIXA *fpixa, l_int32 level, l_int32 x, l_int32 y, l_float32 *pval) { l_int32 n; PROCNAME("quadtreeGetParent"); if (!pval) return ERROR_INT("&val not defined", procName, 1); *pval = 0.0; if (!fpixa) return ERROR_INT("fpixa not defined", procName, 1); n = fpixaGetCount(fpixa); if (level < 1 || level >= n) return ERROR_INT("invalid level", procName, 1); if (fpixaGetPixel(fpixa, level - 1, x / 2, y / 2, pval) != 0) return ERROR_INT("invalid coordinates", procName, 1); return 0; }