안녕하세요 <div>평범한 공대생이고 영상처리 수업을 듣고 있습니다.</div> <div>과제를 하던중 신기한(?)점을 발견해서 여쭙니다.</div> <div><br /></div> <div>과제는 간단했습니다. MATLAB에서,</div> <div>이미지를 불러들여서 푸리에변환을 한 뒤, 주파수대역에서 LPF를 통과시키고</div> <div>그를 다시 역변환해서 이미지가 blur되는 현상을 확인하는 과제였습니다.</div> <div><br /></div> <div><br /></div> <div>저는 JPG 이미지를 불러들여서 fftn함수를 사용해 변환했습니다.</div> <div><span style="font-size: 9pt; line-height: 1.5">JPG가 3차원(R,G,B) 데이터이기 때문에 fftn함수를 사용했습니다.</span></div> <div>R,G,B 각각 성분에 대해 2차원 fft를 한 셈입니다.</div> <div><br /></div> <div>그래서 그 변환된 데이터를 제가 만든 필터와 곱한 후 </div> <div>다시 ifftn을 했습니다.</div> <div>결과는 별다른 문제 없이 잘 나왔습니다.</div> <div><br /></div> <div><br /></div> <div>그런데 제가 fftn을 한 뒤 그 결과를 출력하려고 fftshift함수를 사용했습니다.</div> <div>이때 단순히 2차원에서 shift되는 것이 아니라</div> <div>RGB끼리도 shift가 되었습니다.</div> <div>한칸씩 밀려서 R->G, G->B, B->R로 값들이 이동되었던 것입니다.</div> <div><br /></div> <div><br /></div> <div>그런데 shift한 결과를 다시 ifftn을 했는데도 왜 원본의 색깔이 그대로 복원이 되었을까요?(blur는 일어났습니다)</div> <div>저는 저 나름대로 '아, ifftn함수가 애초에 shift된 값이 들어온다고 가정하나보다'라고 생각했습니다..........그런데</div> <div><br /></div> <div>그런데 그것도 아니었습니다.</div> <div>shift된, RGB가 한칸씩 밀린 데이터를 ifftshift함수를 통해 다시 원상태로 돌려놓은 다음</div> <div>ifftn을 사용하니.....또 원본 색상이 제대로 복원되었습니다.</div> <div><br /></div> <div><br /></div> <div>아래는 소스코드입니다.</div> <div><br /></div> <div>=================================================================================</div> <div><span style="font-size: 9pt; line-height: 1.5"><br /></span></div> <div><span style="font-size: 9pt; line-height: 1.5">% 원본 불러오기</span></div> <div><div>original = double(imread('suzi.jpg'));</div> <div><br /></div> <div>% n차원 FFT</div> <div>or_fft = fftn(original);</div> <div><br /></div> <div>% 이미지 보정용 계수</div> <div>p = 300;</div> <div><br /></div> <div>% 주파수대역 이미지 보정 후 출력</div> <div>or_fft_abs = abs(or_fft);</div> <div>or_max = max(max(or_fft_abs));</div> <div>or_fft_n(:,:,1) = or_fft_abs(:,:,1) ./ or_max(1) .* p;</div> <div>or_fft_n(:,:,2) = or_fft_abs(:,:,2) ./ or_max(2) .* p;</div> <div>or_fft_n(:,:,3) = or_fft_abs(:,:,3) ./ or_max(3) .* p;</div> <div>or_fft_s = fftshift(or_fft_n);</div> <div><br /></div> <div>% figure;</div> <div>% imshow([or_fft_n(:,:,1),or_fft_n(:,:,2),or_fft_n(:,:,3)]);</div> <div>figure;</div> <div>imshow([or_fft_s(:,:,2),or_fft_s(:,:,3),or_fft_s(:,:,1)]);</div> <div><br /></div> <div>% 주파수 대역 크기 저장</div> <div>[M,N,O] = size(or_fft);</div> <div><br /></div> <div>% 크기별 필터 생성(에너지 절반되는 필터)<br /></div> <div>fil3 = zeros(M,N,3);</div> <div>fil3(321:480,241:360,1:3) = ones(160,120,3);</div> <div><span style="font-size: 9pt; line-height: 1.5"><br /></span></div> <div><span style="font-size: 9pt; line-height: 1.5">% 필터를 곱함</span></div> <div>or_fil3 = fil3 .* fftshift(or_fft);</div> <div><br /></div> <div>% 곱한 결과를 보정해 이미지 출력</div> <div><span style="font-size: 9pt; line-height: 1.5">or_fil3_n(:,:,1) = or_fil3(:,:,1) .* p ./ or_max(:,:,1);</span></div> <div>or_fil3_n(:,:,2) = or_fil3(:,:,2) .* p ./ or_max(:,:,2);</div> <div>or_fil3_n(:,:,3) = or_fil3(:,:,3) .* p ./ or_max(:,:,3);</div> <div><br /></div> <div>% 곱한 결과를 IFFT를 통해 공간대역으로 다시 변환 후 출력</div> <div><b><font size="4" color="#ff0000">or_fil3_space1 = abs(ifftn(ifftshift(or_fil3)));</font></b></div> <div><b><font size="4" color="#ff0000">or_fil3_space2 = abs(ifftn((or_fil3)));</font></b></div> <div><br /></div> <div>figure;</div> <div>imshow(uint8([or_fil3_space1,or_fil3_space2]));</div></div> <div><br /></div> <div>================================================================================</div> <div><br /></div> <div><div style="text-align: left"><img src="http://thimg.todayhumor.co.kr/upfile/201405/1399616002i9YbAMppxpQ6JKihNS.png" width="800" height="515" alt="suzi_ifft.png" id="image_07134805594105273" class="chimg_photo" style="border: none" /></div>위는 결과 사진입니다.</div> <div><br /></div> <div><div>빨간 부분을 보시면 똑같은 데이터를 ifftshift를 하고 ifftn을 한것과</div> <div>ifftshift를 안하고 ifftn을 한것을 모두 계산하는 부분입니다.</div> <div>사진처럼 완전히 똑같은 값이 나옵니다...</div> <div><br /></div> <div>왜이럴까요?</div> <div>분명히 둘 중 하나는 색깔이 이상하게 나와야 되는것 아닌가요?</div> <div>(그러고 보니 필터를 통과하면 전체 에너지가 줄어드니까 <span style="font-size: 9pt; line-height: 1.5">전체적으로 어둡게 나와야되는것 같은데 그런 일도 안생기네요.....ㅠㅠ하지만 이건 일단 제껴두고)</span></div> <div>제가 어디서 잘못 생각하고 있는 것인가요?</div></div> <div><br /></div> <div>제가 뼈속까지 공대생이라 말솜씨가 없어 이해가 잘 안되실지도 모릅니다ㅠㅠ</div> <div>이해가 안가신다면 댓글로 물어보시면 답해드리겠습니다.ㅠㅠ</div> <div>제발 한수 가르쳐주십시요(--)(__)꾸벅</div>
댓글 분란 또는 분쟁 때문에 전체 댓글이 블라인드 처리되었습니다.