LibRawでRAWファイルをのぞいてみる | Nature | Photography | Music | Art

Nature | Photography | Music | Art

日々好奇心の趣くまま

サイト内の写真の使用ならびに無断転用を禁じます。

LibRaw…本家サイトの説明には以下のように書かれています。


LibRaw is a library for reading RAW files obtained from digital photo cameras (CRW/CR2, NEF, RAF, DNG, and others).


つまり自分でカメラが吐き出すRAWファイルの中身をいろいろ詮索するプログラムを作れるというC++ライブラリ。

そもそもdcrawという(かなり凄いらしい)オープンソースのRAW現像ソフトがあるのだが、そのソースが非常に難解なので簡単に操作できるようにラッパーを作ったというのがこのライブラリが作られた理由のようです。

いずれにしてもこのライブラリ、おそらくカメラを普通に弄っている人にはほとんど必要のないシロモノでしょう。

なぜこんなものに手を出したかというと、1ボードLinuxに載せてTimeLapse撮影時にリアルタイムでヒストグラムを見ながら露出調整ができないかと考えているのです。
例えば、夕~夜や夜~朝など、明るさが劇的に変わる状況とか。
まあ、本当に出来るかどうかは今後の実験しだいなのですが。

結構出来のよいライブラリにもかかわらず、やはりニーズがほとんどないのかWeb上にはほとんど情報がなく、本家サイトのドキュメントも簡素すぎて分かりにくい。

ということで、どなたかの役に立つかもしれないので分かった範囲でまとめておきます。

しかしながら、まだ理解できていないところが多々ありますので、メモ程度だと思ってください。誤りも多々あるかもしれません。

インストール、コンパイル方法などは本家サイトに詳しく書いてあるので割愛します。

自身の環境ではVMWare上でのUbuntu+gcc、カメラは5D2&5D3で正常に動作しました。

基本的に コンパイル時にlibraw/libraw.hをincludeして、リンク時にlibrawライブラリをリンクすればOKです。

ざっとした使い方と動作が分かるようなサンプルを以下に作ってみました。

[DL]

使い方はコンパイル後コマンドプロンプトで

libraw_test [rawファイル]

と入力。

ここでやっていることの大筋は次のような感じです。

・LibRawオブジェクト(RawProcessor)を生成

・RAWファイル読み込み(RawProcessor.open_file)

・主要なRAWに含まれるExif情報・パラメータを表示。

・Bayerデータ(もしくはYCbCr/RGBデータ)生成(RawProcessor.unpack)

・Bayerデータ(もしくはYCbCr/RGBデータ)の左上の一角をダンプ。(全部ダンプすると大変なので)

・同時にraw.binにBayerデータ(もしくはYCbCr/RGBデータ)を保存

・ポストプロセスの準備?(RawProcessor.raw2image) …なくても動く、まだ良く分からない。

・サムネールjpgを生成(RawProcessor.unpack_thumb)…RAWファイルの中にはプレビュー用のjpgが埋め込まれているらしい。それを取り出すのがこれ。

・tiffを生成(RawProcessor.dcraw_process)

主要な処理ブロックの処理時間も計測しています。

実行すると、以下のような感じでズラズラと情報が出てくると思いますが、大体はRAW現像ソフトが表示するExif情報と同じなので内容は分かるかと思います。(中には不明なものもあります。)




idata----------------------------
make(Camera manufacturer): Canon
model(Camera model.): EOS 5D Mark III
raw_count(Number of RAW images in file): 1
dng_version(DNG version (for the DNG format).): 0
colors(Number of colors in the file.): 3
sizes----------------------------
(Full size of RAW image (including the frame) in pixels.)
raw_height: 3950
raw_width: 5920
(Size of visible (meaningful) part of the image (without the frame).)
height: 3870
width: 5796
(Coordinates of the top left corner of the frame)
top_margin: 80
left_margin: 122
(Size of the output image)
iheight: 3870
iwidth: 5796
raw_pitch(Full size of raw data row in bytes.): 0
flip(Image orientation): 0
colors----------------------------
maximum(Maximum pixel value. Calculated from the data for most cameras, hardcoded for others): 15488
data_maximum(Maximum pixel value in real image (not including masked area)): 0
black(Black level. Depending on the camera): 0
other----------------------------
iso_speed: 320.000000
shutter: 789.611918
aperture: 16.000000
focal_len: 24.000000
desc:
artist:
rawdata(pre unpack)----------------------------
raw_alloc: 0
raw_image: 0
color3_image: 0
color4_image: 0
params----------------------------
sraw_ycc: 0
unpack: 0.950000 sec
colors----------------------------
maximum: 15488
data_maximum: 0
black: 2047

raw_pitch: 11840
rawdata(post unpack)----------------------------
raw_alloc: b45f0008
raw_image: b45f0008
color3_image: 0
color4_image: 0
[0875] [092b] [0871] [091b] [086d] [0917] [0877] [0911] [0879] [091c] [086d] [0931] [0879] [0924] [0874] [0932]
[0929] [08fb] [091e] [08ed] [0927] [0907] [0931] [08fb] [0937] [0902] [0928] [0907] [093d] [0903] [0925] [0907]
[0871] [0920] [0885] [0913] [0862] [0925] [086d] [0908] [086d] [091b] [0872] [092c] [086d] [0934] [0885] [0940]
[0919] [0903] [0933] [0906] [091c] [08fe] [091c] [0901] [0931] [08f3] [092e] [090b] [092f] [08fe] [093a] [090c]
.
.
.
.
maxval = 13513(34c9h), minval = 0(0h)
rough tiff: 0.110000 sec
rawdata(post raw2image)----------------------------
raw_alloc: b45f0008
raw_image: b45f0008
color3_image: 0
color4_image: 0
raw2image: 0.230000 sec
unpack_thumb: 0.010000 sec
dcraw_process: 4.050000 sec




従って解説が必要そうな箇所だけ自身の備忘録を兼ねて列挙しておきます。

個人的に必要な機能は主にBayerデータ(もしくはYCbCrデータ)の生成までなので、そこを重点的に。
それ以降の機能はあまり追及していません。

1. サイズをあらわす変数が多いので混乱しそうだが、(raw_height,raw_width)はバッファ全体のサイズ、(height,width)(iheight,iwidth)は画像の有効サイズ(双方の区別がまだ良く分からないが、いつも同値なので気にしていない)、(top_margin,left_margin)は余白部分。

つまりバッファから有効画像を切り出す場合は[(left_margin,top_margin),(left_margin + iwidth - 1,top_margin + iheight - 1)]の矩形を切り出せばよい。

2. maximumが輝度の最大値。unpack前後で値が変わるが、何故なのかは良く分からない。

3. 5D2,5D3のRAWで見る限り、Full RAWの場合はBayer配列、MRAW&SRAWの場合は[Y,Cb,Cr,0h]がlibRaw内部で変換されて[R,G,B,0h]の形式で格納されるみたい。従ってプログラムではこれら2つの場合で処理を分けた。

後者の場合、unpack前にRawProcessor,imgdata.params.sraw_ycc = 1とするとRGB変換が行われずYCbCrそのままで格納される。荒く輝度ヒストグラムをとる程度ならばこちらの方が便利かも。ただし、ポスト処理で出されるtiffが化ける。

また、格納データは輝度が線形のままなのでそのままだと非常に暗い。この生データを利用する場合は別途ガンマ補正をかける必要があるかと。

4. unpack後のrawデータのポインタが幾つか存在するが、Full RAWの場合raw_alloc,MRAW&SRAWの場合はcolor4_imageにデータが格納される。各々のデータ形式は3で書いた通り。

どなたかの役に立てば幸いです。(…があまり誰も使わないか…)

----
後日補足

使用例としてこんな記事も書きました。