Блочное кодирование усечения ( BTC ) — это метод сжатия изображений с потерями для изображений в оттенках серого . Он делит исходные изображения на блоки, а затем использует квантователь, чтобы уменьшить количество уровней серого в каждом блоке, сохраняя при этом то же среднее значение и стандартное отклонение . Это ранний предшественник популярной аппаратной технологии DXTC , хотя метод сжатия BTC был впервые адаптирован для цвета задолго до DXTC с использованием очень похожего подхода, называемого сжатием цветовых ячеек . [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 соответственно. Последний расчет, который необходимо выполнить на стороне кодирования, — это установить матрицу для передачи в 1 и 0, чтобы каждый пиксель мог передаваться как один бит.
Теперь на стороне декодера все, что нам нужно сделать, это переназначить значения «a» и «b» пикселям 1 и 0. Это даст нам следующий блок:
Как можно видеть, блок был реконструирован с двумя значениями «a» и «b» как целыми числами (поскольку изображения не определены для хранения чисел с плавающей запятой). При проработке теории это хороший момент для расчета среднего и стандартного отклонения реконструированного блока. Они должны равняться исходному среднему значению и стандартному отклонению. Не забывайте использовать целые числа, иначе возникнет большая ошибка квантования, поскольку ранее мы квантовали все до целых чисел в кодировщике.