이페이지의최신내용은아직번역되지않았습니다。최신내용은영문으로볼수있습니다。

이산코사인변환

DCT정의

이산코사인변환(DCT)은영상을다양한크기및주파수를갖는정현파의합으로표현합니다。DCT2함수는영상의2차원이산코사인변환(DCT)을계산합니다。일반적인영상에DCT를적용하는경우를보면시각적으로의미있는영상정보의대부분이단몇개의DCT계수에집중된다는특징이있습니다。이러한이유로영상압축응용분야에서는DCT를자주사용합니다。예를들어,JPEG라는국제표준손실영상압축알고리즘의중심에는DCT가있습니다。(JPEG는이표준을개발한단체인联合图像专家组의줄임말로만든이름입니다。)

M×N的행렬一个의2차원DCT는다음과같이정의됩니다。

p q = α p α q Σ = 0 中号 - 1 Σ ñ = 0 ñ - 1 一个 ñ COS π 2 + 1 p 2 中号 COS π 2 ñ + 1 q 2 ñ 0 p 中号 - 1 0 q ñ - 1 α p = { 1 / 中号 2 / 中号 p = 0 1 p 中号 - 1 α q = { 1 / ñ 2 / ñ q = 0 1 q ñ - 1

PQ一个DCT계수입니다。(MATLAB®의행렬인덱스는항상0이아닌1에서시작하므로MATLAB행렬요소A(1,1)B(1,1)은각각수학적수량一个0000에대응됩니다。)

DCT는가역변환이며,역변환은다음과같이표현됩니다。

一个 ñ = Σ p = 0 中号 - 1 Σ q = 0 ñ - 1 α p α q p q COS π 2 + 1 p 2 中号 COS π 2 ñ + 1 q 2 ñ 0 中号 - 1 0 ñ ñ - 1 α p = { 1 / 中号 2 / 中号 p = 0 1 p 中号 - 1 α q = { 1 / ñ 2 / ñ q = 0 1 q ñ - 1

역DCT방정식은임의의M×N的행렬一个가다음과같은형태를갖는MN함수의합으로표현될수있음을의미하는것으로해석될수있습니다。

α p α q COS π 2 + 1 p 2 中号 COS π 2 ñ + 1 q 2 ñ 0 p 中号 - 1 0 q ñ - 1

이러한함수를DCT의기저함수라고합니다。DCT계수PQ는각기저함수에적용되는가중치라고생각할수있습니다。다음그림은8×8행렬에대한64개의기저함수를보여줍니다。

8×8행렬에대한64개의기저함수

가로주파수는왼쪽에서오른쪽으로증가하고,세로주파수는위에서아래로증가합니다。왼쪽상단에있는상수값기저함수를DC기저함수라하며,이에대응하는DCT계수00DC계수라고합니다。

DCT변환행렬

图像处理工具箱™를사용하여DCT를계산하는방법에는두가지가있습니다。첫번째방법은DCT2함수를사용하는것입니다。DCT2는입력값이클때빠르게계산하기위해FFT기반알고리즘을사용합니다。두번째방법은DCT변환행렬을사용하는것입니다。DCT변환행렬은함수dctmtx에서반환하며,8×,16×16과같이작은정사각입력값의경우더효율적일수있습니다。为M×M변환행렬Ť는다음과같이표현됩니다。

Ť p q = { 1 中号 2 中号 COS π 2 q + 1 p 2 中号 p = 0 1 p 中号 - 1 0 q 中号 - 1 0 q 中号 - 1

为M×M행렬一个에서T *一는각열이一个열의1차원DCT를포함하는为M×M행렬입니다。一个의2차원DCT는B = T * A * T”로계산할수있습니다。Ť는실수정규직교행렬이므로그역은전치와같습니다。따라서의2차원역DCT는T'* B * T로표현됩니다。

이산코사인변환을사용한영상압축

이예제에서는이산코사인변환(DCT)을사용하여영상을압축하는방법을보여줍니다。이예제에서는입력영상에서8×8블록의2차원DCT를계산하고,각블록에서64개의DCT계수중10개만남기고모두버린다음(0으로설정),각블록의2차원역DCT를사용하여영상을복원합니다。이예제에서는변환행렬계산방법을사용합니다。

DCT는JPEG영상압축알고리즘에서사용됩니다。입력영상을8×8 16×16또는블록으로나눈후에각블록에대해2차원DCT를계산합니다。그런다음DCT계수를양자화하고부호화하여전달합니다。JPEG수신기(또는JPEG파일판독기)는양자화된DCT계수를복호화하고,각블록의역2차원DCT를계산한다음,이블록들을다시합쳐하나의영상으로만듭니다。일반적인영상은대부분의DCT계수가0에가까운값을갖습니다。이러한계수는버려도복원된영상의품질에심각한영향을주지않습니다。

영상을작업공간으로읽어들인후형클래스로변환합니다。

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

영상에서8×8블록단위로2차원DCT를계산합니다。함수dctmtx에서N×N的DCT변환행렬을반환합니다。

T = dctmtx(8);DCT = @(block_struct)T * block_struct.data * T';B = blockproc(I,[8 8],DCT);

각블록에서64개의DCT계수중10개만남기고모두버립니다。

掩模= [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 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0];B2 = blockproc(B,[8 8],@(block_struct)掩模* block_struct.data。);

각블록의2차원역DCT를사용하여영상을복원합니다。

invdct = @(block_struct)T” * block_struct.data * T;I2 = blockproc(B2,[8 8],invdct);

원본영상과복원영상을나란히표시합니다。복원된영상에서어느정도의품질저하가발생하긴​​하지만DCT계수의85%정도를버렸음에도불구하고영상을분명히알아볼수있습니다。

imshow(I)

图imshow(I 2)