2011-05-25 10 views
4

私はopencvで簡単なプログラムをPythonでやっています。私は自分自身でいくつかのアルゴリズムを書いていますので、画像の中の「生の」画像データを取得する必要があります。私はちょうどイメージ[i、j]をすることはできません、どうすれば数字を得ることができますか?Opencv ... IPLImageやCvMatでデータを取得する

おかげ

答えて

5

cvmatに直接画像ファイルをロードするLoadImageMを用いた簡単な例:

import cv 

path = 'stack.png' 
mat = cv.LoadImageM(path, cv.CV_LOAD_IMAGE_UNCHANGED) 
x, y = 42, 6 
print type(mat) 
print mat[y, x] 

出力:

<type 'cv.cvmat'> 
(21.0, 122.0, 254.0) 

方法複数の一つ以上の色チャネル別に示す簡単な例0.5

for x in xrange(mat.cols): 
    for y in xrange(mat.rows): 
     # multiply all 3 components by 0.5 
     mat[y, x] = tuple(c*0.5 for c in mat[y, x]) 

     # or multiply only the red component by 0.5 
     b, g, r = mat[y, x] 
     mat[y, x] = (b, g, r * 0.5) 
+0

おかげさまで... [y、x]の順番には理由がありますか?また、各要素に0.5を掛けると、これをどのように達成できますか? – Ferguzz

+0

確かです。行列は 'row、col'によってインデックス付けされ、各カラータプルはカラー画像に対して'(B、G、R) 'の順序で並べられます。答えを更新して、1つ以上のカラーコンポーネントに0.5を乗算する方法を示します。 – samplebias

0

私はOpenCVのPythonバインディングを知らないが、CまたはC++であなたがIplImageへに保存されているバッファのポインタを取得する必要があります。このバッファは画像フォーマット(IplImageにも格納されている)に従ってコード化されています。 RGBの場合、Rのバイト、Gのバイト、Bのバイトなどがあります。

python bindingsのAPIを見ると、バッファにアクセスしてピクセル情報にアクセスできるようになります。

MY2C

1

れるCvMatやIplImageへの両方が生データを表す文字列を返すtostring方法を提供します。画像データを使用して、文字列データを行列として解釈する方法を理解できます。

fromarrayを使用して、データ文字列をイメージオブジェクトに変換することができます。

文字列を配列に変換するには、arrayモジュールをPythonで使用することを検討してください。例えば:

array.array('B', CvMat.tostring()) # 'B' is unsigned char, for rgb8 images 

は、ピクセル間の 'ストライド' を取得するために使用:

stride = CvMat.step/CvMat.cols 

そして、典型的な配列のインデックスは、個々のピクセルを取得します。あなたはおそらく、すべての厄介な複雑さを隠すクラスでこれを包み込みたいでしょう。

関連する問題