[英]How to convert a RGB image (3 channel) to grayscale (1 channel) and save it?
使用深度學習項目,我有很多圖像,不需要顏色。 我救了他們做:
import matplotlib.pyplot as plt
plt.imsave('image.png', image, format='png', cmap='gray')
但是后來當我檢查圖像的形狀時,結果是:
import cv2
img_rgb = cv2.imread('image.png')
print(img_rgb.shape)
(196,256,3)
所以即使我查看的圖像是灰度的,我仍然有 3 個顏色通道。 我意識到我必須做一些代數運算才能將這 3 個通道轉換為 1 個單通道。
我已經嘗試了線程“ 如何在 Python 中將 RGB 圖像轉換為灰度? ”中描述的方法,但我很困惑。
例如,何時使用以下方法進行轉換:
from skimage import color
from skimage import io
img_gray = color.rgb2gray(io.imread('image.png'))
plt.imsave('image_gray.png', img_gray, format='png')
但是,當我加載新圖像並檢查其形狀時:
img_gr = cv2.imread('image_gray.png')
print(img_gr.shape)
(196,256,3)
我在該線程上嘗試了其他方法,但結果相同。 我的目標是獲得具有 (196,256,1) 形狀的圖像,考慮到卷積神經網絡的計算強度會降低多少。
任何幫助,將不勝感激。
你的第一個代碼塊:
import matplotlib.pyplot as plt
plt.imsave('image.png', image, format='png', cmap='gray')
這是將圖像保存為 RGB,因為在向 imsave 提供 RGB 數據時會忽略cmap='gray'
(請參閱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)
避免這種情況的一種方法是將圖像保存為 numpy 文件,或者確實將一批圖像保存為 numpy 文件:
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)
事實證明,我使用的深度學習庫 Keras 有自己的方法,可以在其圖像預處理步驟中將圖像轉換為單一顏色通道(灰度)。
使用ImageDataGenerator
類時, flow_from_directory
方法采用color_mode
參數。 設置color_mode = "grayscale"
將自動將 PNG 轉換為單個顏色通道!
https://keras.io/preprocessing/image/#imagedatagenerator-methods
希望這對未來的人有所幫助。
如果您只想添加與 graysacale 具有相同值的額外通道,則可能使用需要 3 通道 input_shape 的特定模型。
假設您的圖片是28 X 28 ,因此您的形狀為 (28 , 28 , 1) def add_extra_channels_to_pic(pic):
if pic.shape == (28 , 28 , 1):
pic = pic.reshape(28,28)
pic = np.array([pic , pic , pic])
# to make the channel axis in the end
pic = np.moveaxis(pic , 0 , -1)
return pic
試試這個方法
import imageio
new_data = imageio.imread("file_path", as_gray =True)
imageio.imsave("file_path", new_data)
代碼第 2 行中的可選參數“as_gray = True”進行實際轉換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.