Xử lý ảnh Python trên Captcha cách loại bỏ nhiễu


8

Tôi rất mới về Xử lý hình ảnh và những gì tôi đang cố gắng làm là xóa tiếng ồn từ captcha;

Đối với captcha, tôi có nhiều loại khác nhau:

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Đối với người đầu tiên tôi đã làm là:

Bước đầu tiên

nhập mô tả hình ảnh ở đây

Đầu tiên, tôi chuyển đổi mọi pixel không có màu đen sang màu đen. Sau đó, tôi tìm thấy một mẫu nhiễu từ hình ảnh và xóa nó. Đối với hình ảnh xác thực đầu tiên, thật dễ dàng để xóa nó và tôi đã tìm thấy văn bản với tesseract.

Nhưng tôi đang tìm kiếm một giải pháp cho thứ hai và thứ ba.

Làm thế nào điều này phải đi như thế nào? Tôi có nghĩa là các phương pháp có thể để xóa nó là gì?

Đây là cách tôi xóa các mẫu:

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) 

Xin lỗi cho tên biến, tôi chỉ đang thử nghiệm chức năng.

Cảm ơn..


2
Đây là những nhiệm vụ khá nặng đối với một phương thức xử lý ảnh cơ bản duy nhất, nhưng bạn có thể xem xét "các mẫu moire" và các phương thức để loại bỏ chúng. Ngoài ra, bạn có thể sử dụng các phương pháp học sâu như phân đoạn văn bản hoặc lấy mẫu sạch khỏi hình ảnh và xóa bất kỳ kết quả khớp nào trong ảnh bằng cách tương quan với nó.
SajanGohil

@SajanGohil yeah thông qua phương pháp mẫu, tôi đã làm một cái gì đó. Cảm ơn
Ahmet Aziz Beşli

Câu trả lời:


5

Điều này là xa như tôi có thể nhận được:

Bạn có thể biết về medianBlurhàm tìm giá trị trung bình trong mỗi hạt nhân và thay thế giá trị đó vào trung tâm của kernel. Chúng ta có thể làm một cái gì đó tương tự như vậy nhưng thay vì trung vị, sử dụng giá trị tối đa sau đó là giá trị tối thiểu. Với một trung bình bluring quá, tôi đã nhận được một số kết quả. Tôi biết chúng không hoàn hảo nhưng tôi hy vọng nó mang lại cho bạn một số ý tưởng (bạn có thể chơi với kích thước của hình ảnh đầu vào và hạt nhân, nó có thể làm cho kết quả tốt hơn một chút).

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Tôi chưa cài đặt python ngay bây giờ, vì vậy tôi chia sẻ mã C ++ chính xác mà tôi đã sử dụng:

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

Nhân tiện, trong những trường hợp như vậy, các phương pháp Học sâu như YOLO và RCNN là phương pháp tốt nhất. Hãy thử chúng quá.


Cách tiếp cận của bạn khá tốt, nhưng khi ure bị mắc kẹt là không đủ cho vấn đề của tôi, tôi đã trộn lẫn giải pháp của bạn và cố gắng làm cho một cái gì đó rõ ràng hơn nhưng nó đã không hoạt động
Ahmet Aziz Beşli

2

Đây là giải pháp của tôi,

nhập mô tả hình ảnh ở đây

Đầu tiên tôi có mẫu nền (Chỉnh sửa bằng sơn). Từ:

nhập mô tả hình ảnh ở đây

Sau đó, tôi đã tạo một hình ảnh trống để lấp đầy nó với sự khác biệt giữa mẫu và hình ảnh.

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

Dưới đây là sự khác biệt ..

nhập mô tả hình ảnh ở đây
và cuối cùng, tôi đã thêm mờ và xóa các bit không phải là màu đen.

Kết quả :

nhập mô tả hình ảnh ở đây

Với kết quả pytesseract là 2041, điều này là sai đối với hình ảnh này nhưng tỷ lệ chung là khoảng% 60.


1

Bạn có thể sử dụng thư viện opencv để xử lý hình ảnh. Rất hữu ích có thể là trang tài liệu opencv này . Sau đó thử trích xuất số của bạn thông qua phương thức findCountour như:

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

Sau đó có kết quả như sau:

Trận đấu hình ảnh đầu tiên nhập mô tả hình ảnh ở đây

Nó không hoàn hảo nhưng nếu bạn thử với các giá trị ngưỡng khác nhau, ví dụ:

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

bạn có thể nhận được kết quả tốt hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.