2011-10-01 6 views
1

주파수 도메인에서 컨볼 루션을 수행 할 클래스에 대해 C++ 프로그램을 작성 중이며 최종 결과에 오류가있는 것으로 나타났습니다. 그래서 나는 MATLAB에서 그것을 시도하고 똑같은 결과를 얻었다. 예 :주파수 영역의 이미지 컨볼 루션

http://engronline.ee.memphis.edu/eece7214/images/Downlodable.htm

에서 카메라맨을 사용하여 나는

a = imread('cameraman.pgm'); 
h = ones(25,25)/25/25; 
a(512,512) = 0; 
h(512,512) = 0; 
c = ifft2(fft2(a).*fft2(h))/256; 
c = c(1:256, 1:256); 
c = real(c); 
imwrite(c,'test2.png') 
내가 왼쪽 상단 모서리를 추출하기 전에 C에서 슬쩍했다

을했고, 나는 같은 대답이었다 발견 IMFilter는 (A, H) 그것이 모퉁이에서 tad로 번역 된 것을 제외하고. Gonzalez의 디지털 이미지 프로세싱은 이것에 대해 아무 말도하지 않았으며 Google은 내 눈이 도움없이 검색하는 데 피를 흘렸습니다. 모든 사람들은 곤잘레스가 왼쪽 상단 모서리를 추출하기 위해 제공하는 것과 동일한 지침을 반복합니다.

주요 질문과 무관하게이 MATLAB 코드에서 256으로 나누어야하는 이유를 알고 싶습니다. 내 C++ 코드에서는 결과의 크기를 조정할 필요가 없었으며이 MATLAB 코드와 동일한 대답을 얻었습니다.

편집 : 1 차원 벡터 (conv 및 ifft (fft * fft) 수행)를 사용하여 조금 놀았으며 '오류'는 출력에서 ​​'전체'컨볼 루션을 맨 위에 표시합니다 '같은'회선 대신에 왼쪽 구석. 그러나 그 경우에도 결정론적인 방식으로 코드를 작성하는 방법을 잘 모르겠습니다. "전체"의 왼쪽 상단 256x256 부분 대신 '같은 부분'만 가져 오기 "

편집 : 더 많은 인터넷 검색 http://jeremy.fix.free.fr/IMG/pdf/fftconvolution.pdf을 통해 가능한 해결책을 찾았습니다. 그것은 이전에 보지 못했던 많은 수학 기호를 가지고 있습니다. 그러나 여러분이 nxn과 mxm을 convolving하는 경우 m : (m + n-1)을 추출하여 '같은'컨볼 루션을 얻을 수 있습니다. fft 근사. 나는 여전히 내가하는 것보다 전문가 인 사람으로부터 소식을 듣고 싶습니다. 따라서이 업데이트를 기반으로 의견을 말하지 않기로 선택하지 마십시오!

답변

2

MATLAB은 1에서 N까지의 배열을 색인화합니다.
정규 C 사용법 (및 대부분의 C 행렬 수학 라이브러리) 색인 배열은 0에서 N-1까지입니다. 이것은 하나 하나 다른 차이점의 원인 일 수 있습니다.

bure ifft (fft (x)) 알고리즘을 사용하려면 어딘가에 1/N의 배율 인수가 필요합니다. 일부 C 라이브러리는 1/N을 fft() 안에 넣습니다. 많은 사람들이 그 스케일 인자를 ifft()에 구현합니다. 일부는 양쪽에 1/sqrt (N)을 넣습니다. 일부는 기본 제공 스케일 팩터를 추가하지 않으므로 사용자가 신원을 확인하는 데 필요한만큼 확장 할 수 있어야합니다.

0

창 크기의 절반만큼 이동해야합니다. 이 경우 다음을 수행해야합니다. c = c (13 : 256 + 12,13 : 256 + 12); c = c (1 : 256, 1 : 256) 대신에 ;

신호를 0으로 채우지 만 신호를 1에서 256까지 가져 오지 않으므로 아무 것도 사용하지 않습니다. 오른쪽 가장자리에 여전히 스레시와 귀중한 신호가 있습니다.