Python独習!

習得したPython知識をペイフォワード

Pythonで48bitカラー画像を読み込んでRGBの単色16bit画像に分解する

Pythonで48bitカラー画像を諧調を維持したまま取り扱うにはどうしたらよいか?
imageioモジュールを使う。PillowOpencvは対応していないらしい。

※画像フォーマットはTiffです。PNGでもできると説明している記事がありましたが、今回は試していません。
python - Resizing a 48bit PNG retaining its 48bits, without dropping it to a 24bit file - Stack Overflow

サンプルプログラム

概要

48bitカラー画像をRGBに分解して、16bitの単色画像(計3枚)として保存するプログラムです。GIMPやImageJでも同じことができます。
そもそも48bitカラーはモニターが対応していないと恩恵がないのですが、このサンプルプログラムのように単色化もしくはグレースケール化して画素値(数値)を取り扱う分には有用だと思っています。例えば、24bitカラーよりも照明の微小な変化を拾うことができます。

テスト画像として、左から右に向かって赤→緑→青というように変化する画像をGIMPで作成しました。48bitカラーのTiff形式です。
python_48bit_color

これをRGBに分解して保存すると、ちゃんと赤緑青の領域で分かれてるのがわかります。深さも16bitで狙い通りです。
python_48bit_color
python_48bit_color
※解像度が何故か1dpiになっているのかわかりません…

ソースコード

#python 3.8.1
#imageio 2.9.0

import imageio

img = imageio.imread('48bit.tif')

imageio.imwrite('16bit_Red.tif', img[:,:,0])
imageio.imwrite('16bit_Green.tif', img[:,:,1])
imageio.imwrite('16bit_Blue.tif', img[:,:,2])
/* -----codeの行番号----- */