首页 > 解决方案 > C#如何使用OpenCV去除验证码的噪音?

问题描述

我正在尝试学习如何去除验证码图像的噪点。我开始尝试在图像中寻找模式。

1)背景总是橙色:

验证码 1 验证码 2 验证码 3

2) 字体是一样的,并且是相同的大小。

验证码 4

现在是时候尝试消除噪音了,但是在我的搜索中,我无法理解如何使用我拥有的验证码有效地消除噪音。

我熟悉 C# 并且正在阅读有关 OpenCV 的信息,如何使用它来消除我拥有的图像中的噪声?

标签: c#imageopencvimage-processingcaptcha

解决方案


这是一个非常简单的方法:

  1. 获取二值图像。加载图像,转换为灰度,自适应阈值。

  2. 隔离所需的字符。执行形态打开以消除椒盐噪声。

  3. 去除小噪音。查找轮廓并使用轮廓区域进行过滤。

  4. 反转图像。我们反转图像的原因是因为在执行 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()

推荐阅读