我需要在频域实现Image Low / High pass文件管理器,以用于大学教育目的。 我正在应用的算法是:
a)对原始图像执行图像居中变换
b)执行DFT变换
c)根据所需的滤波来改变傅里叶系数
d)执行IDFT变换
e)再次执行图像居中变换(这取消了第一次居中变换)。
到目前为止,这是我的代码
import struct
import numpy as np
from math import pow
from cmath import exp, pi
imIn = open("before.bmp", "rb")
#Get informations from .bmp file section#
print 'Identifier: ', imIn.read(2)
print 'File size: ', struct.unpack('i',imIn.read(4))[0]
print 'Reserved: ', struct.unpack('i', imIn.read(4))[0]
offset = struct.unpack('i', imIn.read(4))[0]
print 'Data offset: ',offset
print 'Header size: ',struct.unpack('i', imIn.read(4))[0]
width = struct.unpack('i', imIn.read(4))[0]
print 'Width: ',width
height = struct.unpack('i', imIn.read(4))[0]
print 'Height: ',height
#-------------------------------------------#
#back to zero and write header section which is copied from the original file
imIn.seek(0)
header = imIn.read(offset)
#----------------------------------------------------------------------------#
# build data array
imArr = []
count = 0
for i in range(0,width):
row = []
for j in range(0,height):
tmp = imIn.read(1)
val = struct.unpack('c', tmp)[0]
row.append(val)
imArr.append(row)
#------------------#
# write header information
imOut = open("after.bmp","wb")
imOut.write(header)
#-------------------------#
ArrInt =[]
for i in range(0,width):
row = []
for j in range(0,height):
row.append(ord(imArr[i][j]))
ArrInt.append(row)
del(imArr)
#center image
for i in range(0,width):
row = []
for j in range(0,height):
ArrInt[i][j] = pow((-1),i*j)*ArrInt[i][j]
#--------------------------------
#fourier transformation
iArr = np.fft.fft2(ArrInt)
#---------------------------------------
#filer aplication(low pass filter)
R = 1000 #distance
for i in range(0,width):
for j in range(0,height):
temp = pow(float(height)/float(2)-i,2) + pow(float(width)/float(2)-j,2)
if temp > pow(R,2):
iArr[i][j] = 0
elif temp <= pow(R,2):
iArr[i][j] = iArr[i][j].real
#-----------------------------------
#fourier inverse transformation
iArr = np.fft.ifft2(iArr)
#------------------------------
#center image
for i in range(0,width):
row = []
for j in range(0,height):
iArr[i][j] = pow((-1),i*j)*iArr[i][j]
#---------------------------------------
for i in range(0,width):
for j in range(0,height):
if int(iArr[i][j].real) > 255:
imOut.write(struct.pack('c',chr(int(255))))
elif int(iArr[i][j].real) < 0:
imOut.write(struct.pack('c',chr(int(0))))
else: imOut.write(struct.pack('c',chr(int(iArr[i][j].real))))
#Close files section#
imIn.close()
imOut.close()
#-------------------#
我的问题是:我没有得到预期的结果,我无法弄清楚我做错了什么。
这些是我的输入和输出图像:
Input image
Output image