LoginSignup
2
5

More than 3 years have passed since last update.

OpenCVによるごく単純な間違い探し

Last updated at Posted at 2020-09-24

 知り合いが画像の差分を見比べるプログラムが必要だといっていたのでPythonとOpenCVで組んでみた。要はOpenCVを用いた間違い探しだが、画像同士でいっさいのズレがないことが条件となるので、実務的なアレには向かないかもしれない。よりロバストな間違い探しが必要な方はこの記事などを参考にした方がいいかも。実装はこの記事の方法のが10倍ぐらい軽いと思うけど……。

結果

 以下のような画像が出力される。

image.png
(画像は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にキャストしている。

2
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5