· 

PythonからのOpenCVを使ってpdfを比較する(1)

python-opencvを使ってpdfを画像として比較する。

まぁだいたい、ここに書いてあるコードが拡散しているらしい。が、記述が多いので、条件をシンプルにしてコードをシンプルにする。で、ずばり1ページ目しか読み込まない。って大胆にシンプル化。

まずは、比較用の素材を準備。まぁ自分のブログを印刷したものです。
リファレンス : Sunday Engineer_1_ref.pdf
比較対象 : Sunday Engineer_1_cmp.pdf
で、python-opencvのインストールやら設定やらは参考サイトを参照されたい。

TypeError: 'numpy._DTypeMeta' object is not subscriptable
ってエラーが出るときは
sudo apt remove python3-numpy
からの
pip install numpy

では、相変わらずのいきなりな感じで、
pdf_compare.py
import cv2
from pdf2image import convert_from_path

import numpy as np
#import sys

ref_imgs_in=convert_from_path('Sunday Engineer_1_ref.pdf')
ref_cv_img=np.asarray(ref_imgs_in[0])#1ページ目
ref_cv_img=cv2.cvtColor(ref_cv_img,cv2.COLOR_RGB2BGR)

cmp_imgs_in=convert_from_path('Sunday Engineer_1_cmp.pdf')
cmp_cv_img=np.asarray(cmp_imgs_in[0])#1ページ目
cmp_cv_img=cv2.cvtColor(cmp_cv_img,cv2.COLOR_RGB2BGR)

tmp_cv_img=np.full(ref_cv_img.shape,0,dtype=np.uint8)

#pos_diff=np.where(ref_cv_img!=cmp_cv_img)
tmp_cv_img=np.where((ref_cv_img!=cmp_cv_img),(255,255,255),tmp_cv_img)

cv2.imwrite('diff.png',tmp_cv_img)

まじで恐ろしく簡単なコードです。OpenCVが画像をndarrayで持っていることから、np.whereで相違点を抽出できます。

で、結果はこちら。
diff.png
これでもうオンラインでの間違い探しクイズは成立しない^^

さて、今回は同じソースからpdfを作成して微妙に変えた部分を抽出しましたが、pdfにjpeg形式で画像が埋まっているとpdf生成時の設定によっては画像部分に塩粒みたいな相違点が検出されてしまいます。こういうのをノイズとして相違点としないようにするにはどうするか。ってのをやりたい。が、やるかもしれないし、やらないかもしれない。