2009-10-08 28 views
5

生の画像から各ピクセルのRGB値を読みたいと思います。誰かがこれを達成する方法を教えてもらえますか?手伝ってくれてありがとう!Cの生画像から各ピクセルのRGB値を取得する

生画像のフォーマットは、カメラから来る.CR2です。

+2

"生のイメージ"の表示方法とそのフォーマットを指定する必要があります。 – sharptooth

+2

"生のイメージ"を定義します。イメージファイルですか?もしそうなら、どのようなファイルですか?または、画面キャプチャをしようとしていますか?詳細を追加するには、質問を編集します。 – Artelius

+1

"生の"画像はどのような形式ですか?それはビットマップか、おそらくカメラから撮影された画像ファイルですか? – ChrisBD

答えて

1

RAW画像は圧縮されていない形式なので、ピクセルはどこにあるのかを指摘するだけです(可能なヘッダーをスキップして、ピクセルのサイズに数値列の行数とcolum)を作成し、バイナリデータがデータのレイアウトに意味のある形式を与えているかどうかを読み取ります(マスクとシフトがあります)。

これは一般的な手順です。現在の形式では、詳細を確認する必要があります。

4

イメージがw * hピクセルであり、アルファ成分のない真の「パック」RGBフォーマットで格納されていると仮定すると、各ピクセルは3バイト必要です。メモリに

は、画像の最初のラインは、このような素晴らしいASCIIグラフィックで表現されるかもしれない:ここ

R0 G0 B0 R1 G1 B1 R2 G2 B2 ... R(w-1) G(w-1) B(w-1) 

、各R N G N及びB Nは単一バイトを表します画素の赤、緑または青の成分にその走査線のnを与える。バイトの順序は、さまざまな「未処理」形式で異なる可能性があることに注意してください。合意した世界標準はありません。どのような理由であれ別の環境(グラフィックスカード、カメラ、...)は違ったやり方でレイアウトを知るだけです。ピクセルの読み出し

は、この機能によって行うことができます。

typedef unsigned char byte; 
void get_pixel(const byte *image, unsigned int w, 
       unsigned int x, 
       unsigned int y, 
       byte *red, byte *green, byte *blue) 
{ 
    /* Compute pointer to first (red) byte of the desired pixel. */ 
    const byte * pixel = image + w * y * 3 + 3 * x; 
    /* Copy R, G and B to outputs. */ 
    *red = pixel[0]; 
    *green = pixel[1]; 
    *blue = pixel[2]; 
} 

画像の高さが動作するように、このために必要とされていないか注意してください、そしてどのように機能が境界チェックから自由です。生産品質の機能は、より多くの鎧をつけているかもしれません。

更新あなたは、このアプローチがあまりにも遅くなり心配している場合は、あなたができるもちろんのではなく、ピクセルを超えるだけのループ、:

unsigned int x, y; 
const byte *pixel = /* ... assumed to be pointing at the data as per above */ 

for(y = 0; y < h; ++y) 
{ 
    for(x = 0; x < w; ++x, pixel += 3) 
    { 
    const byte red = pixel[0], green = pixel[1], blue = pixel[2]; 

    /* Do something with the current pixel. */ 
    } 
} 
+0

彼は1ピクセルだけを照会する必要があるならば、あなたの機能は問題ありません。しかし、すべてのピクセルを処理する必要がある場合、この関数は遅すぎるため(関数オーバーヘッド+各ピクセルの3つの乗算)、行く方法ではありません。 – Toad

+0

@reinier:インライン展開がないと仮定します。明示的にネストされたスニペットを追加しました。ありがとう。 – unwind

+0

@unwind私はjpgファイルを持っていますが、imagemagickと適用されたしきい値を使用しました。さて、各ピクセルが黒か白かをチェックしたいと思います。上記の方法は機能しますか?赤、緑、青の値はどうなりますか? 255? – Kraken

5

これまでに掲載方法のいずれもが作業する可能性がありませんカメラの「生の」ファイル。 RAWファイルのファイル形式は各メーカー独自のもので、画素データに加えて露光データ、較正定数、ホワイトバランス情報を含むことがあります。これらのデータはパックド形式になっている可能性があります。しかし、2未満である。

オープンソースのRAWファイル変換プログラムがありますので、使用するアルゴリズムを調べるために相談できると思っていますが、私の頭の上からはわかりません。


ちょうど追加の合併症が考えられます。 RAWファイルには、各ピクセルのRGB値は格納されません。各ピクセルは1つの色しか記録しません。他の2つの色は、周囲のピクセルから補間されなければならない。あなたは間違いなくあなたのカメラで動作するプログラムやライブラリを見つけることをお勧めします。

関連する問題