бит).
Я создал свой собственный декодер изображений. Каждый файл содержит значения RGB, разделенные запятыми, и каждый пиксель заключен в круглые скобки ().
Так, например, если пиксель чисто красного цвета, он будет переведен в файл как (255,0,0)
Таким образом, мы получаем 16 круглых скобок в каждой строке файла, который содержит информация об изображении до 16 строк
Изображение, которое я пытаюсь закодировать, следующее (в моем формате кодирования):
Это палитра розового и красного, и я сделал переход от чисто красного к розовому постепенным.
Я хочу видеть изображение в дискретной частотной области (ДПФ)
Формула для 1D ДПФ:
X[k] = Σ_{n=0}^{N-1} x[n] * exp(-j * 2 * π * k * n / N)
Для 2D, таких как обработка изображений, можно выполнить ДПФ для каждой строки и столбца, а затем сложить результаты.
Например, если ДПФ строки 1 дает 1, а ДПФ столбца 1 дает 2, то в 2D ДПФ ячейка в позиции 1,1 будет иметь значение 1+2=3
(все это при условии, что мы начинаем с 0-го столбца и 0-й строки
У меня есть этот код:
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)
Когда я запускаю программу, она выводит следующее:
Теперь я не знаю о зеленой и синей матрицах Фурье, но красная определенно неверна, так как значение красного является постоянным во всем файле (палитра имеет постоянное значение красного 255)
Матрица, которая представляет собой ДПФ для красного цвета, должна состоять из всех нулей, кроме ячейки 0,0
Что я сделал не так и как это исправить?>
Раньше я делал выборку звука, но теперь перешел к изображениям. Я пытаюсь реализовать дискретное преобразование Фурье для изображения([code]16x16[/code] бит). Я создал свой собственный декодер изображений. Каждый файл содержит значения RGB, разделенные запятыми, и каждый пиксель заключен в круглые скобки (). Так, например, если пиксель чисто красного цвета, он будет переведен в файл как (255,0,0) Таким образом, мы получаем 16 круглых скобок в каждой строке файла, который содержит информация об изображении до 16 строк Изображение, которое я пытаюсь закодировать, следующее (в моем формате кодирования): [code](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) [/code] Это палитра розового и красного, и я сделал переход от чисто красного к розовому постепенным. Я хочу видеть изображение в дискретной частотной области (ДПФ) Формула для 1D ДПФ: [code]X[k] = Σ_{n=0}^{N-1} x[n] * exp(-j * 2 * π * k * n / N)[/code] Для 2D, таких как обработка изображений, можно выполнить ДПФ для каждой строки и столбца, а затем сложить результаты. Например, если ДПФ строки 1 дает 1, а ДПФ столбца 1 дает 2, то в 2D ДПФ ячейка в позиции 1,1 будет иметь значение 1+2=3 (все это при условии, что мы начинаем с 0-го столбца и 0-й строки У меня есть этот код: [code]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) [/code] Когда я запускаю программу, она выводит следующее: [code] 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]]
Process finished with exit code 0 [/code] Теперь я не знаю о зеленой и синей матрицах Фурье, но красная определенно неверна, так как значение красного является постоянным во всем файле (палитра имеет постоянное значение красного 255) Матрица, которая представляет собой ДПФ для красного цвета, должна состоять из всех нулей, кроме ячейки 0,0 Что я сделал не так и как это исправить?>