Acquisition & frame assembly
Live line reading with buffering, 2D frame assembly that respects scan direction, presampling to settle the detector, service-pixel trimming and a unique ID per scan.
We turn a detector's "raw" output into a meaningful image with material discrimination — from reading detector lines to a live colour picture on the operator's display. At its heart is multi-energy (dual energy) processing that tells organics, inorganics and metals apart.
A standard X-ray image only conveys how strongly radiation is attenuated, which makes it hard to separate a thick sheet of plastic from a thin piece of metal. The dual-energy technique (two-energy, and in its extended form multi-energy) measures attenuation across several energy bands at once, deriving a material's effective atomic number (Zeff) and density from how it reacts to "soft" versus "hard" radiation.
That makes it possible to sort materials into classes and tint them by colour (organic, inorganic, metal), detect threats and prohibited items more reliably, and improve recognition by exploiting several energy channels and scan angles. We deliver both the classic two-energy method and richer multi-energy schemes.
One pipeline from the detector line to the operator's screen — every stage tunable through swappable processing profiles.
Live line reading with buffering, 2D frame assembly that respects scan direction, presampling to settle the detector, service-pixel trimming and a unique ID per scan.
Offset (dark-current) and gain (sensitivity) calibration per energy channel and scan angle — on the detector (on-board) or in software (off-board), with coefficients written back to the detector.
Dynamic range management (DRM) with per-channel gamma, sharpening filters and an unsharp mask on the luminance channel, plus step-by-step brightness, contrast and gamma on hotkeys.
Colorization by effective atomic number (organic / inorganic / metal), 15+ colour modes, and material filters (stripping) to hide or accentuate classes of substance.
Hardware-accelerated display through modern OpenGL: zoom, pan, fit-to-window, one- or two-monitor layouts, and histograms for the energy and LAB channels.
Automatic scan storage with metadata in an image database, event/error logging and equipment telemetry, plus operator / administrator role separation.
A typical processing pipeline runs as follows:
Every stage is driven by processing profiles the operator can swap on the fly. Demanding operations are pushed onto separate threads and rendering is handed to the GPU — which keeps things real-time even when the conveyor runs fast.
Colorization in X-ray inspection is not "colouring to look pretty" — it shows the operator what each object is made of. Our own engine converts two "raw" energy channels into a colour image, where colour stands for material type and brightness stands for density and thickness. This depth of work is exactly where our expertise lies: most integrators treat colorization as a "black box", while we command it at the algorithm level.
The input is two values per pixel — high-energy (HE) and low-energy (LE). Their ratio is governed by the substance's effective atomic number (Zeff): light elements (organics) and heavy ones (metals) attenuate "soft" and "hard" radiation differently. The engine uses a two-dimensional classification table (LUT) 1024×1024 — a (LE, HE) pair addresses a cell that already holds the material class, so each pixel is classified in a single memory lookup. Materials fall into organics, inorganics and mixtures, metals and heavy materials, plus background/air and impenetrable zones (optionally marked in red).
In parallel a brightness channel conveys density and thickness through HE/LE fusion (weighted by penetration), eight tone curves (logarithmic, linear, exponential with saturation thresholds), absorption gamma in 51 steps (−25…+25), four penetration modes (Standard, High/Low Penetration, Slice) and dynamic brightness (Shadow). For speed these transforms are fused into one end-to-end LUT — a single pass over the image, which is what makes real-time operation possible.
Material class and brightness are merged and rendered through the chosen palette. The supported set (readily extensible):
| Mode | Purpose |
|---|---|
| Material Color (standard) | Classic security palette: orange — organics, green — mixtures, blue — metal/inorganics |
| Grey | Plain grayscale — maximum detail and penetration |
| Organic Single / Single+ (OS / OS+) | Highlights organics and suppresses the rest |
| Material / Inorganic Single (MS / MS+) | Highlights inorganics and metals |
| Zeff 7 / 8 / 9 | Palettes with different effective-atomic-number thresholds |
| Pseudo Color 1–6 | Pseudo-colour schemes that boost visual contrast |
| Liquid | Mode dedicated to liquid analysis |
The operator can "subtract" whole classes of material to concentrate on threats: all materials, organics only / inorganics only, or hide organics / hide inorganics — leaving only the class of interest against the background.
On top of colorization we apply edge enhancement (modified Laplacian) for crisp outlines, Super Enhance for local contrast, and Super Penetration for dark (dense) regions — reduced algorithmically to linear O(W·H) complexity.
The engine runs full-frame (for static scans and the archive) and in streaming (line-by-line) mode, where data is handled as columns arrive from the line-scan detector. Edge enhancement uses a sliding window of three columns with a one-column delay — roughly 1.7 ms at 600 columns/s, which is what gives a "live" image on the moving conveyor.
The colorization core is pure C++17 with no GUI dependency (Qt is not needed), so it embeds in both the desktop operator software and in server/sorting pipelines (see X-ray transmission sorting XRT). The output is a finished ARGB frame; the catalogue of colour modes grows without altering the calling code.
extern "C" ABI.Full source code, documentation and the rights to use and modify it — no lock-in to the contractor.
Calibration, palettes and processing profiles set up for your detector, generator and the substances you need to tell apart.
GPU-accelerated, line-by-line streaming that holds up at conveyor speed, ready for series operation.
Tell us which detector and generator you use and which materials you need to tell apart — we'll propose a processing pipeline and colorization modes suited to your task.