【发布时间】:2020-03-31 20:38:47
【问题描述】:
我正在尝试学习如何去除验证码图像的噪点。我开始尝试在图像中寻找模式。
1) 背景总是橙色的:
2) 字体相同,尺寸相同。
现在是时候尝试消除噪音了,但在我的搜索中,我无法理解如何使用我拥有的验证码有效地消除噪音。
我熟悉 C#,并且正在阅读有关 OpenCV 的信息,如何使用它来去除我拥有的图像中的噪点?
【问题讨论】:
标签: c# image opencv image-processing captcha
我正在尝试学习如何去除验证码图像的噪点。我开始尝试在图像中寻找模式。
1) 背景总是橙色的:
2) 字体相同,尺寸相同。
现在是时候尝试消除噪音了,但在我的搜索中,我无法理解如何使用我拥有的验证码有效地消除噪音。
我熟悉 C#,并且正在阅读有关 OpenCV 的信息,如何使用它来去除我拥有的图像中的噪点?
【问题讨论】:
标签: c# image opencv image-processing captcha
这是一个非常简单的方法:
获取二值图像。加载图像,转换为灰度,自适应阈值。
隔离所需的字符。执行形态打开以去除椒盐噪声。
去除小噪声。查找轮廓并使用轮廓区域进行过滤。
反转图像。我们反转图像的原因是因为在执行 OCR 时,我们希望 所需的文本为黑色,背景为白色。 p>
这是每个步骤的可视化:
二值图像
变形开口+轮廓区域过滤
反转图像以获得结果
这是其他图像的输出
我在 python 中实现了这个方法,但你可以将相同的策略应用到 C#中
import cv2
# Load image, grayscale, adaptive threshold
image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY,11,3)
# Morph open
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=1)
# Remove noise by filtering using contour area
cnts = cv2.findContours(opening, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
area = cv2.contourArea(c)
if area < 10:
cv2.drawContours(opening, [c], -1, (0,0,0), -1)
# Invert image for result
result = 255 - opening
cv2.imshow('thresh', thresh)
cv2.imshow('opening', opening)
cv2.imshow('result', result)
cv2.waitKey()
【讨论】:
对于像这样非常二进制的图像,我建议使用 OpenCV 的形态变换。 See here 了解不同类型的描述。 这种转换可能是您想要消除噪音的方法,尽管它会稍微改变字母的形状:
这称为“开放”,它会侵蚀空白空间(完全擦除像您的噪音这样的小斑点),然后它会扩大剩余的空白空间,因此较大的碎片将保持大致相同的大小。试试thresholding你的图片,然后用不同大小的内核打开看看哪个效果最好。
Here 是关于形态学打开所需函数的文档。
【讨论】: