OPENCVを用いて、2枚の画像の数値化、値で差を取って再度画像に戻す

実現したいこと

OPENCVを用いた画像処理
2枚のtif画像の各ピクセルを数値化して、各ピクセルごとのデータの差を取って2で割って、再度画像化したい

前提

python(spider)でOPENCVを用いて、歪みテンソルから回転歪みを導出したいと思っています。
http://www.matsumoto.nuem.nagoya-u.ac.jp/matsumoto/lec/2009doc3.pdf
このpdfの8枚目にあるように、2つの値(歪みテンソル)の差をとって2で割ることで回転歪みが出ます。
現在、それぞれの値(歪みテンソル)のカラーマップのデータがあり、それを数値化してそれぞれの数値の差を取り2で割ることによって回転歪みの値のリストを作成し、再度画像化することによって回転歪みマップを作製したいと考えています。

そもそもこのようなことが可能なのかということ、そして作成したコードから画像を再構成したところ、ファイルが破損してしまったので解決策を教えていただきたいです。
また、画像を32ビットから16ビットに変換していますが、この時にどのような弊害があるか教えていただきたいです。

発生している問題・エラーメッセージ

はじめに、画像をそのまま使うと、

Error: Unable to read the images. Check the file paths. [ WARN:0@14001.873] global D:\a\opencv-python\opencv-python\opencv\modules\imgcodecs\src\grfmt_tiff.cpp (462) cv::TiffDecoder::readData OpenCV TIFF: TIFFRGBAImageOK: Sorry, can not handle images with 32-bit samples

のようなエラーが発生したため、32ビットから16ビットに変換しています。

該当のソースコード

python

1# %%2import cv2 3import numpy as np 4 5def convert_32bit_to_16bit(input_path, output_path):6 # 32ビットTIFF画像を読み込む7 image_32bit = cv2.imread(input_path, cv2.IMREAD_UNCHANGED)8 9 if image_32bit is not None:10 # 32ビットから16ビットに変換11 image_16bit = cv2.normalize(image_32bit, None, 0, 255, cv2.NORM_MINMAX, dtype=cv2.CV_16U)12 13 # 変換された画像を保存14 cv2.imwrite(output_path, image_16bit)15 print(f"{output_path} への変換が完了しました。")16 else:17 print(f"{input_path} の画像の読み込みに失敗しました。")18 19# 2つの入力画像ファイルのパスを指定20image1_path = r"C:\Users\....tif"21image2_path = r"C:\Users\....tif"22 23# 2つの出力画像ファイルのパスを指定24output_image1_path =r"C:\Users\..."25output_image2_path = r"C:\Users\..."26 27# 関数の呼び出し28convert_32bit_to_16bit(image1_path, output_image1_path)29convert_32bit_to_16bit(image2_path, output_image2_path)30 31def reconstruct_color_image(image1_path, image2_path, output_path):32 # 2枚の画像を読み込む33 image1 = cv2.imread(image1_path, cv2.IMREAD_GRAYSCALE)34 image2 = cv2.imread(image2_path, cv2.IMREAD_GRAYSCALE)35 36 # 画像が正しく読み込まれたか確認37 if image1 is None or image2 is None:38 print(f"Error: Unable to read the images. Check the file paths.")39 return40 41 # 画像のサイズを取得42 height, width = image1.shape 43 44 # 2枚の画像の各ピクセルの差を計算し、2で割る45 diff_image = (image1.astype(np.float32) - image2.astype(np.float32)) / 2.046 47 # 差の絶対値を取る(負の値を避けるため)48 diff_image = np.abs(diff_image)49 50 # 2つの画像をBGRに変換51 image1_color = cv2.cvtColor(image1, cv2.COLOR_GRAY2BGR)52 image2_color = cv2.cvtColor(image2, cv2.COLOR_GRAY2BGR)53 54 # 画像の差分を新しい画像に設定55 reconstructed_image = image1_color + diff_image[:, :, np.newaxis]56 57 # 画像を保存58 cv2.imwrite(output_path, reconstructed_image)59 60if __name__ == "__main__":61 # 2枚の入力画像ファイルのパスを指定62 image1_path =r"C:\Users\....tif"63 image2_path = r"C:\Users\....tif"64 65 # 出力画像ファイルのパスを指定66 output_image_path = r"C:\Users\....tif"67 68 # 画像の差分を計算し、新しい画像を再構築して保存69 reconstruct_color_image(image1_path, image2_path, output_image_path)70 71

試したこと

16ビット、8ビットに変換しましたがうまくいきませんでした。

補足情報(FW/ツールのバージョンなど)

コメントを投稿

0 コメント