почему 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:
1 ответов
ваша проблема в том, что skimage.io.imread
загружает изображение как RGB (или RGBA), но OpenCV предполагает, что изображение BGR или BGRA (BGR-это цветовой формат OpenCV по умолчанию). Это означает, что синие и красные самолеты вращается.
3 Канала Изображения
давайте попробуем это со следующим простым тестовым изображением:
сначала давайте попробуем ваш оригинал алгоритм:
import skimage.io
import cv2
img = skimage.io.imread('sample.png')
cv2.imwrite('sample_out_1.png', img)
получаем следующий результат:
как вы можете видеть, красные и синие каналы заметно меняются местами.
первый подход, предполагая, что вы хотите по-прежнему использовать 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))
теперь мы получаем следующий результат:
альтернативой является просто использование OpenCV -- use cv2.imread
загрузить изображение. В этом случае мы работаем только с изображениями BGR.
NB: не предоставление каких-либо флагов означает cv2.IMREAD_COLOR
используемое по умолчанию -- т. е. изображение всегда загружается как 3-канал изображения (отказ потенциальные Альфа-каналы).
import cv2
img = cv2.imread('sample.png')
cv2.imwrite('sample_out_3.png', img)
4 Канала Изображения
на скриншоте, кажется, что у вас есть 4-канальное изображение. Это означало бы RGBA в skimage и BGRA в OpenCV. Принципы будут аналогичны.
- либо используйте код преобразования цвета
cv2.COLOR_RGBA2BGRA
- или использовать
cv2.imread
С флагомcv2.IMREAD_UNCHANGED