gpt4 book ai didi

image-processing - FFT 卷积 - 如何应用 Kernel

转载 作者:行者123 更新时间:2023-12-04 03:10:33 26 4
gpt4 key购买 nike

我是图像处理的新手,发现 FFT 卷积大大加快了具有大内核大小的卷积。

我的问题是,如何在使用 kissFFT 时将内核应用于频率空间中的图像?

我已经做了以下事情:

//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);

当我在图像上再次设置 rgb 值时,我确实得到了原始图像。所以转型成功了。比如我现在要申请一个内核怎么办9x9 框模糊(1/9、1/9、... 1/9)。

我已经阅读了一些有关快速卷积的内容,但它们各不相同,具体取决于 FFT 的实现。在应用过滤器之前,是否有一种“列表”我必须关心的事情?

我的想法:

imagesize必须是2的幂;我必须创建一个与图像大小相同的内核。将9个中间值设为1/9,其余设为0,然后将这个核变换到频域,与源图像相乘,再将源图像变换回来。但这实际上行不通:DD

最佳答案

在频域进行的卷积实际上是循环卷积。因此,当您的内核的非零元素到达图片的边缘时,它会环绕并包含图片另一侧的像素,这可能不是您想要的。要处理这个问题,只需用与内核中非零元素一样多的元素对输入进行零填充(实际上少一个就可以)。对于 3x3 内核,您需要在每个维度中添加 3-1=2 个零像素。

关于image-processing - FFT 卷积 - 如何应用 Kernel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6994726/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com