Я пытаюсь уменьшить цвет файла изображения ppm от 255 цветов до 5 цветов (красный, синий, зеленый, черный и белый). Когда я запускаю свой тестовый файл, генерируемый pixel_list является только красным, что неверно. Я использую формулу евклидовой дистанции, чтобы найти, какой из 5 цветов пиксель ближе всего и меняет значения на этот цвет. (Цвет сокращения)Уменьшение цвета - генерируются только красные
Ниже приведен пример моих данных: (.. Первые три строки являются тип файла, размеры и общее количество цветов следующие строки пиксельные данные упорядочены в г, г, б)
P3
200 200
255
0
48
255
216
52
180
252
255
176
212
96
4
0
108
20
40
64
80
140
0
80
Мой код:
import math
with open('test_pattern.ppm','r') as f:
output = f.read().split("\n")
i = 0
r_point = 3 + i
g_point = 4 + i
b_point = 5 + i
pixel_list = []
resolution = []
resolution.append(output[1].split(" "))
file_size = resolution[0]
file_size = int(file_size[0]) * int(file_size[1])
file_size = int(file_size*3)
print(file_size)
while file_size >= i:
r = int(output[r_point])
g = int(output[g_point])
b = int(output[b_point])
if all(math.sqrt((r-255)**2 + (g - 0)**2 + (b-0)**2) < x for x in [math.sqrt((r-0)**2 + (g - 255)**2 + (b-0)**2) , math.sqrt((r-0)**2 + (g - 0)**2 + (b-255)**2) , math.sqrt((r-0)**2 + (g - 0)**2 + (b-0)**2) , math.sqrt((r-255)**2 + (g - 255)**2 + (b-255)**2)]):
r = 255
g = 0
b = 0
pixel_list.append(r)
pixel_list.append(g)
pixel_list.append(b)
i += 3
elif all(math.sqrt((r-0)**2 + (g - 255)**2 + (b-0)**2) < x for x in [math.sqrt((r-0)**2 + (g - 0)**2 + (b-255)**2) , math.sqrt((r-255)**2 + (g - 0)**2 + (b-0)**2) , math.sqrt((r-0)**2 + (g - 0)**2 + (b-0)**2) , math.sqrt((r-255)**2 + (g - 255)**2 + (b-255)**2)]):
r = 0
g = 255
b = 0
pixel_list.append(r)
pixel_list.append(g)
pixel_list.append(b)
i +=3
elif all(math.sqrt((r-0)**2 + (g - 0)**2 + (b-255)**2) < x for x in [math.sqrt((r-0)**2 + (g - 255)**2 + (b-0)**2) , math.sqrt((r-255)**2 + (g - 0)**2 + (b-0)**2) , math.sqrt((r-0)**2 + (g - 0)**2 + (b-0)**2) , math.sqrt((r-255)**2 + (g - 255)**2 + (b-255)**2)]):
r = 0
g = 0
b = 255
pixel_list.append(r)
pixel_list.append(g)
pixel_list.append(b)
i += 3
elif all(math.sqrt((r-0)**2 + (g - 0)**2 + (b-0)**2) < x for x in [math.sqrt((r-0)**2 + (g - 255)**2 + (b-0)**2) , math.sqrt((r-255)**2 + (g - 0)**2 + (b-0)**2) , math.sqrt((r-0)**2 + (g - 0)**2 + (b-255)**2) , math.sqrt((r-255)**2 + (g - 255)**2 + (b-255)**2)]):
r = 0
g = 0
b = 0
pixel_list.append(r)
pixel_list.append(g)
pixel_list.append(b)
i += 3
elif all(math.sqrt((r-255)**2 + (g - 255)**2 + (b-255)**2) < x for x in [math.sqrt((r-0)**2 + (g - 255)**2 + (b-0)**2) , math.sqrt((r-255)**2 + (g - 0)**2 + (b-0)**2) , math.sqrt((r-0)**2 + (g - 0)**2 + (b-0)**2) , math.sqrt((r-0)**2 + (g - 0)**2 + (b-255)**2)]):
r = 255
g = 255
b = 255
pixel_list.append(r)
pixel_list.append(g)
pixel_list.append(b)
i += 3
print(pixel_list)
Второй Try:
import math
with open('test_pattern.ppm','r') as f:
output = f.read().split("\n")
i = 0
r_point = 3 + i
g_point = 4 + i
b_point = 5 + i
pixel_list = []
resolution = []
resolution.append(output[1].split(" "))
file_size = resolution[0]
file_size = int(file_size[0]) * int(file_size[1])
file_size = int(file_size*3)
print(file_size)
while file_size >= i:
r = int(output[r_point])
g = int(output[g_point])
b = int(output[b_point])
a = math.sqrt((r-255)**2 + (g - 0)**2 + (b-0)**2)
b = math.sqrt((r-0)**2 + (g - 255)**2 + (b-0)**2)
c = math.sqrt((r-0)**2 + (g - 0)**2 + (b-255)**2)
d = math.sqrt((r-0)**2 + (g - 0)**2 + (b-0)**2)
e = math.sqrt((r-255)**2 + (g - 255)**2 + (b-255)**2)
L = [a, b, c, d, e]
idx = min(range(len(L)), key=L.__getitem__)
if idx == 0:
# red
r = 255
g = 0
b = 0
pixel_list.append(r)
pixel_list.append(g)
pixel_list.append(b)
i += 3
if idx == 1:
# green
r = 0
g = 255
b = 0
pixel_list.append(r)
pixel_list.append(g)
pixel_list.append(b)
i += 3
if idx == 2:
# blue
r = 0
g = 0
b = 255
pixel_list.append(r)
pixel_list.append(g)
pixel_list.append(b)
i += 3
if idx == 3:
# white
r = 0
g = 0
b = 0
pixel_list.append(r)
pixel_list.append(g)
pixel_list.append(b)
i += 3
if idx == 4:
# black
r = 255
g = 255
b = 255
pixel_list.append(r)
pixel_list.append(g)
pixel_list.append(b)
i += 3
print(pixel_list)
При перемещении 'r_point = 3 + i' ' g_point = 4 + i' 'b_point = 5 + i' внутри время цикла, программа будет работать, но вы должны продолжать реорганизовать его, так как это все еще можно сделать намного проще для чтения –
Спасибо, что это сработало – Wakedude