exponenta event banner

Дискретное косинусное преобразование

Определение DCT

Дискретное косинусное преобразование (ДКП) представляет изображение как сумму синусоид различных величин и частот. dct2 функция вычисляет двумерное дискретное косинусное преобразование (DCT) изображения. DCT обладает тем свойством, что для типичного изображения большая часть визуально значимой информации об изображении сосредоточена всего в нескольких коэффициентах DCT. По этой причине DCT часто используется в приложениях сжатия изображения. Например, DCT лежит в основе алгоритма сжатия изображений с потерями международного стандарта, известного как JPEG. (Название происходит от рабочей группы, которая разработала стандарт: Совместная группа фотографических экспертов.)

Двумерный DCT матрицы M-by-N A определяется следующим образом.

Bpq=αpαq∑m=0M−1∑n=0N−1Amncosπ (2 m + 1) p2Mcosπ (2n + 1) q2N,0≤p≤M−10≤q≤N−1αp={1/M,2/M,p=01≤p≤M−1αq={1/N,2/N,q=01≤q≤N−1

Значения Bpq называются коэффициентами DCT A. (Обратите внимание, что индексы матрицы в MATLAB ® всегда начинаются с 1, а не 0; следовательно, элементы матрицы MATLABA(1,1) и B(1,1) соответствуют математическим величинам A00 и B00 соответственно.)

DCT является обратимым преобразованием, и его обратное дано

Amn=∑p=0M−1∑q=0N−1αpαqBpqcosπ (2 m + 1) p2Mcosπ (2n + 1) q2N,0≤m≤M−10≤n≤N−1αp={1/M,2/M,p=01≤p≤M−1αq={1/N,2/N,q=01≤q≤N−1

Обратное уравнение ДКП можно интерпретировать как означающее, что любая матрица M-by-N A может быть записано как сумма MN функций вида

αpαqcospi (2 m + 1) p2Mcosπ (2n  +  1) q2N, 0≤p≤M−10≤q≤N−1

Эти функции называются базовыми функциями DCT. Тогда коэффициенты ДКП Bpq могут рассматриваться как веса, применяемые к каждой базисной функции. Для матриц 8 на 8 64 базисные функции иллюстрируются этим изображением.

64 базовые функции матрицы 8 на 8

Горизонтальные частоты увеличиваются слева направо, а вертикальные - сверху вниз. Базисную функцию с постоянным значением в левом верхнем углу часто называют базисной функцией DC, а соответствующий коэффициент DCT B00 часто называют коэффициентом DC.

Матрица преобразования DCT

Существует два способа вычисления DCT с помощью программного обеспечения Toolbox™ обработки изображений. Первый метод - использовать dct2 функция. dct2 использует алгоритм на основе БПФ для быстрого вычисления с большими входами. Второй метод заключается в использовании матрицы преобразования DCT, которая возвращается функцией dctmtx и может быть более эффективным для небольших квадратных входов, таких как 8 на 8 или 16 на 16. Матрица преобразования M-на-M T задается

Tpq = {1M2Mcosπ (2q + 1) p2Mp=0,1≤p≤M−1,0≤q≤M−10≤q≤M−1

Для матрицы M-by-M A, T*A - матрица M-by-M, столбцы которой содержат одномерный DCT столбцов A. Двухмерный DCT A может быть вычислено как B=T*A*T'. С тех пор T - вещественная ортонормированная матрица, её обратная такая же, как и её транспонирование. Следовательно, обратный двумерный DCT B задается T'*B*T.

Сжатие изображения с дискретным косинусным преобразованием

В этом примере показано, как сжать изображение с помощью дискретного косинусного преобразования (DCT). Пример вычисляет двухмерный DCT блоков 8 на 8 во входном изображении, сбрасывает (устанавливает в нуль) все, кроме 10, из 64 DCT коэффициентов в каждом блоке, а затем восстанавливает изображение, используя двумерный обратный DCT каждого блока. В примере используется метод вычисления матрицы преобразования.

DCT используется в алгоритме сжатия изображений JPEG. Входное изображение делится на блоки 8 на 8 или 16 на 16, и для каждого блока вычисляется двумерный DCT. Затем коэффициенты ДКП квантуются, кодируются и передаются. Приемник JPEG (или считыватель файлов JPEG) декодирует квантованные коэффициенты DCT, вычисляет обратное двумерное DCT каждого блока и затем складывает блоки обратно в единое изображение. Для типичных изображений многие из DCT коэффициентов имеют значения, близкие к нулю. Эти коэффициенты могут быть отброшены без серьезного влияния на качество реконструированного изображения.

Чтение изображения в рабочую область и преобразование его в класс double.

I = imread('cameraman.tif');
I = im2double(I);

Вычислите двумерный DCT блоков 8 на 8 в изображении. Функция dctmtx возвращает матрицу преобразования DCT N-на-N.

T = dctmtx(8);
dct = @(block_struct) T * block_struct.data * T';
B = blockproc(I,[8 8],dct);

Отбросить все, кроме 10, из 64 DCT коэффициентов в каждом блоке.

mask = [1   1   1   1   0   0   0   0
        1   1   1   0   0   0   0   0
        1   1   0   0   0   0   0   0
        1   0   0   0   0   0   0   0
        0   0   0   0   0   0   0   0
        0   0   0   0   0   0   0   0
        0   0   0   0   0   0   0   0
        0   0   0   0   0   0   0   0];
B2 = blockproc(B,[8 8],@(block_struct) mask .* block_struct.data);

Реконструируйте изображение, используя двумерную обратную DCT каждого блока.

invdct = @(block_struct) T' * block_struct.data * T;
I2 = blockproc(B2,[8 8],invdct);

Отображение исходного изображения и реконструированного изображения бок о бок. Хотя в реконструированном изображении есть некоторая потеря качества, оно четко распознается, даже несмотря на то, что почти 85% DCT коэффициентов были отброшены.

imshow(I)

Figure contains an axes. The axes contains an object of type image.

figure
imshow(I2)

Figure contains an axes. The axes contains an object of type image.