2016-10-18 4 views
1

이 주제에 대해 많이 논의되었지만 아직 답변되지 않은 문제가 있습니다. 내 문제는 자기 방법이 아니라 적용 가능성이 있습니다 : 내 이미지의 f (x, y)는 이 될 수있는 물리적 값을 나타내거나입니다. 중간 값을 나타내는 피크를 가려 낼 때, 역 FFT를 적용한 후에 복잡한 이미지를 얻습니다.주기적인 노이즈의 FFT 제거

이 이음새는 image! = ifft (fft (image)) 이미지가! = image 일 때 논리적입니다. 따라서 매우 복잡한 결과가 될 수 있습니까?

따라서 이미지 배열의 절대 값을 가져 와서 멋지게 정리 된 이미지를 얻을 수 있습니다. 하지만 이미지의 abs를 취함으로써 나는 음수 값을 잃어 버렸습니다!

내 코드가 복잡하고 어디는 필수로 분해 않도록 마스크하는 정확한 위치를 찾기 위해 여러 개의 이미지를 사용하여 내가 가진

def everything(fft,fftImage,sizeOfField,shapeOfFFT): 
max_x = [] 
max_y = [] 
median = np.median(fft) 

threshold = 500 
#correctLocalMax() holds several subfunctions that look for the propper max_x and max_y. This works fine and returns 2 lists max_x,max_Y that contain the coordiantes of the max's 
max_x,max_y = correctLocalMax(iStart = 0,iStop = 30, jStart =0 , jStop = shapeOfFFT[1],threshold=threshold, max_x = max_x, max_y = max_y) 

for i in range(len(max_x)): 
    for k in range(sizeOfField): 
     for l in range(sizeOfField): 
      fftImage[max_x[i]+k][max_y[i]+l] = median 

return(fftImage) 

image, coverage, stdev = pickleOpener(dataDir,i) 
field = getROI(image,area,i0,j0) 

fftImage = np.fft.fft2(image) 
fftImage = np.fft.fftshift(fftImage) 

fft = np.fft.fft2(coverage) 
fft = np.fft.fftshift(fft) 

fftMod = everything(fft, fftImage, sizeOfField, shapeOfFFT) 
imageBack = np.fft.ifft2(fftMod) 
imageBack = np.abs(imageBack) 
field = getROI(imageBack,area,i0,j0) 

이미지와 같은 모양을 처리 한 후 얻을 : enter image description here 스트라이프 패턴은 내가

enter image description here 을 제거 할 것들 다음은 FFT에 적용되는 마스크입니다

,

enter image description here 스트라이프 패턴이 대부분 제거되었지만 이제는 이미지가 순전히 긍정적입니다.

의견에 문제의 적절한 해결책을 찾을 수 있습니다!

+0

이것은 정말 좋은 질문입니다. 그리고 좋은 대답이 있습니다. 이 블로그 게시물은 무슨 일이 일어나고 있는지, 매우 일반적인 용어로 해결할 수있는 방법을 설명합니다. http://blogs.mathworks.com/steve/2010/07/16/complex-surprises-from-fft/하지만 1D이며 해결되지 않았습니다. 당신이 풀려고하는 문제. 원본 이미지 데이터를 어딘가에 게시 할 수 있습니까 (줄무늬 포함)? IFFT에서 실제 출력을 얻으려면 마스크를 조정하는 방법을 보여줄 수 있습니다. –

+0

데이터를 묻는 것에 신경 쓰지 말고, 정확한 'correctLocalMax'가 어떻게 복잡한 함수인지에 대한 글을 다시 읽습니다. 기본적인 문제는 스펙트럼을 0으로 마스크 할 때 스펙트럼의 공액 대칭을 유지해야한다는 것입니다. –

+1

나 혼란 스럽다 : 스펙트럼 (fft2'의 출력, fftMod')은 이미 conjugate-symmetric이어야한다 : 그것의 피크 (여기서는 줄무늬에 해당)는 왼쪽에서 오른쪽으로 대칭이어야하고, 대칭적인 위 - 아래. 하지만 당신의'correctLocalMax'는 conjugate-symmetric이 아닌 마스크를 반환하는 것 같습니다. 이 문제를 해결하면 코드가 작동합니다. –

답변

1

당신은 두 개의 서로 다른 접근 방법을 시도 할 수 : 은 어느 쪽이 다소 같이, 먼저 원래 값 사이에 이미지를 확장하고, 나중에 재조정 :

max_val = max(max(A)) 
min_val = min(min(A)) 
% normalize to [0,1] 
image = norm(image) 
% do your stuff here 
% then rescale to original values 
image = min_val + (max_val - min_val).*image/(max_val - min_val) 

은 대체 어디 부정적인있는 값을 저장하는 것 처음. 비록 그들이 당신의 소음을 원상 복귀시키지 않도록 함수 호출 중에 변경되었는지를 확인하기를 권합니다.

+0

안녕하세요, 첫 번째 아이디어에 관한 : 나는 동일한 문제에 대해 생각하고 있었지만, 일반적인 문제를 극복합니까 - 멀리 내가 FFT에서 생성 된 복잡한 배열에서 이미지를 생성하고 싶다면 이해 절대 값은 방법입니다 가다? 재미있는 두 번째 솔기도 있습니다. 조금 살펴 보겠습니다. 감사! 사람들이 np.real을 사용하여 출력을 생성하는 다른 게시물 (예 : http://stackoverflow.com/questions/34027840/removing-periodic-noise-from-an-image-using-the-fourier-transform)을 보았습니다. 영상. 그러나이 방법의 솔기가 더 합리적인 모든 복잡한 값은 무시됩니다. – Sebastiano1991

+0

나는 np.real을 선호한다고 생각하기 시작했다. 내 경험적 수학 논증은 다음과 같습니다 : fft (이미지)가 원래 이미지로 다시 변환되면 허수 부가 없어야합니다. fft를 변경하면 허수 부가 시작되지만 동시에 패턴을 제거 할 수 있습니다. 원래 이미지에 가장 가까운 백 변환은 허수 부분을 가지지 않으므로 드롭합니다. 이것은 너무 많은 실험 물리학 자들이 진실이라고 계산합니까? – Sebastiano1991

+0

np.real에서 문제를 해결할 수 있습니다. 제가 numpy의 전문가는 아니지만 MATLAB 다큐멘터리에서이 주제와 관련하여 말한 내용입니다. 구문은 시작 부분과 매우 유사하므로 거기에 대한 답을 찾아 볼 수도 있습니다. Tbh, 내가 벌써 한 것보다 너를 훨씬 더 도울 수는 없어. 아마도 마지막으로 한 가지 : 'ifftshift'를 사용하지 않는 것으로 나타났습니다. – dennlinger