Everybody today is familiar with the representation of a picture, as a two-dimensional array of discrete values. 3RGB achieves *some compression* by adding recursively higher orders of granularity, where groups of pixels are summarised by their range, as a pair of values that represent the minimal value of pixel(s) in the group, as well as the largest value (relative to the minimum value).

The whole picture, made of discrete and inherently bounded values (usually from 0 to 255), is condensed in several step down to a pair of {min, amplitude} values. This is a significant departure from the classic frequency analysis transforms (DCT, wavelets...) where the "root value" is usually a single DC component.

Compression is possible because the amplitude is related to the minimum through the inherent boundaries of the input sample: **minimum + amplitude**** ≤**** max.bound**

In other words, **amplitude ≤ max.bound**** - minimum**

Given these two informations about a block of samples, each sample can be represented with less bits, for example with a bitstream of truncated binary codes (also called *phase-i* or *economy code*) or with 3R (which has the added advantage of also compacting closely related value tighter).

Once the decoder receives the "root" pair {min,amp}, it can decode a first block that contain the array for the first/highest level of min values. This array can be encoded as a simple concatenation of phase-in codes or with 3R for better compaction. At the same time, the first decode stage can generate the boundaries for the following array of amplitudes. Each individual min value will implicitly limit the range of the respective amplitude.

At the lowest level, each picture tile will have its minimum and amplitude values provided by the next higher level of arrays, and only an array of amplitudes is encoded. The only special case concerns the delta pictures: the amplitude of the tile is multiplied by 2 (unless it's 0, which means "*nothing to encode here, just fill the tile with a constant color*") and the LSB is a flag that selects between absolute or relative coding (the values are relative to the precedent value of the tile).

## Discussions

## Become a Hackaday.io Member

Create an account to leave a comment. Already have an account? Log In.