C# 如何使用 OpenCV 去除验证码的噪音?
C# how to use OpenCV to remove noise of a captcha?
我正在尝试学习如何消除验证码图像的噪音。我开始尝试在图像中寻找模式。
1) 背景始终为橙色:
2)字体一模一样大小一模一样
现在是时候尝试消除噪音了,但在我的搜索中,我无法理解如何使用我的验证码有效地消除噪音。
我熟悉 C# 并且正在阅读有关 OpenCV 的内容,我如何使用它来消除我拥有的图像中的噪声?
对于像这样非常二进制的图像,我建议使用 OpenCV 的形态变换。 See here 不同类型的描述。
这种转换可能是你想要消除噪音的方法,尽管它会稍微改变你的字母的形状:
这叫做 "opening" 它会侵蚀白色 space(完全擦除像噪音一样的小斑点)然后它会膨胀剩下的白色 space,所以更大的碎片将保持大致相同的大小。尝试 thresholding 您的图像,然后使用不同大小的内核打开,看看哪一个效果最好。
Here 是形态学开运算所需函数的文档。
这是一个非常简单的方法:
获取二值图像。加载图像,转换为灰度,自适应阈值。
隔离想要的字符。执行形态学开运算以去除椒盐噪声。
去除小噪声。查找轮廓并使用轮廓区域进行过滤。
反转图像。我们反转图像的原因是因为在执行 OCR 时,我们希望 想要的文本为黑色背景白色。
这是每个步骤的可视化:
二进制图像
变形开+轮廓区域过滤
为结果反转图像
这是其他图像的输出
我在 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()
我正在尝试学习如何消除验证码图像的噪音。我开始尝试在图像中寻找模式。
1) 背景始终为橙色:
2)字体一模一样大小一模一样
现在是时候尝试消除噪音了,但在我的搜索中,我无法理解如何使用我的验证码有效地消除噪音。
我熟悉 C# 并且正在阅读有关 OpenCV 的内容,我如何使用它来消除我拥有的图像中的噪声?
对于像这样非常二进制的图像,我建议使用 OpenCV 的形态变换。 See here 不同类型的描述。 这种转换可能是你想要消除噪音的方法,尽管它会稍微改变你的字母的形状:
这叫做 "opening" 它会侵蚀白色 space(完全擦除像噪音一样的小斑点)然后它会膨胀剩下的白色 space,所以更大的碎片将保持大致相同的大小。尝试 thresholding 您的图像,然后使用不同大小的内核打开,看看哪一个效果最好。
Here 是形态学开运算所需函数的文档。
这是一个非常简单的方法:
获取二值图像。加载图像,转换为灰度,自适应阈值。
隔离想要的字符。执行形态学开运算以去除椒盐噪声。
去除小噪声。查找轮廓并使用轮廓区域进行过滤。
反转图像。我们反转图像的原因是因为在执行 OCR 时,我们希望 想要的文本为黑色背景白色。
这是每个步骤的可视化:
二进制图像
变形开+轮廓区域过滤
为结果反转图像
这是其他图像的输出
我在 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()