MATLAB 2D 역 코사인 변환(IDCT): 주파수 데이터에서 이미지 복원하기
역 코사인 변환(Inverse Cosine Transform, ICT 또는 IDCT)은 코사인 변환의 역연산입니다. 신호 및 이미지 처리에서 주파수 영역 표현으로부터 신호나 이미지를 재구성하는 데 특히 유용합니다.
2D 신호나 이미지 맥락에서 2D 역 코사인 변환(2D IDCT)은 코사인 계수 행렬(신호/이미지의 주파수 성분 표현)을 공간 영역으로 변환해 원래 신호나 이미지를 복원합니다.
MATLAB에서 2D 역 코사인 변환은 코사인 값 행렬을 공간 영역 이미지로 변환하는 데 사용됩니다. 2D 코사인 변환의 역연산으로 이미지 처리와 압축에 흔히 쓰입니다. `idct2` 함수가 이 연산을 수행합니다.
2D 역 이산 코사인 변환
MATLAB에서 `idct2` 함수는 2D 역 코사인 변환을 수행합니다. 코사인 계수 행렬을 입력받아 신호나 이미지의 공간 영역 표현을 반환합니다. 결과는 표시하거나 추가 처리할 수 있는 재구성된 이미지입니다.
역 코사인 변환은 이미지 압축(JPEG 등), 이미지 재구성, 주파수 영역 조작 후 원래 형태로 복원해야 하는 신호 처리 작업에서 중요합니다.
문법
B = idct2(A)
B = idct2(A,m,n)
B = idct2(A,[m n])
문법 설명
- B = idct2(A) — 행렬 A의 2D 역 이산 코사인 변환 계산, 결과를 행렬 B에 반환. A의 주파수 영역 표현으로부터 공간 영역 이미지 재구성
- B = idct2(A, m,n) — A의 2D IDCT 계산 후 출력 행렬 B 크기를 m×n으로 지정. 지정된 차원으로 공간 영역 이미지 재구성
- B = idct2(A, [m,n]) — A의 2D IDCT 계산 후 출력 행렬 B를 m행 n열로 리사이즈. 지정된 차원으로 공간 영역 이미지 재구성
예제 1: idct2()로 이미지 고주파 제거(로우패스 필터링)
img = imread('autumn.tif');
% 그레이스케일 변환
if size(img, 3) == 3
img = rgb2gray(img);
end
% 2D DCT 계산
dct_img = dct2(double(img));
% 고주파 제거: 처음 50개 계수만 유지
threshold = 50;
dct_img_thresh = dct_img;
dct_img_thresh(threshold+1:end, :) = 0;
dct_img_thresh(:, threshold+1:end) = 0;
% 역 2D DCT로 필터링된 이미지 복원
filtered_img = uint8(idct2(dct_img_thresh));
% 원본과 필터링 이미지 표시
figure;
subplot(1, 2, 1); imshow(img); title('Original Image');
subplot(1, 2, 2); imshow(filtered_img); title('Filtered Image');
설명: `imread`로 이미지 읽기 → 그레이스케일 변환 → `dct2`로 주파수 영역 변환 → 임계값(50) 이상 고주파 계수 0으로 설정 → `idct2`로 공간 영역 복원 → 결과 비교 표시
예제 2: B = idct2(A, m,n)으로 이미지 리사이징
img = imread('autumn.tif');
if size(img, 3) == 3
img = rgb2gray(img);
end
dct_img = dct2(double(img));
% DCT 계수 행렬을 절반 크기로 리사이즈
new_size = size(img) / 2;
dct_resized = imresize(dct_img, new_size);
% 역 2D DCT로 리사이즈된 이미지 복원 (원본 크기로)
resized_img = uint8(idct2(dct_resized, size(img, 1), size(img, 2)));
subplot(1, 2, 1); imshow(img); title('Original Image');
subplot(1, 2, 2); imshow(resized_img); title('Resized Image using 2-D IDCT');
설명: DCT 계수 행렬을 주파수 영역에서 리사이즈한 뒤 `idct2`로 공간 영역 복원. 출력 크기(m,n)를 원본 크기로 지정해 업샘플링 효과
예제 3: 2D IDCT로 행렬 리사이징 (3×2로 변경)
% 4×4 샘플 행렬 A 생성
A = [10, 20, 30, 40; 50, 60, 70, 80; 90, 100, 110, 120; 130, 140, 150, 160];
disp('Original Matrix A:'); disp(A);
% 2D IDCT 적용 후 3×2로 리사이즈
B = idct2(A, [3, 2]);
disp('Resized Matrix B (3x2):'); disp(B);
출력:
Original Matrix A:
10 20 30 40
50 60 70 80
90 100 110 120
130 140 150 160
Resized Matrix B (3x2):
122.0957 -11.9692
-97.4491 1.6910
12.0957 -1.9692