Теперь я вижу, что происходит, я снова за компьютером. Вы, наверное, пробовали это:
#!/usr/bin/env python3
from PIL import Image
img = Image.open('start.png')
hsvimg = img.convert('HSV')
hsvimg.save('result.png')
И если вы это сделаете, вы получите сообщение об ошибке:
OSError: cannot write mode HSV as PNG
потому что PNG-изображения всегда находятся в цветовом пространстве sRGB, поэтому корректно отказывается записывать ваше HSV-изображение. Дело в том, что преобразование цветового пространства действительно сработало, а значения на изображении - это те значения HSV, которые вам нужны. Вы можете проверить это с помощью:
img.getpixel((X,Y))
и
hsvimg.getpixel((X,Y))
, где X
и Y
- любые произвольные координаты, которые вам нравятся. Вы увидите, что последний всегда является правильным представлением HSV цвета RGB первого.
Я не уверен, что вы пытаетесь делать в целом, поэтому я не могу по-настоящему посоветовать, но одну вещь, которую вы могли бы сделать, это "лежать сквозь зубы" и сказать PIL / Pillow, что изображение RGB, хотя вы знаете, что это HSV. Так что если вы делаете:
hsvimg = img.convert('HSV')
hsvimg.mode='RGB' # Tell PIL image is RGB
hsvimg.save('result.png')
оно сохранит изображение, но оно, как и все другие зрители, покажет ваш оттенок синим, насыщенность зеленым и значение голубым.
Я предполагаю, что у вас есть другая обработка, и это только промежуточный аспект вашей обработки, так что, вероятно, это не будет иметь значения, и вы, вероятно, сможете продолжить и выполнить свою обработку и преобразовать обратно в конце и сохранить в файл PNG sRGB без необходимости врать.
Отвечая на ваш актуальный вопрос, вы можете разделить и объединить такие каналы с помощью PIL / Pillow:
# Split and recombine with PIL
r,g,b = img.split()
merged = Image.merge(mode='RGB',bands=(r,g,b)))
Или, если вы предпочитаете Numpy, который часто быстрее:
# Open image as Numpy array
img = np.array(Image.open('start.png'))
# Split into 3 channels/arrays/bands
r = img[:, :, 0]
g = img[:, :, 1]
b = img[:, :, 2]
# Recombine to single image
merged = np.dstack((r, g, b))