2023年11月5日日曜日

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
  1. import cv2
  2. from pdf2image import convert_from_path
  3.  
  4. import numpy as np
  5. #import sys
  6.  
  7. ref_imgs_in=convert_from_path('Sunday Engineer_1_ref.pdf')
  8. ref_cv_img=np.asarray(ref_imgs_in[0])#1ページ目
  9. ref_cv_img=cv2.cvtColor(ref_cv_img,cv2.COLOR_RGB2BGR)
  10.  
  11. cmp_imgs_in=convert_from_path('Sunday Engineer_1_cmp.pdf')
  12. cmp_cv_img=np.asarray(cmp_imgs_in[0])#1ページ目
  13. cmp_cv_img=cv2.cvtColor(cmp_cv_img,cv2.COLOR_RGB2BGR)
  14.  
  15. tmp_cv_img=np.full(ref_cv_img.shape,0,dtype=np.uint8)
  16.  
  17. #pos_diff=np.where(ref_cv_img!=cmp_cv_img)
  18. tmp_cv_img=np.where((ref_cv_img!=cmp_cv_img),(255,255,255),tmp_cv_img)
  19.  
  20. cv2.imwrite('diff.png',tmp_cv_img)

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

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

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

0 件のコメント:

コメントを投稿