Python OpenCV 16bit tif画像の出力・読み込み

Programming
Programming
スポンサーリンク

画像の出力(サンプル画像の書き出し)

下記のコードでは、x軸方向への正弦波画像の 16bit (unsigned int 16bit) tif 画像を生成しています.サンプルの16bit画像として生成しています.

import numpy as np
import cv2
import param

# 画像データを格納する np.ndarray オブジェクト
image = np.zeros((param.size_y, param.size_x), np.uint16)

row, col = image.shape

# x方向への正弦波画像を生成
for i in range(col):
    for j in range(row):
        image[j, i] = (param.valmax - 1) * (np.sin(2 * np.pi * i / param.freq)) ** 2

# 画像を出力する
path = "generated_img.tif"
cv2.imwrite(path, image)
gen_img.tif

ちなみに、いつも tif 形式の画像を確認等するときは、ImageJ というソフトを使用しています.ImageJ については下記を見てみてください.

Former Home of Imagej

OpenCV で16bit画像の読み込み

下記のコードでは、cv2.imread で第二引数に -1 (cv2.IMREAD_UNCHANGED) を指定して、入力画像のデータ型のまま読み込んでいます.

import cv2
import param

input_path = "generated_img.tif"
image = cv2.imread(input_path, -1)
print(type(image))
print(type(image[0, 0]))
print(image.shape)
# cv2.IMREAD_UNCHANGED = -1 そのまま読み込む
# cv2.IMREAD_GRAYSCALE = 0, グレースケール読み込み
# cv2.IMREAD_COLOR = 1, 3チャンネルカラー読み込み
# cv2.IMREAD_ANYDEPTH = 2, 深度マップの場合は 16-bit または 32-bit それ以外の場合は 8-bit で読み込み?
# cv2.IMREAD_ANYCOLOR = 4, 任意のカラーマップ?
# cv2.IMREAD_LOAD_GDAL = 8 GDALドライバで読み込み( 後で調べる )

# 画像を出力する
output_path = "read_img.tif"
cv2.imwrite(output_path, image)

# 画像の中央を黒にする
edited_image = image
edited_image[
    param.center_y - param.size_y // 8 : param.center_y + param.size_y // 8,
    param.center_x - param.size_x // 8 : param.center_x + param.size_x // 8,
] = 0

# 画像の中央を黒にした画像を出力する
output_path_edited = "read_edited_image.tif"
cv2.imwrite(output_path_edited, edited_image)
read_img.tif
read_edited_img.tif

パラメータファイル

下記は上記2つのファイルと同じディレクトリに入れる想定のパラメータファイルです.

# parameters
size_x = 1024
size_y = 1024
valmax = 2**16
center_x = size_x // 2  # 中央画素
center_y = size_y // 2  # 中央画素
freq = 200  # [pixels/line]

まとめ

今回は入力画像のデータ型そのままをOpenCVで受け取る方法を紹介しました.

コメント

タイトルとURLをコピーしました