Ваш первый блок кода:
import matplotlib.pyplot as plt
plt.imsave('image.png', image, format='png', cmap='gray')
Это сохраняет изображение как RGB, потому что cmap='gray'
игнорируется при подаче данных RGB в imsave (см. документы pyplot ).
Вы можете преобразовать данные в оттенки серого, взяв среднее значение по трем полосам, либо используя color.rgb2gray
, как у вас, либо я обычно использую numpy:
import numpy as np
from matplotlib import pyplot as plt
import cv2
img_rgb = np.random.rand(196,256,3)
print('RGB image shape:', img_rgb.shape)
img_gray = np.mean(img_rgb, axis=2)
print('Grayscale image shape:', img_gray.shape)
Вывод:
RGB image shape: (196, 256, 3)
Grayscale image shape: (196, 256)
img_gray
теперь является правильной формой, однако, если вы сохраните ее, используя plt.imsave
, он все равно будет писать три полосы, с R == G == B для каждого пикселя.Это потому, что, как мне кажется, PNG-файл требует трех (или четырех) полос.Предупреждение: я не уверен в этом: я ожидаю исправления.
plt.imsave('image_gray.png', img_gray, format='png')
new_img = cv2.imread('image_gray.png')
print('Loaded image shape:', new_img.shape)
Вывод:
Loaded image shape: (196, 256, 3)
Один из способов избежать этого - сохранить изображения в виде файлов илидействительно, чтобы сохранить пакет изображений в виде пустых файлов:
np.save('np_image.npy', img_gray)
new_np = np.load('np_image.npy')
print('new_np shape:', new_np.shape)
Вывод:
new_np shape: (196, 256)
Другая вещь, которую вы можете сделать, это сохранить png в градациях серого (используя imsave
), но затемтолько чтение в первом диапазоне:
finalimg = cv2.imread('image_gray.png',0)
print('finalimg image shape:', finalimg.shape)
Вывод:
finalimg image shape: (196, 256)