2017-01-31 11 views
1

私は生のピクセルデータ(例、幅、高さ、チャンネルの数)を含む4D配列にほぼ40000の画像を持っています。すべての画像の幅は32ピクセル、高さは32ピクセル、RGBカラーは3チャネルです。私はそれらをグレースケールの画像に変更したい(3つのチャンネルからrgbを取得して輝度を1にする)。どのように私はそれを非常に速くすることができますか? マイコード:Pythonで3チャンネルrgbカラー画像を1チャンネルのグレーに変更するにはどうすればいいですか?

import pickle 
import cv2 
training_file = "/train.p" 

with open(training_file, mode='rb') as f: 
train = pickle.load(f) 
X_train = train['features'] 

def rgb2gray(rgb): 
    r, g, b = rgb[0], rgb[1], rgb[2] 
    gray = 0.2989 * r + 0.5870 * g + 0.1140 * b 
return gray 

X_train_gray = X_train.copy() 

for i in range (X_train_gray.shape[0]): 
    for j in range (X_train_gray.shape[1]): 
     for k in range (X_train_gray.shape[2]): 
      rgb = X_train_gray[i,j,k] 
      gray = rgb2gray(rgb) 
      X_train_gray[i,j,k] = gray 

print("X_train image data shape =", X_train.shape) 
print("X_train_grey image data shape =", X_train_gray.shape) 

結果:
X_train_grey画像データの形状=(40000、32、32、3)
X_train_grey画像データの形状=(40000、32、32、1)
それは良いことです、しかし、それは多くの時間がかかります。

Iはまた、CV2を使用しようとした:

X_train_gray = X_train[0].copy() 
print("X_train_grey image data shape =", X_train_gray.shape) 
X_train_gray = cv2.cvtColor(X_train_gray, cv2.COLOR_BGR2GRAY) 
print("X_train_grey image data shape =", X_train_gray.shape) 

結果:
X_train_grey画像データの形状=(32、32、3)
X_train_grey画像データの形状=(32、32)
しかしIを強度を失い、それを得る方法がわからない。
どのように私は3チャンネルrgbから1チャンネルの灰色にこの画像を変えることができますか?

答えて

0

次を使用してください:cv :: cvtColor(gray_img、color_img、CV_GRAY2BGR)

関連する問題