回答(1件)
PDF類似図面検索 Python実装(要約) PythonでPDF図面の一部(テンプレート)を基に、複数PDFから類似図面を探す方法を説明。 1. システム概要 * 入力: テンプレート画像、検索対象PDFフォルダ * 処理: * 画像抽出: 各PDFページを画像化 * 特徴量抽出: テンプレートと各図面画像から特徴(形状、模様等)を数値化 * 比較/類似度計算: 特徴量を比較し類似度スコアを算出 * ランク付け: スコア順にPDFを並び替え * 出力: 類似PDFリスト(ファイル名、スコア等) 2. 主要Pythonライブラリ * PyMuPDF (fitz): 高速PDF操作。ページを画像データとして抽出 * OpenCV (cv2): 画像認識ライブラリ * 画像処理: 読込、グレースケール化等 * 特徴点検出/記述: 画像から特徴点を数値化(ORB, AKAZE等推奨) * 特徴量マッチング: 2画像の特徴量類似ペア探索 (BFMatcher等) * 幾何学検証: マッチの妥当性確認 (findHomography + RANSAC) * NumPy: 高速数値計算。OpenCVと連携 * os, glob: ファイル/フォルダ操作 3. 実装手順概要 * 環境構築: pip install PyMuPDF opencv-python numpy * テンプレート準備: 基準画像をファイルで用意 * PDF処理ループ: 対象フォルダ内のPDFを順次処理 * 画像抽出: PyMuPDFでPDFページを画像(NumPy配列)に * 特徴量抽出: OpenCVでテンプレートと各ページ画像から特徴点(kp)/記述子(des)を計算 * マッチング/類似度計算: * BFMatcherで特徴量記述子をマッチング * findHomographyで幾何学的整合性を検証、整合の取れたマッチ(インライア)数を基に類似度スコア算出 * PDF内最大スコアをそのPDFの類似度とする * 結果集計/出力: PDF毎のスコアを記録、ソートし表示/保存 4. コード骨子 (ORB + ホモグラフィ例) import cv2, fitz, numpy as np, os, glob # (設定値: TEMPLATE_IMAGE_PATH, PDF_FOLDER_PATH等) template_img = cv2.imread(TEMPLATE_IMAGE_PATH, 0) # 0: グレースケール orb = cv2.ORB_create(nfeatures=2000) kp1, des1 = orb.detectAndCompute(template_img, None) bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) results = [] pdf_files = glob.glob(os.path.join(PDF_FOLDER_PATH, "*.pdf")) for pdf_path in pdf_files: doc = fitz.open(pdf_path) max_sim = 0 for page in doc: pix = page.get_pixmap(dpi=200) # (Pixmap -> OpenCV画像変換) img_bgr = ... # BGR形式に gray_img = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY) kp2, des2 = orb.detectAndCompute(gray_img, None) if des2 is not None and len(des2) > 0: matches = bf.match(des1, des2) if len(matches) > 10: src_pts = np.float32([kp1[m.queryIdx].pt for m in matches]).reshape(-1,1,2) dst_pts = np.float32([kp2[m.trainIdx].pt for m in matches]).reshape(-1,1,2) M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0) if M is not None: score = np.sum(mask) / len(kp1) if len(kp1) > 0 else 0 max_sim = max(max_sim, score) doc.close() if max_sim > 0: results.append({"file": pdf_path, "similarity": max_sim}) results.sort(key=lambda x: x["similarity"], reverse=True) # (結果表示/保存) 5. 重要ポイント/改善ヒント * 類似度定義: 何を類似と見なすか、計算方法の調整が最重要 * 処理速度: PDF数が多い場合、解像度調整、並列処理、高速アルゴリズム検討 * 図面特性: ノイズ除去等の前処理で精度向上も * テンプレート選択: 特徴的な部分を選ぶことが重要
この回答はいかがでしたか? リアクションしてみよう