画像の出力(サンプル画像の書き出し)
下記のコードでは、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)
ちなみに、いつも 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)
パラメータファイル
下記は上記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で受け取る方法を紹介しました.
コメント