二维傅里叶变换出错了,我到底哪里出错了?
我曾经做过音频采样,但现在转向了图像。我正在尝试为一个位深为 16x16 的图像实现离散傅里叶变换(DFT)。
我自己实现了一个图像解码器。每个文件都包含用逗号分隔的RGB值 ,,每个像素都被圆括号包裹着 ()。
例如,如果一个像素是纯红色,它在文件中将表示为 (255,0,0)。
因此,在文件的每一行中会有16个圆括号,这些信息覆盖图像的前16行。
我试图用我的编码格式编码的图像如下:
(255,0,239)(255,0,223)(255,0,207)(255,0,191)(255,0,175)(255,0,159)(255,0,143)(255,0,127)(255,0,111)(255,0,95)(255,0,79)(255,0,63)(255,0,47)(255,0,31)(255,0,15)(255,0,0)
(255,0,223)(255,0,210)(255,0,197)(255,0,184)(255,0,171)(255,0,158)(255,0,145)(255,0,132)(255,0,119)(255,0,106)(255,0,93)(255,0,80)(255,0,67)(255,0,54)(255,0,41)(255,0,15)
(255,0,207)(255,0,196)(255,0,185)(255,0,174)(255,0,163)(255,0,152)(255,0,141)(255,0,130)(255,0,119)(255,0,108)(255,0,97)(255,0,86)(255,0,75)(255,0,64)(255,0,53)(255,0,31)
(255,0,191)(255,0,182)(255,0,173)(255,0,164)(255,0,155)(255,0,146)(255,0,137)(250,0,121)(250,0,112)(250,0,103)(250,0,94)(250,0,85)(250,0,76)(255,0,67)(255,0,58)(255,0,47)
(255,0,175)(255,0,168)(255,0,161)(255,0,154)(255,0,147)(255,0,140)(255,0,133)(255,0,126)(255,0,119)(255,0,112)(255,0,105)(255,0,98)(255,0,91)(255,0,84)(255,0,77)(255,0,63)
(255,0,159)(255,0,154)(255,0,149)(255,0,144)(255,0,139)(255,0,134)(255,0,129)(255,0,124)(255,0,119)(255,0,114)(255,0,109)(255,0,104)(255,0,99)(255,0,94)(255,0,89)(255,0,79)
(255,0,143)(255,0,140)(255,0,137)(255,0,134)(255,0,131)(255,0,128)(255,0,125)(255,0,122)(255,0,119)(255,0,116)(255,0,113)(255,0,110)(255,0,107)(255,0,104)(255,0,101)(255,0,95)
(255,0,127)(255,0,126)(255,0,125)(255,0,124)(255,0,123)(255,0,122)(255,0,121)(255,0,120)(255,0,119)(255,0,118)(255,0,117)(255,0,116)(255,0,115)(255,0,114)(255,0,113)(255,0,111)
(255,0,111)(255,0,113)(255,0,114)(255,0,115)(255,0,116)(255,0,117)(255,0,118)(255,0,119)(255,0,120)(255,0,121)(255,0,122)(255,0,123)(255,0,124)(255,0,125)(255,0,126)(255,0,127)
(255,0,95)(255,0,101)(255,0,104)(255,0,107)(255,0,110)(255,0,113)(255,0,116)(255,0,119)(255,0,122)(255,0,125)(255,0,128)(255,0,131)(255,0,134)(255,0,137)(255,0,140)(255,0,143)
(255,0,79)(255,0,89)(255,0,94)(255,0,99)(255,0,104)(255,0,109)(255,0,114)(255,0,119)(255,0,124)(255,0,129)(255,0,134)(255,0,139)(255,0,144)(255,0,149)(255,0,154)(255,0,159)
(255,0,63)(255,0,77)(255,0,84)(255,0,91)(255,0,98)(255,0,105)(255,0,112)(255,0,119)(255,0,126)(255,0,133)(255,0,140)(255,0,147)(255,0,154)(255,0,161)(255,0,168)(255,0,175)
(255,0,47)(255,0,58)(255,0,67)(255,0,76)(255,0,85)(255,0,94)(255,0,103)(250,0,112)(250,0,121)(255,0,137)(255,0,146)(255,0,155)(255,0,164)(255,0,173)(255,0,182)(255,0,191)
(255,0,31)(255,0,53)(255,0,64)(255,0,75)(255,0,86)(255,0,97)(255,0,108)(255,0,119)(255,0,130)(255,0,141)(255,0,152)(255,0,163)(255,0,174)(255,0,185)(255,0,196)(255,0,207)
(255,0,15)(255,0,41)(255,0,54)(255,0,67)(255,0,80)(255,0,93)(255,0,106)(255,0,119)(255,0,132)(255,0,145)(255,0,158)(255,0,171)(255,0,184)(255,0,197)(255,0,210)(255,0,223)
(255,0,0)(255,0,15)(255,0,31)(255,0,47)(255,0,63)(255,0,79)(255,0,95)(255,0,111)(255,0,127)(255,0,143)(255,0,159)(255,0,175)(255,0,191)(255,0,207)(255,0,223)(255,0,239)
它是一个粉色和红色的调色板,我让从纯红到粉红的过渡变得平滑。
我想在离散频域(DFT)中看到这张图片。
一维离散傅里叶变换的公式是:
X[k] = Σ_{n=0}^{N-1} x[n] * exp(-j * 2 * π * k * n / N)
对于二维问题,例如在图像处理中,可以对每一行和每一列分别进行DFT,然后把结果相加。
例如,如果第 1 行的DFT得到 1,而第 1 列的DFT得到 2,那么在二维DFT中,位于 1,1 位置的单元格将具有值 1+2=3。
(所有这些都假设我们从第 0th 列和第 0th 行开始)
我有这段代码:
import cmath
filename = input("Enter a filename:\n")
file = open(filename,'r')
redArray = []
greenArray = []
blueArray = []
redArrayFourier = []
greenArrayFourier = []
blueArrayFourier = []
fourierRowsRed = []
fourierColumnsRed = []
fourierRowsBlue = []
fourierColumnsBlue = []
fourierRowsGreen = []
fourierColumnsGreen = []
rows, cols = 16, 16
for _ in range(rows):
row = []
for _ in range(cols):
row.append(0)
redArray.append(row)
for _ in range(rows):
row = []
for _ in range(cols):
row.append(0)
blueArray.append(row)
for _ in range(rows):
row = []
for _ in range(cols):
row.append(0)
greenArray.append(row)
for _ in range(rows):
row = []
for _ in range(cols):
row.append(0)
redArrayFourier.append(row)
for _ in range(rows):
row = []
for _ in range(cols):
row.append(0)
blueArrayFourier.append(row)
for _ in range(rows):
row = []
for _ in range(cols):
row.append(0)
greenArrayFourier.append(row)
for i in range(rows):
fourierRowsRed.append(0)
for i in range(rows):
fourierRowsBlue.append(0)
for i in range(rows):
fourierRowsGreen.append(0)
for i in range(cols):
fourierColumnsRed.append(0)
for i in range(cols):
fourierColumnsBlue.append(0)
for i in range(cols):
fourierColumnsGreen.append(0)
for i in range(16):
line = file.readline()
bitswithComma = line.split(')')
for j in range(16):
bits = bitswithComma[j]
bitsJ = bits[1:]
bitsR = bitsJ.split(',')
red = int(bitsR[0])
green = int(bitsR[1])
blue = int(bitsR[2])
redArray[i][j] = red
greenArray[i][j] = green
blueArray[i][j] = blue
x1r=0
x2r=0
x3r=0
y1r=0
y2r=0
y3r=0
for i in range(16):
if i>0:
fourierRowsRed[i-1] = x1r
fourierRowsGreen[i-1] = x2r
fourierRowsBlue[i-1] = x3r
x1r = 0
x2r = 0
x3r = 0
subarrRed = redArray[i]
subarrGreen = greenArray[i]
subarrBlue = blueArray[i]
for j in range(16):
x1r += subarrRed[j]*cmath.exp(-1*cmath.pi*i/8)
x2r += subarrGreen[j]*cmath.exp(-1*cmath.pi*i/8)
x3r += subarrBlue[j]*cmath.exp(-1*cmath.pi*i/8)
for i in range(16):
if i>0:
fourierColumnsRed[i-1] = y1r
fourierColumnsGreen[i-1] = y2r
fourierColumnsBlue[i-1] = y3r
y1r = 0
y2r = 0
y3r = 0
for j in range(16):
y1r+=redArray[i][j]*cmath.exp(-1*cmath.pi*j/8)
y2r+=greenArray[i][j]*cmath.exp(-1*cmath.pi*j/8)
y3r+=blueArray[i][j]*cmath.exp(-1*cmath.pi*j/8)
for i in range(16):
for j in range(16):
redArrayFourier[i][j] = fourierRowsRed[i]+fourierColumnsRed[j]
greenArrayFourier[i][j] = fourierRowsGreen[i]+fourierColumnsGreen[j]
blueArrayFourier[i][j] = fourierRowsBlue[i]+fourierColumnsBlue[j]
print(redArrayFourier)
print('\n')
print(greenArrayFourier)
print('\n')
print(blueArrayFourier)
当我运行程序时,它输出了这个:
Enter a filename:
filen1.rgb
[[(4863.709383155579+0j), (4863.709383155579+0j), (4863.709383155579+0j), (4862.817472459971+0j), (4863.709383155579+0j), (4863.709383155579+0j), (4863.709383155579+0j), (4863.709383155579+0j), (4863.709383155579+0j), (4863.709383155579+0j), (4863.709383155579+0j), (4863.709383155579+0j), (4863.173320404593+0j), (4863.709383155579+0j), (4863.709383155579+0j), (4080+0j)], [(3538.6555623111517+0j), (3538.6555623111517+0j), (3538.6555623111517+0j), (3537.7636516155435+0j), (3538.6555623111517+0j), (3538.6555623111517+0j), (3538.6555623111517+0j), (3538.6555623111517+0j), (3538.6555623111517+0j), (3538.6555623111517+0j), (3538.6555623111517+0j), (3538.6555623111517+0j), (3538.119499560166+0j), (3538.6555623111517+0j), (3538.6555623111517+0j), (2754.9461791555723+0j)], [(2643.936944440844+0j), (2643.936944440844+0j), (2643.936944440844+0j), (2643.045033745236+0j), (2643.936944440844+0j), (2643.936944440844+0j), (2643.936944440844+0j), (2643.936944440844+0j), (2643.936944440844+0j), (2643.936944440844+0j), (2643.936944440844+0j), (2643.936944440844+0j), (2643.400881689858+0j), (2643.936944440844+0j), (2643.936944440844+0j), (1860.2275612852648+0j)], [(2030.5584670360006+0j), (2030.5584670360006+0j), (2030.5584670360006+0j), (2029.6665563403926+0j), (2030.5584670360006+0j), (2030.5584670360006+0j), (2030.5584670360006+0j), (2030.5584670360006+0j), (2030.5584670360006+0j), (2030.5584670360006+0j), (2030.5584670360006+0j), (2030.5584670360006+0j), (2030.0224042850145+0j), (2030.5584670360006+0j), (2030.5584670360006+0j), (1246.8490838804212+0j)], [(1631.8580546666883+0j), (1631.8580546666883+0j), (1631.8580546666883+0j), (1630.9661439710803+0j), (1631.8580546666883+0j), (1631.8580546666883+0j), (1631.8580546666883+0j), (1631.8580546666883+0j), (1631.8580546666883+0j), (1631.8580546666883+0j), (1631.8580546666883+0j), (1631.8580546666883+0j), (1631.3219919157023+0j), (1631.8580546666883+0j), (1631.8580546666883+0j), (848.1486715111089+0j)], [(1356.40642774759+0j), (1356.40642774759+0j), (1356.40642774759+0j), (1355.5145170519818+0j), (1356.40642774759+0j), (1356.40642774759+0j), (1356.40642774759+0j), (1356.40642774759+0j), (1356.40642774759+0j), (1356.40642774759+0j), (1356.40642774759+0j), (1356.40642774759+0j), (1355.870364996604+0j), (1356.40642774759+0j), (1356.40642774759+0j), (572.6970445920105+0j)], [(1170.4127005115713+0j), (1170.4127005115713+0j), (1170.4127005115713+0j), (1169.5207898159633+0j), (1170.4127005115713+0j), (1170.4127005115713+0j), (1170.4127005115713+0j), (1170.4127005115713+0j), (1170.4127005115713+0j), (1170.4127005115713+0j), (1170.4127005115713+0j), (1170.4127005115713+0j), (1169.8766377605853+0j), (1170.4127005115713+0j), (1170.4127005115713+0j), (386.7033173559919+0j)], [(1044.8238014439798+0j), (1044.8238014439798+0j), (1044.8238014439798+0j), (1043.9318907483719+0j), (1044.8238014439798+0j), (1044.8238014439798+0j), (1044.8238014439798+0j), (1044.8238014439798+0j), (1044.8238014439798+0j), (1044.8238014439798+0j), (1044.8238014439798+0j), (1044.8238014439798+0j), (1044.287738692994+0j), (1044.8238014439798+0j), (1044.8238014439798+0j), (261.1144182884005+0j)], [(960.0221696717703+0j), (960.0221696717703+0j), (960.0221696717703+0j), (959.1302589761623+0j), (960.0221696717703+0j), (960.0221696717703+0j), (960.0221696717703+0j), (960.0221696717703+0j), (960.0221696717703+0j), (960.0221696717703+0j), (960.0221696717703+0j), (960.0221696717703+0j), (959.4861069207843+0j), (960.0221696717703+0j), (960.0221696717703+0j), (176.3127865161908+0j)], [(902.7614021627+0j), (902.7614021627+0j), (902.7614021627+0j), (901.8694914670921+0j), (902.7614021627+0j), (902.7614021627+0j), (902.7614021627+0j), (902.7614021627+0j), (902.7614021627+0j), (902.7614021627+0j), (902.7614021627+0j), (902.7614021627+0j), (902.225339411714+0j), (902.7614021627+0j), (902.7614021627+0j), (119.05201900712058+0j)], [(864.0971049409773+0j), (864.0971049409773+0j), (864.0971049409773+0j), (863.2051942453693+0j), (864.0971049409773+0j), (864.0971049409773+0j), (864.0971049409773+0j), (864.0971049409773+0j), (864.0971049409773+0j), (864.0971049409773+0j), (864.0971049409773+0j), (864.0971049409773+0j), (863.5610421899913+0j), (864.0971049409773+0j), (864.0971049409773+0j), (80.38772178539783+0j)], [(837.9897378084478+0j), (837.9897378084478+0j), (837.9897378084478+0j), (837.0978271128398+0j), (837.9897378084478+0j), (837.9897378084478+0j), (837.9897378084478+0j), (837.9897378084478+0j), (837.9897378084478+0j), (837.9897378084478+0j), (837.9897378084478+0j), (837.9897378084478+0j), (837.4536750574619+0j), (837.9897378084478+0j), (837.9897378084478+0j), (54.28035465286836+0j)], [(820.2713776115762+0j), (820.2713776115762+0j), (820.2713776115762+0j), (819.3794669159682+0j), (820.2713776115762+0j), (820.2713776115762+0j), (820.2713776115762+0j), (820.2713776115762+0j), (820.2713776115762+0j), (820.2713776115762+0j), (820.2713776115762+0j), (820.2713776115762+0j), (819.7353148605903+0j), (820.2713776115762+0j), (820.2713776115762+0j), (36.561994455996775+0j)], [(808.4578664304825+0j), (808.4578664304825+0j), (808.4578664304825+0j), (807.5659557348745+0j), (808.4578664304825+0j), (808.4578664304825+0j), (808.4578664304825+0j), (808.4578664304825+0j), (808.4578664304825+0j), (808.4578664304825+0j), (808.4578664304825+0j), (808.4578664304825+0j), (807.9218036794965+0j), (808.4578664304825+0j), (808.4578664304825+0j), (24.748483274903055+0j)], [(800.4203487041308+0j), (800.4203487041308+0j), (800.4203487041308+0j), (799.5284380085228+0j), (800.4203487041308+0j), (800.4203487041308+0j), (800.4203487041308+0j), (800.4203487041308+0j), (800.4203487041308+0j), (800.4203487041308+0j), (800.4203487041308+0j), (800.4203487041308+0j), (799.8842859531449+0j), (800.4203487041308+0j), (800.4203487041308+0j), (16.71096554855142+0j)], [(783.7093831555794+0j), (783.7093831555794+0j), (783.7093831555794+0j), (782.8174724599714+0j), (783.7093831555794+0j), (783.7093831555794+0j), (783.7093831555794+0j), (783.7093831555794+0j), (783.7093831555794+0j), (783.7093831555794+0j), (783.7093831555794+0j), (783.7093831555794+0j), (783.1733204045935+0j), (783.7093831555794+0j), (783.7093831555794+0j), 0]]
[[0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j], [0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j], [0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j], [0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j], [0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j], [0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j], [0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j], [0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j], [0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j], [0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j], [0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j], [0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j], [0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j], [0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j], [0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j], [0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0j, 0]]
[[(2538.7717521195673+0j), (2508.452825181247+0j), (2471.8802436876094+0j), (2433.9878558128257+0j), (2398.735080700335+0j), (2362.1624992066972+0j), (2325.58991771306+0j), (2289.0173362194228+0j), (2254.5153592241577+0j), (2222.0839867272653+0j), (2189.652614230373+0j), (2157.2212417334804+0j), (2110.8649562777464+0j), (2092.3584967396955+0j), (2059.927124242803+0j), (1905+0j)], [(1980.8594058978426+0j), (1950.5404789595227+0j), (1913.967897465885+0j), (1876.075509591101+0j), (1840.8227344786103+0j), (1804.2501529849728+0j), (1767.6775714913354+0j), (1731.1049899976979+0j), (1696.6030130024328+0j), (1664.1716405055404+0j), (1631.740268008648+0j), (1599.3088955117557+0j), (1552.9526100560217+0j), (1534.4461505179709+0j), (1502.0147780210784+0j), (1347.0876537782754+0j)], [(1536.9851832240058+0j), (1506.666256285686+0j), (1470.0936747920482+0j), (1432.2012869172643+0j), (1396.9485118047735+0j), (1360.375930311136+0j), (1323.8033488174985+0j), (1287.230767323861+0j), (1252.728790328596+0j), (1220.2974178317036+0j), (1187.8660453348111+0j), (1155.434672837919+0j), (1109.078387382185+0j), (1090.571927844134+0j), (1058.1405553472416+0j), (903.2134311044385+0j)], [(1222.0998013283288+0j), (1191.7808743900089+0j), (1155.2082928963714+0j), (1117.3159050215872+0j), (1082.0631299090965+0j), (1045.490548415459+0j), (1008.9179669218215+0j), (972.3453854281843+0j), (937.8434084329191+0j), (905.4120359360268+0j), (872.9806634391343+0j), (840.5492909422419+0j), (794.1930054865079+0j), (775.686545948457+0j), (743.2551734515647+0j), (588.3280492087616+0j)], [(1039.7605647326054+0j), (1009.4416377942853+0j), (972.8690563006478+0j), (934.9766684258639+0j), (899.723893313373+0j), (863.1513118197354+0j), (826.578730326098+0j), (790.0061488324607+0j), (755.5041718371956+0j), (723.0727993403032+0j), (690.6414268434107+0j), (658.2100543465184+0j), (611.8537688907844+0j), (593.3473093527335+0j), (560.9159368558412+0j), (405.9888126130381+0j)], [(905.9432152234664+0j), (875.6242882851463+0j), (839.0517067915088+0j), (801.1593189167248+0j), (765.9065438042339+0j), (729.3339623105965+0j), (692.761380816959+0j), (656.1887993233217+0j), (621.6868223280566+0j), (589.2554498311642+0j), (556.8240773342718+0j), (524.3927048373794+0j), (478.0364193816454+0j), (459.52995984359455+0j), (427.0985873467022+0j), (272.1714631038991+0j)], [(816.2236849407154+0j), (785.9047580023954+0j), (749.3321765087578+0j), (711.4397886339739+0j), (676.187013521483+0j), (639.6144320278455+0j), (603.041850534208+0j), (566.4692690405707+0j), (531.9672920453056+0j), (499.5359195484132+0j), (467.10454705152085+0j), (434.6731745546284+0j), (388.3168890988944+0j), (369.81042956084355+0j), (337.3790570639512+0j), (182.45193282114812+0j)], [(756.0731377443549+0j), (725.7542108060348+0j), (689.1816293123973+0j), (651.2892414376133+0j), (616.0364663251224+0j), (579.463884831485+0j), (542.8913033378475+0j), (506.31872184421013+0j), (471.81674484894506+0j), (439.3853723520526+0j), (406.9539998551603+0j), (374.52262735826787+0j), (328.1663419025339+0j), (309.659882364483+0j), (277.2285098675907+0j), (122.30138562478757+0j)], [(716.353549921636+0j), (686.034622983316+0j), (649.4620414896784+0j), (611.5696536148945+0j), (576.3168785024037+0j), (539.7442970087661+0j), (503.17171551512877+0j), (466.5991340214914+0j), (432.0971570262262+0j), (399.6657845293339+0j), (367.23441203244147+0j), (334.8030395355491+0j), (288.4467540798151+0j), (269.9402945417643+0j), (237.50892204487187+0j), (82.58179780206879+0j)], [(689.9421287344464+0j), (659.6232017961264+0j), (623.0506203024888+0j), (585.1582324277049+0j), (549.9054573152141+0j), (513.3328758215765+0j), (476.7602943279391+0j), (440.18771283430175+0j), (405.6857358390366+0j), (373.25436334214425+0j), (340.82299084525187+0j), (308.3916183483595+0j), (262.0353328926255+0j), (243.5288733545746+0j), (211.09750085768223+0j), (56.17037661487917+0j)], [(671.9756228406179+0j), (641.6566959022978+0j), (605.0841144086603+0j), (567.1917265338764+0j), (531.9389514213855+0j), (495.36636992774794+0j), (458.7937884341105+0j), (422.22120694047317+0j), (387.71922994520804+0j), (355.28785744831566+0j), (322.8564849514233+0j), (290.4251124545309+0j), (244.06882699879688+0j), (225.56236746074603+0j), (193.13099496385365+0j), (38.20387072105058+0j)], [(659.75448070708+0j), (629.43555376876+0j), (592.8629722751224+0j), (554.9705844003385+0j), (519.7178092878476+0j), (483.1452277942101+0j), (446.57264630057267+0j), (410.0000648069353+0j), (375.4980878116702+0j), (343.0667153147778+0j), (310.63534281788543+0j), (278.203970320993+0j), (231.84768486525903+0j), (213.34122532720818+0j), (180.9098528303158+0j), (25.98272858751272+0j)], [(650.9388212609456+0j), (620.6198943226256+0j), (584.047312828988+0j), (546.154924954204+0j), (510.90214984171325+0j), (474.3295683480757+0j), (437.7569868544383+0j), (401.18440536080095+0j), (366.6824283655358+0j), (334.25105586864345+0j), (301.81968337175107+0j), (269.38831087485863+0j), (223.03202541912464+0j), (204.5255658810738+0j), (172.0941933841814+0j), (17.167069141378338+0j)], [(645.7881112782886+0j), (615.4691843399686+0j), (578.896602846331+0j), (541.0042149715471+0j), (505.7514398590562+0j), (469.1788583654187+0j), (432.60627687178123+0j), (396.0336953781439+0j), (361.5317183828788+0j), (329.10034588598637+0j), (296.66897338909405+0j), (264.2376008922016+0j), (217.88131543646762+0j), (199.37485589841677+0j), (166.9434834015244+0j), (12.016359158721315+0j)], [(641.9429227738221+0j), (611.6239958355021+0j), (575.0514143418645+0j), (537.1590264670806+0j), (501.9062513545898+0j), (465.3336698609523+0j), (428.76108836731487+0j), (392.1885068736775+0j), (357.6865298784124+0j), (325.25515738152+0j), (292.8237848846276+0j), (260.3924123877352+0j), (214.03612693200122+0j), (195.52966739395038+0j), (163.098294897058+0j), (8.171170654254919+0j)], [(633.7717521195673+0j), (603.4528251812472+0j), (566.8802436876097+0j), (528.9878558128257+0j), (493.7350807003349+0j), (457.16249920669736+0j), (420.58991771305995+0j), (384.0173362194226+0j), (349.51535922415746+0j), (317.0839867272651+0j), (284.6526142303727+0j), (252.2212417334803+0j), (205.8649562777463+0j), (187.35849673969545+0j), (154.92712424280307+0j), 0]]
Process finished with exit code 0
现在我对绿色和蓝色的傅里叶矩阵还不太清楚,但红色的矩阵显然是错的,因为红色的数值在整份文件中保持不变(该调色板中红色的值为常数 255))。
对于红色的DFT矩阵应该全部为零,只有单元格 0,0 非零。
我到底哪里做错了,应该怎么修复?
解决方案
对于二维问题,例如在图像处理中,可以对每一行和每一列分别进行DFT,然后把结果相加。
例如,如果第1 行的DFT得到1,而第
1列的DFT得到2,那么在二维DFT中,坐标为 (1,1) 的单元格将具有值1+2=3。
这是错误的。至多在一些非常特定的情况下,你才能把两个坐标轴的DFT相乘,但你的例子并不是其中之一。
调试实现的最佳方法是显示结果,例如使用 pyplot。你会立刻看到哪里出错。
下面的代码应该能实现你想要的功能,尽管它在二维DFT中只是简单地使用 numpy。
import re
import numpy as np
import matplotlib.pyplot as plt
pixel = re.compile(r'\((?P<R>\d{1,3}),(?P<G>\d{1,3}),(?P<B>\d{1,3})\)')
with open('image.txt', 'r') as image_file:
lines = image_file.readlines()
image = []
for n, line in enumerate(lines):
image.append([])
for m in pixel.finditer(line):
image[n].append(
[
int(m.group('R')),
int(m.group('G')),
int(m.group('B')),
]
)
image = np.array(image)
image_fft = np.abs(np.fft.fft2(image, axes=(0, 1)))
image_fft = image_fft / image_fft.max()
fig, (ax1, ax2) = plt.subplots(1, 2)
ax1.imshow(image)
ax2.imshow(image_fft)
fig.show()
