Python 图像处理中的验证码去噪技术

8
我很陌生图像处理,我试图做的是清除验证码中的噪点;
对于验证码,我有不同类型的验证码:

enter image description here

enter image description here

enter image description here

对于第一个,我所做的是:

First Step

enter image description here

首先,我将所有非黑色像素转换为黑色。然后,我找到了图像中的一种噪音模式并将其删除。对于第一个验证码,清除很容易,我用tesseract找到了文本。

但我正在寻找第二个和第三个验证码的解决方案。

这应该如何进行?我的意思是有哪些可能的方法可以清除它?

这是我删除模式的方法:

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 Aziz Beşli
@AhmetAzizBeşli 你好,能否在这个函数前添加一些代码呢?我遇到了类似于你的问题,这个函数可能会对我有所帮助。但是仅凭这段代码片段我很难理解这个函数。谢谢! - Daniel Aben-Athar Bemerguy
@AhmetAzizBeşli,你是否在此期间找到了第三个(扭曲的)验证码的解决方案? - simbr
3个回答

5
这是我所能达到的程度:
您可能已经知道medianBlur函数,它在每个内核中找到中位数并用该值替换内核的中心。我们可以做类似的事情,但不是使用中位数,而是使用最大值和最小值。通过中值模糊,我得到了一些结果。我知道它们不完美,但我希望它能给您提供一些想法(您可以尝试调整输入图像和内核的大小,这可能会使结果稍微好一些)。
这是相关图片:

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 这样的深度学习方法是最好的方法。也尝试使用它们。


你的方法有点不错,但是你卡住的地方对我的问题来说不够。我把你的解决方案和我的混合在一起,试图得到更清晰的东西,但是它没有起作用。 - Ahmet Aziz Beşli

2

这是我的解决方案,

enter image description here

首先,我得到了背景图案(手工在画图中编辑)。来自:

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

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

之后的结果如下:

First image match enter image description here

虽然还不完美,但如果您尝试使用不同的阈值值,例如:

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

你可以获得更好的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接