|
|
不是来应助的,只是说说自己对这个问题的想法,大神们可以继续应助(嗯,我就是来打酱油的)
这里处理的图像是黑白的(彩色的要麻烦很多),不过原数据应该不存在这个问题
http://pan.baidu.com/s/1o68zf9g
文件名(filter noise1.jpg)
首先,随便找一款软件,应该是任意一款AFM 的读取软件都行,这里使用的是ImageJ(一般来讲不是用来处理AFM图片的,但是原理是一致的)
找到Process》FFT》FFT对原图进行傅里叶变换得到下图
文件名(FFT of filter noise 1.jpg)
将属于噪音的部分涂黑(其实应该用interpolation算一下,不应直接归零,我嫌麻烦就没做,你可以试试),有图如下
文件名(FFT of filter noise.jpg)
找到Process》FFT》FFT把改过的这张图变回去,就可以了
文件名(Inverse FFT of filter noise.jpg)
如嫌麻烦可以把周期在噪音以下(这张图中20个pixel)的都滤去,
找到Process》FFT》Bandpass filter,
Filter large structures down to 400pixels
Filter small structures up to 21pixels
得到下图
http://pan.baidu.com/s/1mgMatKk
关于理想情况下噪音是个正交函数(周期20pixels)的情况我做了以下计算
文件名(Inverse FFT of filter noise.jpg)
图中第一列为原图和他的傅里叶变换
第二列为添加噪音后的图和他的傅里叶变换
比较可以发现傅里叶变换后噪音峰的频率
该处用周围的强度替换,进行傅里叶变换
得到第三列的图
和原图一致(因显示问题图颠倒了)
具体原理可用如下python程序说明
#!/usr/local/bin/python2.7.3 -tttt
import numpy
import matplotlib.pyplot as plt
import random
crosssection=numpy.zeros((521, 521), dtype=complex)+1
position=numpy.random.randint(20,355, size=(2, 10))
for i in range(10):
crosssection[position[0, i]-20:position[0, i]+20,position[1, i]-15:position[1, i]+15]=random.randint(1,10)
plt.subplot(3,2,1)
plt.imshow(numpy.absolute(crosssection),cmap=plt.cm.gray)
imgfft=numpy.fft.fft2(crosssection)
imgfft=numpy.fft.fftshift(imgfft)
plt.subplot(3,2,2)
plt.imshow(numpy.log10(numpy.absolute(imgfft)+1),cmap=plt.cm.gray)
noise=numpy.sin(numpy.arange(521*521,dtype=complex)*numpy.pi/10).reshape((521,521))*4
crosssection=crosssection+noise
plt.subplot(3,2,3)
plt.imshow(numpy.absolute(crosssection),cmap=plt.cm.gray)
imgfft=numpy.fft.fft2(crosssection)
imgfft=numpy.fft.fftshift(imgfft)
plt.subplot(3,2,4)
plt.imshow(numpy.log10(numpy.absolute(imgfft)+1),cmap=plt.cm.gray)
imgphase=numpy.angle(imgfft)
imgintensity=numpy.absolute(imgfft)
imgintensity[:,233:235]=imgintensity[:,230:232]
imgintensity[:,285:287]=imgintensity[:,288:290]
imgintensity[233:235,:]=imgintensity[230:232,:]
imgintensity[288:290,:]=imgintensity[288:290,:]
imgfftcal=numpy.multiply(numpy.absolute(imgintensity), numpy.exp(1j*imgphase))
plt.subplot(3,2,6)
plt.imshow(numpy.log10(numpy.absolute(imgfftcal)+1),cmap=plt.cm.gray)
imgcal=numpy.fft.fft2(imgfftcal)
plt.subplot(3,2,5)
plt.imshow(numpy.absolute(imgcal),cmap=plt.cm.gray)
plt.show() |
|