게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
MATLAB의 ifft, ifftshift에 대한 질문입니다
게시물ID : programmer_3156짧은주소 복사하기
작성자 : 글쓴이?
추천 : 0
조회수 : 6338회
댓글수 : 2개
등록시간 : 2014/05/09 15:17:42
안녕하세요
평범한 공대생이고 영상처리 수업을 듣고 있습니다.
과제를 하던중 신기한(?)점을 발견해서 여쭙니다.

과제는 간단했습니다. MATLAB에서,
이미지를 불러들여서 푸리에변환을 한 뒤, 주파수대역에서 LPF를 통과시키고
그를 다시 역변환해서 이미지가 blur되는 현상을 확인하는 과제였습니다.


저는 JPG 이미지를 불러들여서 fftn함수를 사용해 변환했습니다.
JPG가 3차원(R,G,B) 데이터이기 때문에 fftn함수를 사용했습니다.
R,G,B 각각 성분에 대해 2차원 fft를 한 셈입니다.

그래서 그 변환된 데이터를 제가 만든 필터와 곱한 후 
다시 ifftn을 했습니다.
결과는 별다른 문제 없이 잘 나왔습니다.


그런데 제가 fftn을 한 뒤 그 결과를 출력하려고 fftshift함수를 사용했습니다.
이때 단순히 2차원에서 shift되는 것이 아니라
RGB끼리도 shift가 되었습니다.
한칸씩 밀려서 R->G, G->B, B->R로 값들이 이동되었던 것입니다.


그런데 shift한 결과를 다시 ifftn을 했는데도 왜 원본의 색깔이 그대로 복원이 되었을까요?(blur는 일어났습니다)
저는 저 나름대로 '아, ifftn함수가 애초에 shift된 값이 들어온다고 가정하나보다'라고 생각했습니다..........그런데

그런데 그것도 아니었습니다.
shift된, RGB가 한칸씩 밀린 데이터를 ifftshift함수를 통해 다시 원상태로 돌려놓은 다음
ifftn을 사용하니.....또 원본 색상이 제대로 복원되었습니다.


아래는 소스코드입니다.

=================================================================================

% 원본 불러오기
original = double(imread('suzi.jpg'));

% n차원 FFT
or_fft = fftn(original);

% 이미지 보정용 계수
p = 300;

% 주파수대역 이미지 보정 후 출력
or_fft_abs = abs(or_fft);
or_max = max(max(or_fft_abs));
or_fft_n(:,:,1) = or_fft_abs(:,:,1) ./ or_max(1) .* p;
or_fft_n(:,:,2) = or_fft_abs(:,:,2) ./ or_max(2) .* p;
or_fft_n(:,:,3) = or_fft_abs(:,:,3) ./ or_max(3) .* p;
or_fft_s = fftshift(or_fft_n);

% figure;
% imshow([or_fft_n(:,:,1),or_fft_n(:,:,2),or_fft_n(:,:,3)]);
figure;
imshow([or_fft_s(:,:,2),or_fft_s(:,:,3),or_fft_s(:,:,1)]);

% 주파수 대역 크기 저장
[M,N,O] = size(or_fft);

% 크기별 필터 생성(에너지 절반되는 필터)
fil3 = zeros(M,N,3);
fil3(321:480,241:360,1:3) = ones(160,120,3);

% 필터를 곱함
or_fil3 = fil3 .* fftshift(or_fft);

% 곱한 결과를 보정해 이미지 출력
or_fil3_n(:,:,1) = or_fil3(:,:,1) .* p ./ or_max(:,:,1);
or_fil3_n(:,:,2) = or_fil3(:,:,2) .* p ./ or_max(:,:,2);
or_fil3_n(:,:,3) = or_fil3(:,:,3) .* p ./ or_max(:,:,3);

% 곱한 결과를 IFFT를 통해 공간대역으로 다시 변환 후 출력
or_fil3_space1 = abs(ifftn(ifftshift(or_fil3)));
or_fil3_space2 = abs(ifftn((or_fil3)));

figure;
imshow(uint8([or_fil3_space1,or_fil3_space2]));

================================================================================

suzi_ifft.png
위는 결과 사진입니다.

빨간 부분을 보시면 똑같은 데이터를 ifftshift를 하고 ifftn을 한것과
ifftshift를 안하고 ifftn을 한것을 모두 계산하는 부분입니다.
사진처럼 완전히 똑같은 값이 나옵니다...

왜이럴까요?
분명히 둘 중 하나는 색깔이 이상하게 나와야 되는것 아닌가요?
(그러고 보니 필터를 통과하면 전체 에너지가 줄어드니까 전체적으로 어둡게 나와야되는것 같은데 그런 일도 안생기네요.....ㅠㅠ하지만 이건 일단 제껴두고)
제가 어디서 잘못 생각하고 있는 것인가요?

제가 뼈속까지 공대생이라 말솜씨가 없어 이해가 잘 안되실지도 모릅니다ㅠㅠ
이해가 안가신다면 댓글로 물어보시면 답해드리겠습니다.ㅠㅠ
제발 한수 가르쳐주십시요(--)(__)꾸벅
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호