Дискретное косинусное преобразование (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
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)