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

Определение 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 матричного 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 вычисляется для каждого блока. Коэффициенты 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)