この記事では以下の画像のように、2枚の画像の輝度を差し引きした画像を作成する方法をご紹介していきます。
実際の画像を使って実演していきますので、ぜひあなたも何かの画像を使って一緒にやってみましょう。
それでは早速やっていきます!
※pythonというプログラミング言語を用いて実行していきます。
インストールしていない方はまずは以下からご覧ください。
必要なライブラリ
◆openCV:Ver.4.5.1.48
◆numpy:Ver.1.19.5
バージョンは参考情報です。
おそらくバージョンが違っても動作するはずです。
numpy はAnacondaを使用すればあらかじめインストールされていますが、openCVは自分で追加インストールが必要です。
openCVのインストール方法については以下で解説しています。
画像の輝度を差し引きするサンプルコード
下準備が整ったところで、早速コードを記述していきましょう。
以下が2枚の画像の輝度の差分画像を作成するサンプルコードです。
※今回は差し引きされる画像の名前をpic1.jpg、差し引きする画像の名前をpic2.jpgという名前で保存されている状態を想定しています。
また、読み込む画像は白黒画像で実行していきます。
#ライブラリインポート
import cv2
import numpy as np
#画像の読み込み
pic1=cv2.imread('pic1.jpg',cv2.IMREAD_GRAYSCALE)
pic1=pic1.astype(np.float32)
pic2=cv2.imread('pic2.jpg',cv2.IMREAD_GRAYSCALE)
pic2=pic2.astype(np.float32)
#輝度差し引き
pic3=pic1-pic2
pic3=np.where(pic3<0,0,pic3)
pic3=pic3.astype(np.uint8)
#画像出力
cv2.imwrite('pic3.jpg', pic3)
画像の差し引きを行うにあたって、重要な項目が2つありますので、それらを詳細解説しておこうと思います。
◆コードのポイント解説①データ型の変換
openCVで読み込んだ輝度配列は、uintと呼ばれるデータ型で読み込まれます。
このuint型はマイナスの数値をとることができません。
そのため、2枚の画像を差し引きした結果、マイナスの数値が算出されてしまった場合、256とそのマイナス数値を足し合わせた数値に勝手に変換されてしまいます。
例えば、差し引きした数値が-26だった場合、230に変換されます。
その結果、暗くなるはずの場所がめちゃくちゃ明るくなったりしてしまいます。
この現象を避けるために、読み込んだ直後に以下のコードでデータ型を変更しています。
pic1=pic1.astype(np.float32)
pic2=pic2.astype(np.float32)
この処理を実行することで、差し引き後でもマイナスの数値を保持することが可能になります。
要は、マイナス数値を持てるfloat型に変換しているというわけです。
※ここはfloat32でなくてもint16とかでも対応できるはずです。
◆コードのポイント解説②マイナス数値をゼロに変換
先ほどの処理を行った結果、マイナスの数値を持つことはできるようになりましたが、マイナス数値を持った配列を再びuint8型に変換すると、さきほど紹介したように勝手に数値を変換されてしまいます。
それを避けるために以下のコードで、マイナス数値をゼロに変換しています。
pic3=np.where(pic3<0,0,pic3)
このゼロ変換の後、
pic3=pic3.astype(np.uint8)
でuint8に再変換しています。
※この2行のコードは排除したとしても記述した場合と全く同じ処理が実行されます。しかし、数値が勝手に書き換わっている状況であり、自分の知らないところで勝手に数値が書き換わる現象というのは極力さけておいた方が無難ですので、私としては無駄だとしても書いておくことをオススメします。
サンプルコードの実行結果
というわけで最後に先ほど紹介したサンプルコードを実行してみましょう。
※実行前にコードを記述したファイルと同じフォルダに画像が入っていることを確認しておきましょう。
プログラムを実行した結果、以下の画像のようにもとの2枚の画像の差分画像が作成されていることが確認できました。
ただのマウスの写真ですが、いい感じにかっこよくなってますね。
おわりに
というわけで今回はpythonを使って、2枚の画像の差し引き画像を作成する方法をご紹介しました。
光学計測なんかをしていると、このような画像を作成するニーズはあると思いますので、そのような状況に出くわした際はぜひご活用ください。
このように、私のブログでは様々なプログラミングスキルを紹介しています。
今は仕事中で時間がないかもしれませんが、ぜひ通勤時間中などに他の記事も読んでいただけると嬉しいです。
⇒興味をもった方は【ヒガサラ】で検索してみてください。
確実にスキルアップできるはずです。
最後に、この記事が役に立ったという方は、ぜひ応援よろしくお願いします。
↓ 応援ボタン
それではまた!
コメント