首先,收藏一个讲的比较好的帖子
目的:
需要向图像增加额外的相位干扰,使图像模糊;类似于高斯模糊之类的
做法:
- 图像傅里叶变换到频域
单波长激光传播到的远场图像作为滤波器,归一到0-1;注意:如果影响极小,也就是远场是一个光斑,那么就再叠加就不行了,这里就舍弃这个滤波器11.18: 远场图像经过傅里叶变换,然后位移到中心,图像取abs(即reaal2+imag2再开平方),再归一化到0-1,同样加一个极小值,然后再作为滤波器;这样就解决了光斑影响大的问题。- 频域与滤波器相乘(类似低通:滤掉中心区域外高频的点,空间域中图像就模糊了)
- 傅里叶逆变换
- 还原做法:在2归一化时加上一个极小值使不为0,然后之后还原就直接将模糊图像进行傅里叶变换,频域除以滤波器就好了。
实现:
class ImgFft(object):
def __init__(self):
pass
#远场图像转滤波器 0-1
def img2filter(self,img2):
_filter = (img2 - np.min(img2))/(np.max(img2) - np.min(img2)) + 0.00001
np.where(_filter > 1,1,filter)
sum_filter = np.sum(_filter)
if sum_filter < _filter.shape[0]*_filter.shape[0]*0.05*0.05:#相差小,都成光斑了
print("无需矫正,相差小!")
_filter.fill(1)
return _filter
#傅里叶变换
def fft(self,img):
fft_img = np.fft.fft2(img)
fft_img = np.fft.fftshift(fft_img)
return fft_img
#反傅里叶变换
def fft2img(self,fft):
return np.fft.ifft2(fft)
#图像频域叠加相差,(空间域卷积操作)滤波;得到模糊图像
def fft_imgblur(self,fft,_filter):
#变模糊过程
fft_change = fft* _filter
return self.fft2img(fft_change)
#模糊图像矫正到原fft
def restore_fft(self,img_fitered,_filter):
#较正过程
inv_fft = np.fft.fft2(img_fitered)
inv_change = 1.0*inv_fft/ _filter #
inv_change = np.fft.fftshift(inv_change)
return inv_change
#img2utf8
def img2utf8(self,img):
return np.uint8(np.abs(img))
#test
def test_turn(self,img1,img2):
_filter = self.img2filter(img2)
fft1 = self.fft(img1)
img_fitered = self.fft_imgblur(fft1,_filter)
fft_restore = self.restore_fft(img_fitered,_filter)
img_restore = self.fft2img(fft_restore)
#show
filter_img = self.img2utf8(_filter*255)
img_fitered = self.img2utf8(img_fitered)
img_restore = self.img2utf8(img_restore)
cv2.imshow('filter_img',filter_img)
cv2.imshow('img_fitered',img_fitered)
cv2.imshow('img_restore',img_restore)
cv2.imshow('source',img1)
cv2.waitKey()
效果: