画像計測のためのRaw現像

このページでは「PythonのRawPyモジュールを用いた画像計測に適したRaw現像処理」について解説します。

作成日:2024/06/05

  1. はじめに

デジタルカメラによる撮影画像から輝度計測を行うには、計測に適した現像処理を行う必要があります。撮影画像は一般的にJPEG形式の画像ファイルでカメラストレージに保存されますが、JPEG形式の画像はすでに現像処理が行われています。現像処理はイメージセンサーによる計測値を元に、明るさやコントラスト、ホワイトバランスなどの画像調整を行うものです。また現像処理はメーカーごとに設定が異なり、多くは画像の見栄えを重視した処が行われています。そのため画像計測を行うには、現像前のRAW形式の計測データをカメラから取得し、自分で現像処理を行う必要があります。

[ 注 意 書 き ]
・参考 Program の環境(python 3.8)
・以下のプログラムをコピーする時は、全角やスペースが含まれていないか注意してください。
・Rawファイルの形式によっては正しく動作しない可能性があります。

2. Python プログラム

2-1. モジュールのインポート

# Rawデータを現像するためのモジュール

import rawpy

import rawpy.enhance


# 画像の保存や確認に使用するモジュール

import tifffile as tif

import numpy as np

import matplotlib.pyplot as plt

2-2. Rawデータの読み込み

Fname = "DJI_20231228115106_0018"

IFile1 = rawpy.imread(Fname + '.DNG')

OFile1 = Fname + '.tif'


# カメラに保存されているホワイトバランス

wbo = IFile1.camera_whitebalance

print("Eライト:",wbo)

wbd = IFile1.daylight_whitebalance

print("Dライト:",wbd) # デフォルト

2-3. 現像処理の設定

# デベイヤの設定(こちらを使用する)

RawPyParameters1 = rawpy.Params(

                  

                       #階調と色空間

                       output_bps           = 16,

                       output_color         = rawpy.ColorSpace.raw,  # raw=0


                       # ブラックレベル

                       user_black           = [0,0,0,0],

                      

                       # スケール調整の有無

                       no_auto_scale        = False,


                       # 露出

                       no_auto_bright       = True,     

                      

                       #ホワイトバランス(用途に合わせて使い分ける)

                       #use_camera_wb        = True,

                       #use_auto_wb          = False,

                       user_wb              = [1.0,1.0,1.0,0.0],

                      

                       # デモザイク

                       demosaic_algorithm   = rawpy.DemosaicAlgorithm.LINEAR,


                       #階調の応答特性

                       gamma                = [1.00,0.00] #ガンマ無し

                   )

2-4.  現像処理の関数

# RawPyを使った現像処理の関数

def RawPostprocess(Paramnum,raw_original):

   RGB_original = raw_original.postprocess(params=Paramnum)

   hight, width, channel = RGB_original.shape

   raw_original.close()

   return RGB_original, hight, width, channel

2-5. 現像処理

# 画像の読み込みと現像処理

RGB_original, hight, width, channel = RawPostprocess(RawPyParameters1,IFile1)

2-6. 画像の確認と保存のための関数

# 現像した画像を確認する(引数1=表示する画像)

def ImageShowRGB_16(Image):

  Image2 = (Image / 65536 * 255).astype(np.uint8) # 8bitのデータ形式に変換

  plt.figure(figsize=(8,8))

  plt.imshow(Image2)

  plt.show()


# Tiff形式で画像を保存する(引数1=保存先,引数2=保存する画像)

def ImSaveInTiff(OFile,Image):

  tif.imwrite(OFile,Image)

2-7. 画像の確認と保存

# 画像を表示

ImageShowRGB_16(RGR_original)


# Tifファ入りで保存

ImSaveInTiff(OFile1,RGR_original.astype('uint16'))

3. 参考資料

ゼロから作るRAW現像 , 大泉宗徳(@MuneOiz),技術書展6, 2019.

WEBページ制作メモ:
・プログラム以外にソフトウェアを使った方法は?
・RawPy以外のモジュールはある?