ホームページ >バックエンド開発 >Python チュートリアル >Python 検証コード認識チュートリアル: グレースケール処理、二値化、ノイズ リダクション、および tesserocr 認識

Python 検証コード認識チュートリアル: グレースケール処理、二値化、ノイズ リダクション、および tesserocr 認識

不言
不言オリジナル
2018-06-04 11:30:016038ブラウズ

この記事では、主に Python 検証コード認識チュートリアルのグレースケール処理、二値化、ノイズ削減、tesserocr 識別について説明します。必要な友達に参考にしてください。

クローラーを書くときに避けられない問題は認証コードです。現在、認証コードのカテゴリーは


画像カテゴリー

  1. クリックカテゴリー

  2. の4種類あります。 type

  3. 今日は画像のタイプを見てみましょう。これらの確認コードのほとんどは数字と文字の組み合わせであり、中国では漢字も使用されています。これをベースに、ノイズ、干渉線、変形、重なり、文字の色の違いなどを加えて認識難易度を高めています。

  4. これに対応して、検証コードの認識は次のステップに大別できます:

グレースケール処理


コントラストを上げる(オプション)

  1. 二値化

  2. ノイズ低減

  3. 傾き補正文字をセグメント化する

  4. トレーニングライブラリを構築する

  5. 認識

  6. 実験的な性質のため、記事で使用されている検証コードはすべて、実際のWebサイト検証コードを一括ダウンロードするのではなく、プログラムで生成されています。利点は、明確な結果を含む多数のデータセットを取得できることです。

  7. 実際の環境でデータを取得する必要がある場合は、さまざまな大規模コード プラットフォームを使用してトレーニング用のデータセットを構築できます。

  8. 検証コードを生成するには、Claptcha (ローカル ダウンロード) ライブラリを使用します。もちろん、Captcha (ローカル ダウンロード) ライブラリも良い選択です。


最も単純な純粋なデジタルの干渉のない検証コードを生成するには、まず、claptcha.py の 285 行目の _drawLine にいくつかの変更を加える必要があります。この関数に直接 None を返させてから、検証コードの生成を開始します。 :


from claptcha import Claptcha

c = Claptcha("8069","/usr/share/fonts/truetype/freefont/FreeMono.ttf")
t,_ = c.write('1.png')


ここではubuntuのフォントパスに注意する必要があります。他のフォントをオンラインでダウンロードして使用することもできます。検証コードは以下のように生成されます。

検証コードが変形していることがわかります。このタイプの最も単純な確認コードの場合は、Google のオープンソース tesserocr を直接使用して識別できます。


最初のインストール:


apt-get install tesseract-ocr libtesseract-dev libleptonica-dev
pip install tesserocr

次に、認識を開始します:

from PIL import Image
import tesserocr

p1 = Image.open('1.png')
tesserocr.image_to_text(p1)

'8069\n\n'

この単純な検証コードでは、基本的に何も行われないことがわかります。認識されました。率はすでに非常に高いです。興味のある友人は、より多くのデータを使用してテストできますが、ここでは詳しく説明しません。

次に、検証コードの背景にノイズを追加して確認します:

c = Claptcha("8069","/usr/share/fonts/truetype/freefont/FreeMono.ttf",noise=0.4)
t,_ = c.write('2.png')


検証コードは次のように生成されます:

認識:


p2 = Image.open('2.png')
tesserocr.image_to_text(p2)
'8069\n\n'


効果大丈夫。次に、英数字の組み合わせが生成されます:

c2 = Claptcha("A4oO0zZ2","/usr/share/fonts/truetype/freefont/FreeMono.ttf")
t,_ = c2.write('3.png')

検証コードは次のように生成されます:

3 番目は小文字の o、4 番目は大文字の O、5 番目は大文字です。 1 つは数字の 0 です。6 番目は小文字の z、7 番目は大文字の Z、そして最後の 1 つは数字の 2 です。人間の目はもう跪いているって本当ですか!しかし、現在、一般的な検証コードは大文字と小文字を厳密に区別していません。自動認識がどのようなものかを見てみましょう:


p3 = Image.open('3.png')
tesserocr.image_to_text(p3)
'AMOOZW\n\n'

もちろん、人々をひざまずかせるようなコンピューターは役に立ちません。ただし、干渉が小さく、変形がそれほど大きくない場合には、tesserocr を使用するのが非常に簡単で便利です。次に、変更した clptcha.py _drawLine の 285 行目を復元して、干渉ラインが追加されているかどうかを確認します。

p4 = Image.open('4.png')
tesserocr.image_to_text(p4)
''

干渉線を入れたら全く認識されなくなりました そこで、干渉線を除去する方法はありますか?

画像は白黒のように見えますが、グレースケールで処理する必要があります。それ以外の場合は、load() 関数を使用して、単一の値ではなく特定のピクセルの RGB タプルを取得します。処理内容は以下の通りです:

def binarizing(img,threshold):
 """传入image对象进行灰度、二值处理"""
 img = img.convert("L") # 转灰度
 pixdata = img.load()
 w, h = img.size
 # 遍历所有像素,大于阈值的为黑色
 for y in range(h):
  for x in range(w):
   if pixdata[x, y] < threshold:
    pixdata[x, y] = 0
   else:
    pixdata[x, y] = 255
 return img


処理後の画像は以下の通りです:

次に、共通4の干渉線を除去してみます。 -近傍アルゴリズムおよび8近傍アルゴリズム。いわゆる X 近傍アルゴリズムは、携帯電話の 9 マスのグリッド入力方法を参照できます。ボタン 5 は上下左右を判定するピクセルであり、近傍 8 は判定します。周囲の8ピクセル。この 4 点または 8 点のうち 255 点の数が一定のしきい値より大きい場合、その点はノイズであると判断されます。しきい値は実際の状況に応じて変更できます。


def depoint(img):
 """传入二值化后的图片进行降噪"""
 pixdata = img.load()
 w,h = img.size
 for y in range(1,h-1):
  for x in range(1,w-1):
   count = 0
   if pixdata[x,y-1] > 245:#上
    count = count + 1
   if pixdata[x,y+1] > 245:#下
    count = count + 1
   if pixdata[x-1,y] > 245:#左
    count = count + 1
   if pixdata[x+1,y] > 245:#右
    count = count + 1
   if pixdata[x-1,y-1] > 245:#左上
    count = count + 1
   if pixdata[x-1,y+1] > 245:#左下
    count = count + 1
   if pixdata[x+1,y-1] > 245:#右上
    count = count + 1
   if pixdata[x+1,y+1] > 245:#右下
    count = count + 1
   if count > 4:
    pixdata[x,y] = 255
 return img

加工した写真は以下の通りです


好像……根本没卵用啊?!确实是这样的,因为示例中的图片干扰线的宽度和数字是一样的。对于干扰线和数据像素不同的,比如Captcha生成的验证码:

从左到右依次是原图、二值化、去除干扰线的情况,总体降噪的效果还是比较明显的。另外降噪可以多次执行,比如我对上面的降噪后结果再进行依次降噪,可以得到下面的效果:


再进行识别得到了结果:

p7 = Image.open(&#39;7.png&#39;)
tesserocr.image_to_text(p7)
&#39;8069 ,,\n\n&#39;

另外,从图片来看,实际数据颜色明显和噪点干扰线不同,根据这一点可以直接把噪点全部去除,这里就不展开说了。
第一篇文章,先记录如何将图片进行灰度处理、二值化、降噪,并结合tesserocr来识别简单的验证码,剩下的部分在下一篇文章中和大家一起分享。

相关推荐:

Python验证码识别处理实例

以上がPython 検証コード認識チュートリアル: グレースケール処理、二値化、ノイズ リダクション、および tesserocr 認識の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。