OpenCVとPytesSeractを使用して簡単なCAPTCHAを解決しようとしています。 CAPTCHAサンプルのいくつかは次のとおりです。
私はいくつかのフィルタを使って騒々しい点を削除しようとしました:
import cv2
import numpy as np
import pytesseract
img = cv2.imread(image_path)
_, img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
img = cv2.morphologyEx(img, cv2.MORPH_OPEN, np.ones((4, 4), np.uint8), iterations=1)
img = cv2.medianBlur(img, 3)
img = cv2.medianBlur(img, 3)
img = cv2.medianBlur(img, 3)
img = cv2.medianBlur(img, 3)
img = cv2.GaussianBlur(img, (5, 5), 0)
cv2.imwrite('res.png', img)
print(pytesseract.image_to_string('res.png'))
_
結果として得られたトランス画像は次のとおりです。
残念ながらPytesseractは最初のCAPTCHAを正しく認識しています。他のより良い変換?
最終更新:
@Neilが提案したように、私は接続されたピクセルを検出することによってノイズを除去しようとしました。接続されたピクセルを見つけるために、connectedComponentsWithStats
という名前の関数を見つけ、それは接続されたピクセルを検出し、グループ(コンポーネント)ラベルを割り当てます。接続されたコンポーネントを見つけて少数のピクセルを持つものを削除することで、PytesSeractで全体的な検出精度を良くすることができました。
そしてここで新しい画像が得られる
最終的な出力画像がぼやけています。 PytesSeractのパフォーマンスを向上させるには、削る必要があります。
シャープニングはぼやけと同じくらい簡単ではありませんが、いくつかのコードスニペット/チュートリアルがあります(例: http://datahacker.rs/004-how-to-smoth-and-sharpen-an-image-in-opencv) / )。
ぼかしを連鎖するのではなく、Gaussianまたは中央値を使用してぼかし、必要なぼかしの量を取得するためにパラメータを実験すると、おそらく他の方法で1つの方法を試してくださいが、同じ方法の倒錯する理由はありません。