Дискретное косинусное преобразование (ДКП) представляет изображение как сумму синусоид различных величин и частот. dct2 функция вычисляет двумерное дискретное косинусное преобразование (DCT) изображения. DCT обладает тем свойством, что для типичного изображения большая часть визуально значимой информации об изображении сосредоточена всего в нескольких коэффициентах DCT. По этой причине DCT часто используется в приложениях сжатия изображения. Например, DCT лежит в основе алгоритма сжатия изображений с потерями международного стандарта, известного как JPEG. (Название происходит от рабочей группы, которая разработала стандарт: Совместная группа фотографических экспертов.)
Двумерный DCT матрицы M-by-N A определяется следующим образом.
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 является обратимым преобразованием, и его обратное дано
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 функций вида
0≤p≤M−10≤q≤N−1
Эти функции называются базовыми функциями DCT. Тогда коэффициенты ДКП Bpq могут рассматриваться как веса, применяемые к каждой базисной функции. Для матриц 8 на 8 64 базисные функции иллюстрируются этим изображением.
64 базовые функции матрицы 8 на 8

Горизонтальные частоты увеличиваются слева направо, а вертикальные - сверху вниз. Базисную функцию с постоянным значением в левом верхнем углу часто называют базисной функцией DC, а соответствующий коэффициент DCT B00 часто называют коэффициентом DC.
Существует два способа вычисления DCT с помощью программного обеспечения Toolbox™ обработки изображений. Первый метод - использовать dct2 функция. dct2 использует алгоритм на основе БПФ для быстрого вычисления с большими входами. Второй метод заключается в использовании матрицы преобразования DCT, которая возвращается функцией dctmtx и может быть более эффективным для небольших квадратных входов, таких как 8 на 8 или 16 на 16. Матрица преобразования M-на-M T задается
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 imshow(I2)
