gpt4 book ai didi

python - 清理验证码图像

转载 作者:IT老高 更新时间:2023-10-28 20:39:48 26 4
gpt4 key购买 nike

captcha image

我正在尝试清理上面的图像我已经尝试了几种不同的方法使用 open cv,我要么过度侵 eclipse 原始图像,以至于部分字母丢失,如下所示:

result of erosion via python opencv 3

我不太确定如何摆脱最后一条对角线并修复 S,到目前为止我的代码是:

import cv2 
import matplotlib.pylab as plt
img = cv2.imread('/captcha_3blHDdS.png')

#make image gray
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

#Blur
blur = cv2.GaussianBlur(gray,(5,5),0)
bilateral = cv2.bilateralFilter(gray,5,75,75)

#Thresholding
ret, thresh = cv2.threshold(bilateral,25,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)

#Kernal
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))

#other things
erosion = cv2.erode(thresh,kernel,iterations = 1)
closing = cv2.morphologyEx(erosion, cv2.MORPH_CLOSE, kernel, iterations = 1)

#Transform image
dist_transform = cv2.distanceTransform(closing,cv2.DIST_L2,5)
ret, sure_fg = cv2.threshold(dist_transform,0.02*dist_transform.max(),255,cv2.THRESH_BINARY)#,255,0)

#kernel_1
kernel_1 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (1, 2))

dilation_1 = cv2.dilate(sure_fg,kernel_1,iterations = 2)
erosion_1 = cv2.erode(dilation_1,kernel_1,iterations = 3)

plt.imshow(erosion_1, 'gray')

任何帮助将不胜感激,以下是从验证码生成的图像类型的更多示例; example of captcha images

还有指向包含 images 的文件夹的链接。

最佳答案

这是一个使用 OpenCvSharp 的 C# 解决方案(应该很容易转换回 python/c++,因为方法名称完全相同)。

它使用 OpenCV 的 inpainting避免在可能运行 OCR 阶段之前破坏太多字母的技术。我们可以看到线条的颜色与其他线条不同,因此我们将在很早之前使用该信息,然后再进行任何灰度/黑白。步骤如下:

  • 使用线条的颜色构建蒙版 (#707070)
  • 稍微放大该掩码,因为线条可能已使用抗锯齿绘制
  • 使用此蒙版重新绘制(“修复”)原始图像,这将删除线条,同时保留线条下方的大部分内容(字母)。请注意,我们可以删除之前该步骤之前的小点,我认为它会更好
  • 应用一些扩张/模糊/阈值来完成

这是面具:

enter image description here

结果如下:

enter image description here

这是样本集上的结果:

enter image description here

这是 C# 代码:

static void Decaptcha(string filePath)
{
// load the file
using (var src = new Mat(filePath))
{
using (var binaryMask = new Mat())
{
// lines color is different than text
var linesColor = Scalar.FromRgb(0x70, 0x70, 0x70);

// build a mask of lines
Cv2.InRange(src, linesColor, linesColor, binaryMask);
using (var masked = new Mat())
{
// build the corresponding image
// dilate lines a bit because aliasing may have filtered borders too much during masking
src.CopyTo(masked, binaryMask);
int linesDilate = 3;
using (var element = Cv2.GetStructuringElement(MorphShapes.Ellipse, new Size(linesDilate, linesDilate)))
{
Cv2.Dilate(masked, masked, element);
}

// convert mask to grayscale
Cv2.CvtColor(masked, masked, ColorConversionCodes.BGR2GRAY);
using (var dst = src.EmptyClone())
{
// repaint big lines
Cv2.Inpaint(src, masked, dst, 3, InpaintMethod.NS);

// destroy small lines
linesDilate = 2;
using (var element = Cv2.GetStructuringElement(MorphShapes.Ellipse, new Size(linesDilate, linesDilate)))
{
Cv2.Dilate(dst, dst, element);
}

Cv2.GaussianBlur(dst, dst, new Size(5, 5), 0);
using (var dst2 = dst.BilateralFilter(5, 75, 75))
{
// basically make it B&W
Cv2.CvtColor(dst2, dst2, ColorConversionCodes.BGR2GRAY);
Cv2.Threshold(dst2, dst2, 255, 255, ThresholdTypes.Otsu);

// save the file
dst2.SaveImage(Path.Combine(
Path.GetDirectoryName(filePath),
Path.GetFileNameWithoutExtension(filePath) + "_dst" + Path.GetExtension(filePath)));
}
}
}
}
}
}

关于python - 清理验证码图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44788018/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com