UNPKG

@zxing/library

Version:

TypeScript port of ZXing multi-format 1D/2D barcode image processing library.

55 lines (54 loc) 2.67 kB
import Binarizer from '../Binarizer'; import LuminanceSource from '../LuminanceSource'; import GlobalHistogramBinarizer from './GlobalHistogramBinarizer'; import BitMatrix from './BitMatrix'; /** * This class implements a local thresholding algorithm, which while slower than the * GlobalHistogramBinarizer, is fairly efficient for what it does. It is designed for * high frequency images of barcodes with black data on white backgrounds. For this application, * it does a much better job than a global blackpoint with severe shadows and gradients. * However it tends to produce artifacts on lower frequency images and is therefore not * a good general purpose binarizer for uses outside ZXing. * * This class extends GlobalHistogramBinarizer, using the older histogram approach for 1D readers, * and the newer local approach for 2D readers. 1D decoding using a per-row histogram is already * inherently local, and only fails for horizontal gradients. We can revisit that problem later, * but for now it was not a win to use local blocks for 1D. * * This Binarizer is the default for the unit tests and the recommended class for library users. * * @author dswitkin@google.com (Daniel Switkin) */ export default class HybridBinarizer extends GlobalHistogramBinarizer { private static BLOCK_SIZE_POWER; private static BLOCK_SIZE; private static BLOCK_SIZE_MASK; private static MINIMUM_DIMENSION; private static MIN_DYNAMIC_RANGE; private matrix; constructor(source: LuminanceSource); /** * Calculates the final BitMatrix once for all requests. This could be called once from the * constructor instead, but there are some advantages to doing it lazily, such as making * profiling easier, and not doing heavy lifting when callers don't expect it. */ getBlackMatrix(): BitMatrix; createBinarizer(source: LuminanceSource): Binarizer; /** * For each block in the image, calculate the average black point using a 5x5 grid * of the blocks around it. Also handles the corner cases (fractional blocks are computed based * on the last pixels in the row/column which are also used in the previous block). */ private static calculateThresholdForBlock; private static cap; /** * Applies a single threshold to a block of pixels. */ private static thresholdBlock; /** * Calculates a single black point for each block of pixels and saves it away. * See the following thread for a discussion of this algorithm: * http://groups.google.com/group/zxing/browse_thread/thread/d06efa2c35a7ddc0 */ private static calculateBlackPoints; }