簡體   English   中英

如何將RGB圖像(3通道)轉換為灰度(1通道)並保存?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM