Кодирование с блочным усечением ( BTC ) — это тип метода сжатия изображений с потерями для изображений в оттенках серого . Он делит исходные изображения на блоки, а затем использует квантизатор для уменьшения количества уровней серого в каждом блоке, сохраняя при этом то же среднее значение и стандартное отклонение . Это ранний предшественник популярной аппаратной техники DXTC , хотя метод сжатия BTC был впервые адаптирован для цвета задолго до DXTC с использованием очень похожего подхода, называемого Color Cell Compression . [1] BTC также был адаптирован для сжатия видео. [2]
BTC был впервые предложен профессорами Митчеллом и Делпом в Университете Пердью. [3] Другой вариант BTC — это кодирование с усечением блока абсолютного момента или AMBTC , в котором вместо использования стандартного отклонения сохраняется первый абсолютный момент вместе со средним значением. AMBTC вычислительно проще, чем BTC, и также обычно приводит к более низкой средней квадратичной ошибке (MSE). AMBTC был предложен Максимо Лемой и Робертом Митчеллом. [4]
Использование подблоков размером 4×4 пикселя дает коэффициент сжатия 4:1, предполагая, что во время передачи или хранения используются 8-битные целые значения. Более крупные блоки обеспечивают большее сжатие (значения «a» и «b» распределены по большему количеству пикселей), однако качество также снижается с увеличением размера блока из-за природы алгоритма.
Алгоритм BTC использовался для сжатия изображений марсохода Mars Pathfinder . [5]
Пиксельное изображение делится на блоки, как правило, размером 4×4 пикселя. Для каждого блока вычисляются среднее значение и стандартное отклонение значений пикселей; эти статистические данные обычно меняются от блока к блоку. Значения пикселей, выбранные для каждого восстановленного или нового блока, выбираются таким образом, чтобы каждый блок сжатого изображения BTC имел (приблизительно) то же среднее значение и стандартное отклонение, что и соответствующий блок исходного изображения. Двухуровневое квантование на блоке — это то, где мы получаем сжатие, и выполняется следующим образом:
Вот элементы пикселей исходного блока, а — элементы сжатого блока. На словах это можно объяснить так: если значение пикселя больше среднего, то ему присваивается значение «1», в противном случае — «0». Значения, равные среднему, могут иметь значение «1» или «0» в зависимости от предпочтений человека или организации, реализующей алгоритм.
Этот 16-битный блок хранится или передается вместе со значениями среднего и стандартного отклонения. Реконструкция выполняется с двумя значениями "a" и "b", которые сохраняют среднее и стандартное отклонение. Значения "a" и "b" можно вычислить следующим образом:
Где — стандартное отклонение, m — общее количество пикселей в блоке, а q — количество пикселей, превышающих среднее значение ( )
Чтобы восстановить изображение или создать его приближение, элементы, которым присвоено значение 0, заменяются значением «a», а элементы, которым присвоено значение 1, заменяются значением «b».
Это показывает, что алгоритм асимметричен в том смысле, что кодеру приходится делать гораздо больше работы, чем декодеру. Это происходит потому, что декодер просто заменяет 1 и 0 на оценочное значение, тогда как кодеру также требуется вычислить среднее значение, стандартное отклонение и два значения для использования. [6]
Возьмите блок 4×4 из изображения, в данном случае тестового изображения горы: [7]
Как и любой небольшой блок изображения, с этим кажется довольно скучным работать, поскольку все числа довольно похожи, такова природа сжатия с потерями и то, как оно может так хорошо работать с изображениями. Теперь нам нужно вычислить два значения из этих данных, то есть среднее значение и стандартное отклонение. Среднее значение можно вычислить как 241,875, это простой расчет, который не требует дополнительных пояснений. Стандартное отклонение легко вычисляется как 4,36. Из этого значения «a» и «b» можно вычислить с помощью предыдущих уравнений. Они получаются 236,935 и 245,718 соответственно. Последнее вычисление, которое необходимо выполнить на стороне кодирования, — это настроить матрицу на передачу единиц и нулей, чтобы каждый пиксель мог передаваться как один бит.
Теперь на стороне декодера нам нужно только переназначить значения «a» и «b» пикселям 1 и 0. Это даст нам следующий блок:
Как можно видеть, блок был реконструирован с двумя значениями "a" и "b" как целыми числами (потому что изображения не определены для хранения чисел с плавающей точкой). При работе с теорией это хорошая точка для вычисления среднего значения и стандартного отклонения реконструированного блока. Они должны быть равны исходному среднему значению и стандартному отклонению. Не забудьте использовать целые числа, иначе возникнет большая ошибка квантования, поскольку ранее мы квантовали все до целых чисел в кодере.