質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1398閲覧

Pythonのライブラリに処理を追加したい

barobaro

総合スコア1286

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

0クリップ

投稿2020/11/02 04:28

編集2020/11/02 12:08

前提・実現したいこと

camelotのimage_processing.pyのadaptive_thresholdを変更して自作の処理を追加したいのですが

ライブラリの処理を変更したい場合はどのようにすればよろしいのでしょうか教えてください

よろしくお願いいたします。

image_processing.pyのadaptive_thresholdを書き換え下記のソースコードの処理に変更したい
https://github.com/camelot-dev/camelot/blob/420d5aa6242fc19100f285de5a1d4781d1cd6254/camelot/image_processing.py#L7

adaptive_thresholdの呼び出し側
https://github.com/camelot-dev/camelot/blob/420d5aa6242fc19100f285de5a1d4781d1cd6254/camelot/parsers/lattice.py#L27

発生している問題・エラーメッセージ

該当のソースコード

python

1import camelot 2 3# パッチ 4 5def my_method(imagename, process_background=False, blocksize=15, c=-2): 6 7 print("処理") 8 9 img = cv2.imread(imagename) 10 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 11 12 if process_background: 13 threshold = cv2.adaptiveThreshold( 14 gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, blocksize, c 15 ) 16 else: 17 threshold = cv2.adaptiveThreshold( 18 np.invert(gray), 19 255, 20 cv2.ADAPTIVE_THRESH_GAUSSIAN_C, 21 cv2.THRESH_BINARY, 22 blocksize, 23 c, 24 ) 25 return img, threshold 26 27# ライブラリを直接変更せずにパッチ摘要できる方法があれば 28 29tables = camelot.read_pdf("data.pdf", pages="all", split_text=True)

試したこと

Pythonでライブラリの処理を上書きする
https://qiita.com/Asayu123/items/8d8da9911dd0c3296a81

python

1# パターン1 2camelot.image_processing.adaptive_threshold = my_method 3camelot.image_processing.adaptive_threshold("data.png") 4 5# パターン2 6camelot.adaptive_threshold = my_method 7camelot.adaptive_threshold("data.png")

両方を試してみましたが直接呼び出す場合は変更されているのですが

python

1tables = camelot.read_pdf("data.pdf", pages="all", split_text=True)

のように内部で呼び出される場合は変更されていません

追記

  • image_processing.pyを書き換え

https://github.com/camelot-dev/camelot/blob/420d5aa6242fc19100f285de5a1d4781d1cd6254/camelot/image_processing.py#L7

を直接変更後に「import camelot」は成功

  • lattice.pyを書き換え

https://github.com/camelot-dev/camelot/blob/420d5aa6242fc19100f285de5a1d4781d1cd6254/camelot/parsers/lattice.py#L36

パッチを追加後

「adaptive_threshold = my_threshold」

で「import camelot」は成功しました

ライブラリを直接変更せずにパッチを適用することはできないのでしょうか?

補足情報(FW/ツールのバージョンなど)

Python 3.8.6
Google Colaboratry

teamikl👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

read_pdf を呼び出した時に、
何処で adaptive_threshold が呼ばれているのかを探しましょう。

  • 原因: Lattice (camelot/parsers/lattice.py) の import 時

 image_processingの adaptive_threshold を import し参照してます。
後からimage_processingの adaptive_threshold を変更しても、
lattice.py 内で参照してる adaptive_threshold は変わりません。

  • 解決策: adaptive_threshold が呼ばれるのは、Lattice インスタンス生成時なので、

 それ迄に camelot.parsers.lattice.adaptive_threshold を変更。

python

1import camelot.parsers.lattice 2camelot.parsers.lattice.adaptive_threshold = my_method

変更したのは、「image_processing.pyのadaptive_threshold」ですが、
read_pdf 内部で使われてるのは、それ迄に import した元の関数。
変更した関数は、「変更後のimport」にのみ適応されます。

他には、import 順序を工夫する事でも解決可能かもしれません(未検証)

投稿2020/11/02 06:02

teamikl

総合スコア8760

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

barobaro

2020/11/02 12:12

ありがとうございます lattice.pyを変更してパッチを適用することはできました camelotを呼び出し側で書き換えできるといいのですが もしご存じできたらよろしくお願いします
barobaro

2020/11/02 12:45

無事作成することができました ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問