Дискретное косинусное преобразование (DCT) представляет изображение как сумму синусоид различных величин и частот. dct2
функция вычисляет двумерное дискретное косинусное преобразование (DCT) изображения. DCT имеет свойство, что для типичного изображения большая часть визуально значительной информации об изображении сконцентрирована во всего нескольких коэффициентах DCT. Поэтому DCT часто используется в приложениях сжатия изображения. Например, DCT является в основе международного стандарта алгоритмом сжатия изображения с потерями, известным как JPEG. (Название происходит от рабочей группы, которая разработала стандарт: формат графических данных JPEG.)
Двумерный DCT матрицы M на n A
определяется следующим образом.
Значения Bpq называются коэффициентами DCT A
. (Обратите внимание на то, что матричные индексы в MATLAB® всегда запускаются в 1, а не 0; поэтому, элементы матрицы MATLAB A(1,1)
и B(1,1)
соответствуйте математическим количествам A00 и B00, соответственно.)
DCT является обратимым преобразованием, и его инверсией дают
Обратное уравнение DCT может быть интерпретировано как то, чтобы подразумевать что любая матрица M на n A
может быть записан как сумма функций MN формы
Эти функции вызваны основные функции DCT. Коэффициенты DCT Bpq, затем, может рассматриваться как веса, применились к каждой основной функции. Для 8 8 матриц эти 64 основных функции проиллюстрированы этим изображением.
64 основных функции 8 8 матрицы
Горизонтальные частоты увеличиваются слева направо, и увеличение частот кадровой развертки сверху донизу. Основная функция с постоянным знаком в верхнем левом углу часто называется основной функцией DC и соответствующим коэффициентом DCT, B00 часто называется коэффициентом DC.
Существует два способа вычислить DCT с помощью программного обеспечения Image Processing Toolbox™. Первый метод должен использовать dct2
функция. dct2
использует основанный на БПФ алгоритм в быстром расчете с большими входными параметрами. Второй метод должен использовать DCT, преобразовывают матрицу, которая возвращена функциональным dctmtx
и может быть более эффективным для входных параметров небольшого квадрата, такой как 8 8 или 16 16. M-by-M преобразовывают матричный T
дают
Для M-by-M матричного A
tA
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)