2011-08-09 4 views
2

저는 Image Processing을 처음 접했고 FFT 컨볼 루션이 큰 커널 크기의 회선 속도를 높이는 것을 알았습니다.FFT Convolution - 커널 적용 방법

내 질문은 kissFFT를 사용할 때 주파수 공간의 이미지에 커널을 어떻게 적용 할 수 있습니까?

은 이미 다음 한 : 나는 다시 원래의 이미지를 얻을 할 이미지를 다시 RGB 값을 설정

//I have an image with RGB pixels and given width/height 

const int dim[2] = {height, width}; // dimensions of fft 
const int dimcount = 2; // number of dimensions. here 2 
kiss_fftnd_cfg stf = kiss_fftnd_alloc(dim, dimcount, 0, 0, 0); // forward 2d 
kiss_fftnd_cfg sti = kiss_fftnd_alloc(dim, dimcount, 1, 0, 0); // inverse 2d 

kiss_fft_cpx *a = new kiss_fft_cpx[width * height]; 
kiss_fft_cpx *r = new kiss_fft_cpx[width * height]; 
kiss_fft_cpx *g = new kiss_fft_cpx[width * height]; 
kiss_fft_cpx *b = new kiss_fft_cpx[width * height]; 
kiss_fft_cpx *mask = new kiss_fft_cpx[width * height]; 

kiss_fft_cpx *outa = new kiss_fft_cpx[width * height]; 
kiss_fft_cpx *outr = new kiss_fft_cpx[width * height]; 
kiss_fft_cpx *outg = new kiss_fft_cpx[width * height]; 
kiss_fft_cpx *outb = new kiss_fft_cpx[width * height]; 
kiss_fft_cpx *outmask = new kiss_fft_cpx[width * height]; 

for(unsigned int i=0; i<height; i++) { 
    for(unsigned int l=0; l<width; l++) { 
     float red = intToFloat((int)Input(i,l)->Red); 
     float green = intToFloat((int)Input(i,l)->Green); 
     float blue = intToFloat((int)Input(i,l)->Blue); 

     int index = i * height + l; 

     a[index].r = 1.0; 
     r[index].r = red; 
     g[index].r = green; 
     b[index].r = blue; 
    } 
} 

kiss_fftnd(stf, a, outa); 
kiss_fftnd(stf, r, outr); 
kiss_fftnd(stf, g, outg); 
kiss_fftnd(stf, b, outb); 
kiss_fftnd(stf, mask, outmask); 


kiss_fftnd(sti, outa, a); 
kiss_fftnd(sti, outr, r); 
kiss_fftnd(sti, outg, g); 

. 그래서 변환이 작동합니다. 커널을 적용하려면 지금 수행해야합니다 (예 : ). 9x9 상자 흐림 효과 (1/9, 1/9, ... 1/9).

빠른 컨볼 루션에 대한 몇 가지 사항을 읽었지만 FFT 구현에 따라 모두 다릅니다. 필터를 적용하기 전에 내가 배려해야 할 일들의 "목록"이 있습니까?

내가 생각하는 방식 :

이미지 크기는 2의 거듭 제곱이어야합니다. 이미지와 같은 크기의 커널을 만들어야합니다. 9 개의 중간 값을 1/9로하고, 나머지를 0으로 놓고이 커널을 주파수 영역으로 변환하고, 소스 이미지를 곱한 다음 소스 이미지를 다시 변환하십시오. 하지만 실제로 작동하지 않습니다. DD

+0

올바른 생각을 갖고있는 것 같습니다. 마지막 문장에서 "정말로 작동하지 않습니다"라고 말하면 정확히 무엇을 의미합니까? –

+0

음, 역변환 후 이미지가 쓰레기처럼 보입니다. 나는 여전히 이미지를 인식하고 있지만 그 안에 많은 색상, 그레이 스케일의 거꾸로 된 이미지와 다른 것들이 있으므로 정말 유용하지 않다. ^^ – Marco

+0

FFT 회선에 대해 더 많은 것들을 읽었으며 어떤 것은 내가 덧붙일 필요가 있다고 말한다. 원본 이미지도 왜 그렇게해야합니까? 그리고 어떤 크기로해야합니까? – Marco

답변

3

주파수 도메인에서 수행되는 회선은 실제로 순환 회선입니다. 따라서 커널의 0이 아닌 요소가 그림의 가장자리에 도달하면 그림의 다른 쪽의 픽셀이 포함됩니다. 이는 원하는 것이 아닐 수 있습니다. 이 문제를 해결하기 위해 커널에 0이 아닌 요소를 가진만큼 많은 요소를 입력에 넣으십시오. 실제로는 적은 수의 요소가 있습니다. 3x3 커널에서는 각 차원에 3-1 = 2 픽셀을 추가해야합니다.