web-dev-qa-db-ja.com

OpenCVでの画像処理を使用して、画像から背景のテキストとノイズを削除する

これらの画像があります

enter image description here

enter image description here

背景のテキストを削除したい。のみ captcha charactersを残す必要があります(K6PwKA、YabVzuなど)。タスクは、後でtesseractを使用してこれらの文字を識別することです。

これは私が試したものですが、それほど正確ではありません。

import cv2
import pytesseract

pytesseract.pytesseract.tesseract_cmd = r"C:\Users\HPO2KOR\AppData\Local\Tesseract-OCR\tesseract.exe"
img = cv2.imread("untitled.png")
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray_filtered = cv2.inRange(gray_image, 0, 75)
cv2.imwrite("cleaned.png", gray_filtered)

どうすれば同じように改善できますか?

注:私はこの質問に対して得ている提案をすべて試しましたが、どれも私のために機能しませんでした。

EDIT:エリアスによれば、フォトショップを使用してキャプチャテキストの色をグレースケールに変換して、その中間にある色を見つけようとしました[100 、105]。次に、この範囲に基づいて画像にしきい値を設定します。しかし、私が得た結果は、tesseractから満足のいく結果を与えませんでした。

gray_filtered = cv2.inRange(gray_image, 100, 105)
cv2.imwrite("cleaned.png", gray_filtered)
gray_inv = ~gray_filtered
cv2.imwrite("cleaned.png", gray_inv)
data = pytesseract.image_to_string(gray_inv, lang='eng')

出力:

'KEP wKA'

結果:

enter image description here

EDIT 2:

def get_text(img_name):
    lower = (100, 100, 100)
    upper = (104, 104, 104) 
    img = cv2.imread(img_name)
    img_rgb_inrange = cv2.inRange(img, lower, upper)
    neg_rgb_image = ~img_rgb_inrange
    cv2.imwrite('neg_img_rgb_inrange.png', neg_rgb_image)
    data = pytesseract.image_to_string(neg_rgb_image, lang='eng')
    return data

与える:

enter image description here

そしてテキストとして

GXuMuUZ

少し柔らかくする方法はありますか

4
Himanshu Poddar

試しませんでしたが、これでうまくいくかもしれません。ステップ1:psを使用して、キャプチャ文字の色を確認します。たとえば、「YabVzu」は(128,128,128)、

ステップ2:pillowのメソッドgetdata()/ getcolor()を使用すると、すべてのピクセルの色を含むシーケンスが返されます。

次に、シーケンス内のすべてのアイテムを元のキャプチャ画像に投影します。

したがって、画像内のすべてのピクセルの位置がわかります。

手順3:色が(128,128,128)に最も近い値を持つすべてのピクセルを見つけます。しきい値を設定して精度を制御できます。このステップは別のシーケンスを返します。 Seq aとして注釈を付けましょう

手順4:高さと幅が元の画像とまったく同じ画像を生成します。 [Seq a]のすべてのピクセルを画像の非常にexcatの位置にプロットします。ここでは、クリーンなトレーニングアイテムを取得します

ステップ5:Keras project を使用してコードを中断します。また、精度は72%を超える必要があります。

1
Elias