私はopencvで簡単なプログラムをPythonでやっています。私は自分自身でいくつかのアルゴリズムを書いていますので、画像の中の「生の」画像データを取得する必要があります。私はちょうどイメージ[i、j]をすることはできません、どうすれば数字を得ることができますか?Opencv ... IPLImageやCvMatでデータを取得する
おかげ
私はopencvで簡単なプログラムをPythonでやっています。私は自分自身でいくつかのアルゴリズムを書いていますので、画像の中の「生の」画像データを取得する必要があります。私はちょうどイメージ[i、j]をすることはできません、どうすれば数字を得ることができますか?Opencv ... IPLImageやCvMatでデータを取得する
おかげ
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)
私はOpenCVのPythonバインディングを知らないが、CまたはC++であなたがIplImageへに保存されているバッファのポインタを取得する必要があります。このバッファは画像フォーマット(IplImageにも格納されている)に従ってコード化されています。 RGBの場合、Rのバイト、Gのバイト、Bのバイトなどがあります。
python bindingsのAPIを見ると、バッファにアクセスしてピクセル情報にアクセスできるようになります。
MY2C
れるCvMatやIplImageへの両方が生データを表す文字列を返すtostring
方法を提供します。画像データを使用して、文字列データを行列として解釈する方法を理解できます。
fromarray
を使用して、データ文字列をイメージオブジェクトに変換することができます。
文字列を配列に変換するには、array
モジュールをPythonで使用することを検討してください。例えば:
array.array('B', CvMat.tostring()) # 'B' is unsigned char, for rgb8 images
は、ピクセル間の 'ストライド' を取得するために使用:
stride = CvMat.step/CvMat.cols
そして、典型的な配列のインデックスは、個々のピクセルを取得します。あなたはおそらく、すべての厄介な複雑さを隠すクラスでこれを包み込みたいでしょう。
おかげさまで... [y、x]の順番には理由がありますか?また、各要素に0.5を掛けると、これをどのように達成できますか? – Ferguzz
確かです。行列は 'row、col'によってインデックス付けされ、各カラータプルはカラー画像に対して'(B、G、R) 'の順序で並べられます。答えを更新して、1つ以上のカラーコンポーネントに0.5を乗算する方法を示します。 – samplebias