Python Обработка изображений на капче, как убрать шум - PullRequest
8 голосов
/ 19 февраля 2020

Я новичок в области обработки изображений, и я пытаюсь очистить шум от капч;

Для капч у меня их разные типы:

enter image description here

enter image description here

enter image description here

Для первого я сделал :

First Step

enter image description here

Во-первых, я преобразовал каждый пиксель, не черный в черный , Затем я нашел шаблон, который является шумом изображения, и удалил его. Для первой капчи было легко очистить ее, и я нашел текст с тессерактом.

Но я ищу решение для второй и третьей.

Как это должно go подобно? Я имею в виду, каковы возможные способы его очистки?

Вот как я удаляю шаблоны:

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) 

Извините за имена переменных, я просто тестировал функцию.

Спасибо ..

Ответы [ 3 ]

5 голосов
/ 22 февраля 2020

Это насколько я могу получить:

Вы, вероятно, знаете о функции medianBlur, которая находит медианное значение в каждом ядре и подставляет это значение в центр ядра. Мы можем сделать что-то похожее на это, но вместо медианы используйте значение max, а затем значение min. Со средним пятном я тоже получил некоторые результаты. Я знаю, что они не идеальны, но я надеюсь, что это даст вам некоторые идеи (вы можете поиграть с размерами входного изображения и ядрами, это может немного улучшить результаты).

enter image description here

enter image description here

У меня не установлено 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 голосов
/ 03 марта 2020

Вот мое решение,

enter image description here

Сначала я получил фоновый узор (отредактированный вручную). From:

enter image description here

После этого я создал пустое изображение, чтобы заполнить его различиями между рисунком и изображением.

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")

Вот различия ..

enter image description here
и, наконец, я добавил размытие и очистил биты, которые не являются черными.

Результат:

enter image description here

С результатом Pytesseract 2041, это неправильно для этого изображения, но общий показатель составляет около% 60.

1 голос
/ 28 февраля 2020

Вы можете использовать библиотеку 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() 

После этого получится следующий результат:

First image match enter image description here

Это далеко от совершенства, но если вы попробуете с другими пороговыми значениями, например:

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

, вы можете получить лучшие результаты.

...