Engineerの研鑽

メインはプログラミング系ブログ(本の要約とかもします)

質問はCONTACTやコメントでお願い致します。

【コピペでできるpython】openCVを使って画像の一致比較をしてみよう

f:id:yukiyukiponsu:20200404213954j:plain

 

こんにちは、ゆきとです。

 

もうすでに会社に入ってから1ヶ月が過ぎようとしています。

 

まだ研修中ですがとてもいい学があります。ただ、やはり早く研修を終えてエンジニアとして働きたいです。

 

さてさて余談はここまでにして今日はopenCVを使って画像の一致比較をしていきます

今回は画像の色味も比較したかったのでヒストグラム比較を行っています。

実装環境

PC : Mac (version 10.15.4)

python 3.7.6

実行結果

比較した画像パターン1(画像1 = img1_1、画像2 = img1_2)

画像の大きさは異なるが、色味はほぼ一致

f:id:yukiyukiponsu:20200429002048p:plainf:id:yukiyukiponsu:20200429002059p:plain

 

f:id:yukiyukiponsu:20200429002256p:plain


無事一致しましたね。ではでは次の画像の比較です。

比較した画像パターン2(画像1 = img2_1、画像2 = img2_2)

画像の大きさは一緒だが色味が少し違う(右の方が少し明るい)

f:id:yukiyukiponsu:20200429002432p:plainf:id:yukiyukiponsu:20200429002442p:plain

f:id:yukiyukiponsu:20200429002618p:plain

流石ヒストグラム比較です。全く同じように見える写真でも少し画像が明るいだけで、一致しないという結果をだしてくれました。ヒストグラムは色の濃さを数値化したものなので当たり前と言えば当たり前ですが(厳密には少し違う)

 

ヒストグラムの詳しい内容はこちらのホームページが説明してくれています。

ヒストグラム その1: 計算して,プロットして,解析する !!! — OpenCV-Python Tutorials 1 documentation

 

 

それではお待ちかねのソースコードです。

ほいな

ソースコード

openCVpythonで使うために必要な操作(コマンドプロンプトで入力)

pip install opencv-python

 

今回のプログラムで使う画像はgithubからダウンロードできるのでgithubからダウンロードしてください(というかgit cloneをしてそのまま実行してくださればプログラムが動かせます)

githubへのリンク

from PIL import Image
import cv2

#pathX_1 = "Img/img1_1"
pathX_1 = "Img/img2_1"
imgX_1 = cv2.imread(pathX_1) #画像の読み込み
print("画像1の大きさ")
print(imgX_1.shape) #画像の大きさの表示

imgX_1_resize = cv2.resize(imgX_1, dsize=(100, 100)) #画像の大きさを100×100にする
print("画像1の大きさを100×100に変更")
print(imgX_1_resize.shape) 

#画像を色相分布行列化する = ヒストグラム化する
#このサイトがわかりやすい(http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_histograms/py_histogram_begins/py_histogram_begins.html)
target_hist = cv2.calcHist([imgX_1_resize], [0], None, [256], [0, 256])

#pathX_2 = "Img/img1_2"
pathX_2 = "Img/img2_2"
imgX_2 = cv2.imread(pathX_2)
print("画像2の大きさ")
print(imgX_2.shape)

imgX_2_resize = cv2.resize(imgX_2, dsize=(100, 100)) #画像の大きさを100×100にする
print("画像2の大きさを100×100に変更")
print(imgX_2_resize.shape) 
compare_hist = cv2.calcHist([imgX_2_resize], [0], None, [256], [0, 256])

#画像の比較結果
#compareHistについて詳しく知りたい方(http://opencv.jp/opencv-2svn/cpp/imgproc_histograms.html)
#imgX_1とimgX_2のヒストグラムを比較
ret = cv2.compareHist(target_hist, compare_hist, 0)
print(ret)

#今回のプログラムでは画像の一致をある程度検出できればいいので、retの値が99%以上の適合率であればよしとしています
if ret > 0.99:
    print("match!!")
else:
    print("not match..")

 

openCVの関数であるcalcHist、compareHistについては以下の画像で説明しています。

参考サイト

ヒストグラム — opencv 2.2 documentation

calcHist

f:id:yukiyukiponsu:20200429003502p:plain

compareHist

f:id:yukiyukiponsu:20200429003514p:plain

 

今日の内容は以上です。

 

今日もブログを読んでくださりありがとうございました!!

 

次は何をしようかなー。やりたいことが多すぎて首が回らない..

 

それではまたいつか!