知り合いが画像の差分を見比べるプログラムが必要だといっていたのでPythonとOpenCVで組んでみた。要はOpenCVを用いた間違い探しだが、画像同士でいっさいのズレがないことが条件となるので、実務的なアレには向かないかもしれない。よりロバストな間違い探しが必要な方はこの記事などを参考にした方がいいかも。実装はこの記事の方法のが10倍ぐらい軽いと思うけど……。
結果
以下のような画像が出力される。
(画像はWikipediaより引用)
ソースコード
import cv2
import matplotlib.pyplot as plt
img1 = cv2.imread('img1.png')
img1 = cv2.cvtColor(img1,cv2.COLOR_BGR2RGB)
img1 = img1/255
img2 = cv2.imread('img2.png')
img2 = cv2.cvtColor(img2,cv2.COLOR_BGR2RGB)
img2 = img2/255
dif = cv2.absdiff(img1,img2)
dif[dif>0] = 1
fig,axs = plt.subplots(2,2)
ar = axs.ravel()
ar[0].imshow(img1)
ar[1].imshow(img2)
ar[2].imshow(img1*dif*0.8 + img1*0.2)
ar[3].imshow(img2*dif*0.8 + img2*0.2)
plt.show()
本質的な処理はOpenCVによる数行で済むが、matplotlibで表示するための下処理でけっこう行数がかかっている。要はcv2.absdiff
で差分画像がとれるので、それをマスクとして利用している。diffそのままだとRGBチャンネルそれぞれに対して差分を取っているので、dif[dif>0] = 1
という操作によりマスクにする。
思ったよりも手間取った点としては、OpenCVの画像データはint
型とfloat
型の両方とも取れるようになっており、普段は便利なのだが今回はそのせいでマスクが上手くいかなかった。結果、画像を読み込んだ時点で/255
して強制的にfloat
にキャストしている。