почему cv2.imwrite () меняет цвет фото?

У меня есть следующий фрагмент кода:

imgs = glob.glob('/home/chipin/heart/tray.png')
current_img = io.imread(imgs[0])
cv2.imwrite('/home/chipin/heart/01.png', current_img[0:511,0:511])  

размер изображения 512*512, после сохранения синее изображение становится желтым. Кажется, канал заброшен. Я действительно не знаю, почему.

вот значение current_img:

value of current_img

1 ответов


ваша проблема в том, что skimage.io.imread загружает изображение как RGB (или RGBA), но OpenCV предполагает, что изображение BGR или BGRA (BGR-это цветовой формат OpenCV по умолчанию). Это означает, что синие и красные самолеты вращается.


3 Канала Изображения

давайте попробуем это со следующим простым тестовым изображением:

Input image


сначала давайте попробуем ваш оригинал алгоритм:

import skimage.io
import cv2

img = skimage.io.imread('sample.png')
cv2.imwrite('sample_out_1.png', img)

получаем следующий результат:

Result 1

как вы можете видеть, красные и синие каналы заметно меняются местами.


первый подход, предполагая, что вы хотите по-прежнему использовать skimage для чтения и cv2 для записи, - использовать cv2.cvtColor конвертировать из RGB в BGR.

поскольку в новых документах OpenCV не упоминается синтаксис Python, в этом случае вы также можете использовать соответствующая ссылка для 2.4.x.

import skimage.io
import cv2

img = skimage.io.imread('sample.png')
cv2.imwrite('sample_out_2.png', cv2.cvtColor(img, cv2.COLOR_RGB2BGR))    

теперь мы получаем следующий результат:

Result 2


альтернативой является просто использование OpenCV -- use cv2.imread загрузить изображение. В этом случае мы работаем только с изображениями BGR.

NB: не предоставление каких-либо флагов означает cv2.IMREAD_COLOR используемое по умолчанию -- т. е. изображение всегда загружается как 3-канал изображения (отказ потенциальные Альфа-каналы).

import cv2

img = cv2.imread('sample.png')
cv2.imwrite('sample_out_3.png', img)

Result 3


4 Канала Изображения

на скриншоте, кажется, что у вас есть 4-канальное изображение. Это означало бы RGBA в skimage и BGRA в OpenCV. Принципы будут аналогичны.

  • либо используйте код преобразования цвета cv2.COLOR_RGBA2BGRA
  • или использовать cv2.imread С флагом cv2.IMREAD_UNCHANGED