6

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

私の生の画像の形式は、カメラからの.CR2です。

4

3 に答える 3

9

画像が 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は 1 バイトを表し、そのスキャンラインのピクセル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. */
  }
}
于 2009-10-08T08:00:11.717 に答える
5

これまでに投稿された方法は、カメラの「生」ファイルで機能する可能性はありません。RAW ファイルのファイル形式は各メーカー独自のものであり、ピクセル データに加えて、露出データ、キャリブレーション定数、およびホワイト バランス情報が含まれる場合があります。これらのデータは、各ピクセルが 1 つ以上を占める可能性のある圧縮形式である可能性があります。バイトですが、2 未満です。

使用するアルゴリズムを見つけるために参照できるオープンソースの raw ファイル コンバーター プログラムが世の中にあると確信していますが、頭に浮かんだことは何も知りません。


追加の複雑さを考えただけです。raw ファイルには、各ピクセルの RGB 値は保存されません。各ピクセルは 1 つの色のみを記録します。他の 2 つの色は、ハイボーリング ピクセルから補間する必要があります。お使いのカメラで動作するプログラムまたはライブラリを見つけた方が確実に良いでしょう。

于 2009-10-29T07:05:43.297 に答える
1

A RAW image is an uncompressed format, so you just have to point where your pixel is (skipping any possible header, and then adding the size of the pixel times the number columns times the number of row plus the number of the colum), and then read whatever binary data is giving a meaningful format to the layout of the data (with masks and shifts, you know).

That's the general procedure, for your current format you'll have to check the details.

于 2009-10-08T07:42:57.213 に答える