На Python после преобразования RGB в CMY формируется чёрное изображение
Есть какое-то изображение RGB, мы из него делаем трёхмерный массив(матрицу), после чего делаем преобразование из RGB в CMY и полученные значения записываем в новую матрицу и сохраняем как изображение. После того как сохранил новое изображение, получил просто черную картинку, хотя если вывести трёхмерную матрицу значений полученного изображения можно увидеть, что значения пикселей явно не нулевые. Недавно я задавал подобный вопрос c подобной проблемой, но там было изображение в тонах серого и ограничивалось всё добавлением параметра dtype = 'uint8' при создании новой матрицы типа Numpy для получения конечного изображения. Но тут я не могу понять: ошибка в алгоритме преобразования RGB в CMY(но это не самое важное, алгоритм можно исправить), или же чего-то не хватает при создании новой матрицы, или не правильно сохраняю новое изображение?
from PIL import Image
import numpy as np
img_rgb = Image.open('s.png')
rgb_matr = np.asarray(img_rgb.convert('RGB'))
print(rgb_matr.shape)
rgb_rows, rgb_cols, rgb_d = rgb_matr.shape
cmyk_matr = np.zeros(shape = (rgb_rows, rgb_cols, rgb_d), dtype = 'uint8')
RGB_coeff = 255
CMYK_coeff = 100
def rgb_to_cmyk(*args):
r = args[0]
g = args[1]
b = args[2]
if(r, g, b) == (0, 0, 0):
return 0, 0, 0
c = 1 - r / RGB_coeff
m = 1 - g / RGB_coeff
y = 1 - b / RGB_coeff
# min_cmy = min(c, m, y)
# c = (c - min_cmy)/(1 - min_cmy)
# m = (m - min_cmy)/(1 - min_cmy)
# y = (y - min_cmy)/(1 - min_cmy)
# k = min_cmy
return int(c * CMYK_coeff), int(m * CMYK_coeff), int(y * CMYK_coeff)
for item1 in rgb_matr:
i = 0
for item2 in item1:
j = 0
cmyk_matr[i][j] = np.asarray(rgb_to_cmyk(*item2), dtype = 'uint8')
print(cmyk_matr[i][j])
j += 1
i += 1
img_cmy = Image.fromarray(cmyk_matr)
img_cmy.save('CMY.png')
Ответы (1 шт):
АХхаха я понял, всё было на много проще. Нужно было объявить i и j до циклов for соответственно)))
i = 0
for item1 in rgb_matr:
j = 0
for item2 in item1:
cmyk_matr[i][j] = np.asarray(rgb_to_cmyk(*item2))
print(cmyk_matr[i][j])
j += 1
i += 1