CaptchaでのPython画像処理ノイズの除去方法


8

私は画像処理に非常に慣れていないので、キャプチャしようとしていることはキャプチャからノイズを取り除くことです。

キャプチャについては、さまざまなタイプがあります。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

最初のものは私がやったことです:

最初の一歩

ここに画像の説明を入力してください

まず、黒でないピクセルをすべて黒に変換しました。次に、画像からノイズのパターンを見つけて削除しました。最初のキャプチャについては、それをクリアするのは簡単で、テキストをテッセラクトで見つけました。

しかし、私は2番目と3番目の解決策を探しています。

これはどのようにする必要がありますか?それをクリアするための可能な方法は何ですか?

これは私がパターンを削除する方法です:

def delete(searcher,h2,w2):
    h = h2
    w = w2
    search = searcher
    search = search.convert("RGBA")
    herear = np.asarray(search)
    bigar  = np.asarray(imgCropped)

    hereary, herearx = herear.shape[:2]
    bigary,  bigarx  = bigar.shape[:2]

    stopx = bigarx - herearx + 1
    stopy = bigary - hereary + 1

    pix = imgCropped.load()

    for x in range(0, stopx):
        for y in range(0, stopy):
            x2 = x + herearx
            y2 = y + hereary
            pic = bigar[y:y2, x:x2]
            test = (pic == herear)
            if test.all():
                for q in range(h):
                    for k in range(w):
                        pix[x+k,y+q] = (255,255,255,255) 

変数名をごめんなさい、私は関数をテストしていました。

ありがとう。


2
これらは単一の基本的な画像処理方法ではかなり重いタスクですが、「モアレパターン」とそれらを削除する方法を調べることができます。さらに、テキストのセグメンテーションなどのディープラーニング手法を使用したり、画像からクリーンなテンプレートを取得したり、関連付けて画像内の一致を削除したりできます。
SajanGohil

@SajanGohilええ、パターンメソッドを通して、私はちょっと何かをしました。ありがとう
Ahmet AzizBeşli

回答:


5

これは私が得ることができる限りです:

あなたはおそらくmedianBlur、すべてのカーネルの中央値を見つけ、その値をカーネルの中心に置き換える関数について知っています。これと同じようなことができますが、中央値の代わりに、最大値、最小値の順に使用します。中央値のぼかしでも、いくつかの結果が得られました。私はそれらが完全ではないことを知っていますが、それがあなたにいくつかのアイデアを与えることを願っています(入力画像とカーネルのサイズで遊ぶことができます、それは結果を少し良くするかもしれません)。

ここに画像の説明を入力してください

ここに画像の説明を入力してください

現在pythonをインストールしていないので、使用した正確なC ++コードを共有します。

Mat im1 = imread("E:/1/3.jpg", 0);
Mat im2, im3;

im2 = Mat::zeros(im1.size(), CV_8U);
for (size_t i = 1; i < im1.rows-1; i++)
{
    for (size_t j = 1; j < im1.cols-1; j++)
    {
        double minVal, maxVal = 0;
        minMaxIdx(im1(Rect(j - 1, i - 1, 3, 3)), &minVal, &maxVal);
        im2.at<uchar>(i, j) = maxVal;
    }
}

imshow("(1) max bluring", im2);

medianBlur(im2, im2, 3);

imshow("(2) median bluring", im2);

im2.copyTo(im1);

im2 = Mat::zeros(im1.size(), CV_8U);
for (size_t i = 1; i < im1.rows - 1; i++)
{
    for (size_t j = 1; j < im1.cols - 1; j++)
    {
        double minVal, maxVal = 0;
        minMaxIdx(im1(Rect(j - 1, i - 1, 3, 3)), &minVal, &maxVal);
        im2.at<uchar>(i, j) = minVal;
    }
}

imshow("(3) min bluring", im2);

Mat tmp;
double st = threshold(im2, tmp, 10, 255, THRESH_OTSU);
threshold(im2, im2, st + 14, 255, THRESH_BINARY_INV);
//dilate(im2, im2, Mat::ones(3, 3, CV_8U));

imshow("(4) final", im2);

waitKey(0);

ちなみに、このような場合は、YOLOやRCNNなどのディープラーニング手法が最適です。それらも試してください。


あなたのアプローチは少し良いですが、行き詰まりが私の問題に十分ではない場合、私はあなたと私の解決策を混合し、より明確なものを取得しようとしましたが、
うまくいきませんでした

2

これが私の解決策です、

ここに画像の説明を入力してください

最初に私は背景パターンを手に入れました(手でペイントで編集されました)。から:

ここに画像の説明を入力してください

その後、空の画像を作成して、パターンと画像の違いを埋めました。

img = Image.open("x.png").convert("RGBA")
pattern = Image.open("y.png").convert("RGBA")

pixels = img.load()
pixelsPattern = pattern.load()

new = Image.new("RGBA", (150, 50))
pixelNew = new.load()

for i in range(img.size[0]):
    for j in range(img.size[1]):
         if(pixels[i,j] != pixelsPattern[i,j]):
             pixelNew[i,j] = pixels[i,j]

new.save("differences.png")

ここに違いがあります。

ここに画像の説明を入力してください
最後に、ぼかしを追加し、黒ではないビットをクリアしました。

結果:

ここに画像の説明を入力してください

pytesseractの結果は2041ですが、この画像では誤りですが、一般的な比率は約%60です。


1

opencvライブラリを画像処理に使用できます。このopencvドキュメントページは非常に便利です。次に、findCountourメソッドを使用して番号を抽出してみます。

import cv2 
import numpy as np 

image = cv2.imread('C:\\E0snN.png')
cv2.waitKey(0) 

# Grayscale 
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 
gray = cv2.bitwise_not(gray)

# Threshold
ret,thresh = cv2.threshold(gray,150,255,1)
# Get countours
contours,h = cv2.findContours(thresh,1,2)
# Draw
cv2.drawContours(image, contours, -1, (0, 255, 0), 3) 
cv2.imshow('Contours', image) 
cv2.waitKey(0)

cv2.destroyAllWindows() 

その後、次の結果があります:

最初の画像一致 ここに画像の説明を入力してください

それは完璧とは程遠いですが、異なるしきい値で試してみると:

ret,thresh = cv2.threshold(gray,127,255,1)

より良い結果を得ることができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.