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

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

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

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

Bpq=αpαqm=0M1n=0N1Amnпотому чтоπ(2m+1)p2Mпотому чтоπ(2n+1)q2N,0pM10qN1αp={1/M,2/M,p=01pM1αq={1/N,2/N,q=01qN1

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

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

Amn=p=0M1q=0N1αpαqBpqпотому чтоπ(2m+1)p2Mпотому чтоπ(2n+1)q2N,0mM10nN1αp={1/M,2/M,p=01pM1αq={1/N,2/N,q=01qN1

Обратное уравнение DCT может быть интерпретировано как то, чтобы подразумевать что любая матрица M на n A может быть записан как сумма функций MN формы

αpαqпотому чтоπ(2m+1)p2Mпотому чтоπ(2n+1)q2N,   0pM10qN1

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

64 основных функции 8 8 матрицы

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

DCT преобразовывает матрицу

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

Tpq={1M2Mпотому чтоπ(2q+1)p2Mp=0,1pM1,0qM10qM1

Для M-by-M матричного AtA 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 вычисляется для каждого блока. Коэффициенты DCT затем квантованы, закодированы и переданы. Получатель JPEG (или средство чтения файлов JPEG) декодирует квантованные коэффициенты DCT, вычисляет обратный двумерный DCT каждого блока, и затем соединяет блоки назад в одно изображение. Для типичных изображений многие коэффициенты DCT имеют значения близко к нулю. Эти коэффициенты могут быть отброшены, серьезно не влияя на качество восстановленного изображения.

Считайте изображение в рабочую область и преобразуйте ее, чтобы классифицировать double.

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

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

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)