[OpenCV+OCR] コンピュータービジョン: 画像検証コード内の指定された色のテキストを認識します

[著者ホームページ]:Wu Qiulin
[著者紹介]: Python 分野の質の高いクリエイター、Alibaba Cloud の専門家ブログ、Huawei Cloud Sharing の専門家。 Python とクローラーの分野での研究開発に長期的に取り組んでいます。
[著者のおすすめ]: JS 逆変換に興味のある友人は、 「爬虫類 JS 逆変換の実践」 、配布用 新しいクローラ プラットフォームに興味のある友人は、 「分散クローラ プラットフォームの実践的な構築と開発」
をフォローしてください。検証コードの侵入もありますリバースエンジニアリングとPython 分野の連載記事です。

1. 前に書く

  今日は、クローラー フィールドで派手な確認コードを使用するためのトリックを紹介します。これは最近専門家によって共有されました。確認コードは次のとおりです ( はい特定の色の文字を入力するなど、特定の条件が適用されます):

ここに画像の説明を挿入します
ここに画像の説明を挿入します

その前に、いくつかの成熟したソリューションを見つけるためにオープン ソース コミュニティに行きました。確かに多くの派手な処理ソリューションがあります。自分でサンプルを収集して認識モデルをトレーニングするのと比較して、データ サンプルのアノテーションには時間がかかります。高い精度を維持したい場合、更新によってもたらされる対立にモデルを適応できるようにする必要があるため、これは継続的な作業です。または、コーディング プラットフォームの非効率性が原因である可能性があります。今回の共有方法はより実用的です。

ここに画像の説明を挿入します

言うまでもなく、コア コードは実際にはわずか数十行であり、上記のタイプの検証コードを簡単に識別できます。コードの中心的な考え方は次の 4 つのステップです。

1. 色空間変換
2. HSV カラーしきい値に従ってマスクを生成します
3. 白黒の結果イメージを生成します< a i= 3> 4. OCR テキスト コンテンツ認識

平たく言えば、抽出する色に関係のない内容を排除し、最終的に色を特定することです。

HSV カラーしきい値のリファレンスは次のとおりです (自分で調整できます)。

ここに画像の説明を挿入します

2. 認証コードの画像を読み取る

  まず、あらかじめ用意された認証コードの画像を使用し、その画像をプログラムで読み込むと、コードは次のようになります。

def read_image(image_path):
    img = cv2.imread(image_path)
    if img is None:
        raise ValueError(f"读取图片失败: {
      
      image_path}")
    return img

3. カラーマスクの生成

  HSV (色相、彩度、明度) 色空間は、RGB カラー モデルと同様に、色空間を表現するためのモデルです。

cv2.inRange 関数を使用して、上記の HSV 範囲のしきい値範囲に基づいてバイナリ マスクを生成できます。マスク内のターゲット色に対応する領域は白 (255) に設定され、その他の色に対応する領域は黒 (0) に設定されます

def apply_color_mask(hsv, lower, upper):
    return cv2.inRange(hsv, np.array(lower), np.array(upper))

4. 白黒の結果グラフを生成する

  白黒の結果画像を生成する目的は、その後の OCR テキスト認識のために、元の画像から指定された色のコンテンツを抽出することです。検証コードの適用シナリオでは、検証コードに複数の色が含まれている可能性がありますが、そのうちの 1 つだけに関心があります。白黒の結果マップを生成すると、目的の色を保持し、他の色を白に設定して、識別する必要があるコンテンツを強調表示できます。コードは次のとおりです。

def generate_result_image(img, mask, result_path):
    result = np.zeros_like(img)
    result[mask == 255] = [0, 0, 0]
    result[mask != 255] = [255, 255, 255]
    cv2.imwrite(result_path, result)

これは、検証コード画像が白黒画像に処理された結果です。

ここに画像の説明を挿入します

5. OCRテキスト認識

  最後に、OCR を使用して白黒の結果画像を識別します。基本的に成功率は 90% 以上で、基本的には十分です。識別コードは次のとおりです。

def ocr_classification(image_path):
    try:
        with open(image_path, 'rb') as f:
            img_bytes = f.read()
        ocr = ddddocr.DdddOcr(show_ad=False)
        return ocr.classification(img_bytes)
    except Exception as e:
        raise ValueError(f"OCR识别出错: {
      
      e}")

def verification_ocr(image_path, tips):
    """验证码识别主函数

    Args:
      image_path: 图像文件路径
      tips: 识别提示, 包括"红色"、"黄色"、"蓝色"、"全部"

    Returns:
      result: OCR识别结果
    """
    result_path = "1.png"
    img = read_image(image_path)
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

    color_ranges = {
    
    
        "红色": ([0, 50, 50], [10, 255, 255], [170, 50, 50], [180, 255, 255]),
        "黄色": ([17, 45, 50], [34, 255, 255]),
        "蓝色": ([100, 50, 50], [130, 255, 255]),
    }

    if tips in color_ranges:
        ranges = color_ranges[tips]
        mask = apply_color_mask(hsv, *ranges[:3])
        if tips == "红色":
            mask2 = apply_color_mask(hsv, *ranges[2:])
            mask = cv2.bitwise_or(mask, mask2)
        generate_result_image(img, mask, result_path)

    with open(result_path, 'rb') as f:
        img_bytes = f.read()
    ocr = ddddocr.DdddOcr(show_ad=False)
    res = ocr.classification(img_bytes)
    #输出识别内容
    print(res)

ヒントパラメータは渡された色を表し、しきい値は色に基づいて選択されます

cv2.cvtColor(img, cv2.COLOR_BGR2HSV)画像を BGR カラー スペースから HSV カラー スペースに変換します。 HSV (色相、彩度、明度) は、一般的にカラーベースの画像処理に適しています

ddddocr言うまでもなく、このライブラリは非常に便利です。オープンソースの力で、さまざまなシーンでの使用ニーズに対応できます。

6. 試験結果

ここに画像の説明を挿入します

この種の検証コード認識のみを解決したい場合は、このソリューションで完全に十分です。最後に、実際に自分のサンプルをトレーニングして高品質のモデルを作成するプロセスを体験することをお勧めします。

  さて、また皆さんとお別れの時間です。作成は簡単ではありません。親指を立てて去ってください。皆様のご支援が創作の原動力となっており、より質の高い記事をお届けできればと思っております。

おすすめ

転載: blog.csdn.net/qiulin_wu/article/details/134538042