2017-01-06 2 views
4

次元が(1920, 1080, 3)の画像があるとします。R、G、B値を別々の配列R , G, Bに抽出したいとします。私はそれをしようとしましたnumpyでR、G、B値を別々の配列に抽出する方法

for i in range(image.shape[0]): 
     for j in range(image.shape[1]): 
      B = np.append(B, image[i, j][0]) 
      G = np.append(G, image[i, j][1]) 
      R = np.append(R, image[i, j][2]) 

これは非常に遅いですが、私はどのようにnumpyで組み込み関数でこれを行うことができますか?

+0

これは基本索引付けです。 'B = image [:、:、0]; G = image [:、:、1]; R = image [:、:、2] '。ほとんど何も気をつけないチュートリアルを見てください。 –

+0

または単にあなたの軸をロールし、単純なスライスを取る...ロール= np.rollaxis(rgb、-1)... r =ロール[0]、g =ロール[1]、b =ロール[2] – NaN

答えて

7

あなたはそれがOpenCV方法で使用する場合は、あなたがcv2.split()を使用することができ、あなたのイメージの心のチャンネルに保つ:

b, g, r = cv2.split(image) # For BGR image 
b, g, r, a = cv2.split(image) # for BGRA image 

それとも、直接numpyの形式を好む可能性がある場合、あなたは思われる[直接使用することができます] @igauravのコメントにつき、より効率的にする

b, g, r = image[:, :, 0], image[:, :, 1], image[:, :, 2] # For RGB image 
b, g, r, a = image[:, :, 0], image[:, :, 1], image[:, :, 2], image[:, :, 3] # for BGRA image 

あなたは、与えられた画像のチャンネル数を確認するためにnp.shape[2]を使用することができます。

+0

、ありがとう。 – Sigma

+0

OpenCVサイトから: '警告cv2.split()は時間の点でコストのかかる操作です。あなたがそれを必要とする場合にだけそれをしてください。そうでなければヌンピーの索引付けに行く」出典:http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_core/py_basic_ops/py_basic_ops.html – igaurav

+0

ありがとう、編集済み@igaurav – ZdaR

2

dsplitそれです。

import numpy as np 

def channelSplit(image): 
    return np.dsplit(image,image.shape[-1]) 

[B,G,R]=channelSplit(image) 

これは、RGBまたはRGBA画像で使用できます。