[讨论] 影像与频率的值域和转换关系

楼主: lyalyalya (lyalyalya)   2015-04-18 00:09:53
各位大大好,
小弟主修是影像处理,对于频率域非常不熟,
但是最近在做影像的convolution时需要用到FFT,
爬了很多文依然失败,因此想上来请教,
问题如下:
假设一张影像I跟遮罩k要做convolution,
空间上模糊影像 B = I * k,
因为影像与遮罩都很大,我需要将它转换到频率域计算,
频率域上F(B) = F(I) o F(k),
空间的convolution = 频率的点乘,
而因为点乘大小必须相同,但是I和k的大小不同,所以会在MAT的右下补0,
(通常FFT会补到2的倍数)
问题1:
我看到一个范例是做水平梯度fx=[1 -1],
它在转换时使用 otfFx = pst2otf(fx,[SIZE(m,n)]),
就我的了解与测试,它是将fx的右下先补0,然后对原本的大小做circshift,最后转FFT2,
请问这边的shift是为了让kernel的中心与影像的(0,0)对齐,以方便做点乘吗?
(我有试过没做circshift,转回来会位移)
问题二:
陈上,假设我的kernel是2D,我一样要先circshift才能转FFT2吧?
那我的kernel转回空间时,是不是要做反向的circshift回来呢?
问题三:
现在我的 F_I = FFT2(I),otfFx = FFT2(circshift(k,[SIZE()]))皆已在频率域,
要做convolution时,有人会用fftshift(F_I)和fftshift(otfFx)将频率进行位移,
这步骤好像是为了show频率图时方便看?那我没有要show频率图是否可以不做这一步?
问题四:
有些范例是会先fftshift再fft2,这样跟先fft2再fftshift有什么差别吗?
问题五:
我看过有人说影像右下补0会造成artifact,
所以一开始是补影像跟kernel的四周,
然后以补0后的影像中心当(0,0)对齐,这样kernel是不是就不用做circshift了?
而由于没有要show频率,所以也不用做fftshift?
问题六:
陈上,若我有多个kernel,其原始大小皆不同,
像是fx=[1 -1],fy=[1;-1],k=[0,1,0;1,-4,1;0,1,0],
尤其是又有1 x 2, 3 x 3,这种奇数和偶数的kernel,
那我对齐时要如何对齐?
好像是将kernel正中间与影像默认的中心(0,0)对齐就可以一起计算了?
这边影像中心若用"右下补0,kernel做circshift"则为最左上(0,0),
若用"四周补0,kernel的中心对齐影像中心"则为整个加边的MAT的中心(H/2-1,W/2-1)?
问题七:
用ifft2转回空间域时,影像的值是否要再处理?
主要是转fft2之前,我的I和k值域皆为0-1,转过去频率后我可能会做复杂计算,
值show出来会超过0-255(有负值或正值很大),
若转回来后不做处理,show影像出来会有很多区域是全白或全黑,
但若是将值normalize成(0-1)再*255,则会发生整张图偏亮或偏暗,
我认为是原本最大或最小值太大,以至于正规化0-1时带动到整体,
请问空间域和频率域的值域要如何对应呢?
问题八:
我转回空间域之后,要把刚刚补的那些0去掉,
所以无论补右下还是补四周,都是按照原本补的位置cut掉就可以了吧?
应该不会位移吧?
作者: windgaia (Gaia)   2015-04-21 14:35:00
在下也曾做过 诚心建议您直接试跑就能了解了其实不难 做图比较就能一目了然 加油 =)

Links booklink

Contact Us: admin [ a t ] ucptt.com