Pythonでopencvを使用していくつかの簡単なプログラムを実行しています。私は自分でいくつかのアルゴリズムを書きたいので、画像内の「生の」画像データを取得する必要があります。たとえば、image[i,j] だけを実行することはできません。どうすれば数字を取得できますか?
ありがとう
LoadImageM
画像ファイルを に直接ロードするために使用する簡単な例cvmat
:
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)
によって 1 つまたは複数のカラー チャネルを複数にする方法を示す簡単な例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)
CvMat と IplImage は両方ともtostring
、生データを表す文字列を返すメソッドを提供します。画像データを使用して、文字列データを行列として解釈する方法を理解できます。
fromarray
データ文字列を画像オブジェクトに変換するために使用できるはずです。
文字列を配列に変換するにはarray
、Python でモジュールを使用することを検討してください。例えば:
array.array('B', CvMat.tostring()) # 'B' is unsigned char, for rgb8 images
ピクセル間の「ストライド」を取得するには、次を使用します。
stride = CvMat.step / CvMat.cols
次に、個々のピクセルを取得するための典型的な配列のインデックス付け。おそらく、厄介な複雑さをすべて隠すクラスにこれらすべてをまとめたいと思うでしょう。
opencv python バインディングはわかりませんが、C または C++ では、IplImage に格納されているバッファー ポインターを取得する必要があります。このバッファーは、イメージ形式に従ってコーディングされます (IplImage にも格納されます)。RGB の場合、R 用のバイト、G 用のバイト、B 用のバイトなどがあります。
PythonバインディングのAPIを見ると、バッファにアクセスする方法がわかり、ピクセル情報にアクセスできます。
my2c