我正在尝试学习如何消除验证码图像的噪点。我开始尝试在图像中查找图案。

1)背景始终为橙色:

c# - C#如何使用OpenCV消除验证码的噪声?-LMLPHP c# - C#如何使用OpenCV消除验证码的噪声?-LMLPHP c# - C#如何使用OpenCV消除验证码的噪声?-LMLPHP

2)字体相同且尺寸相同。

c# - C#如何使用OpenCV消除验证码的噪声?-LMLPHP

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

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

最佳答案

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

  • 获取二进制图像。 加载图像,转换为灰度和自适应阈值。
  • 隔离所需的字符。 执行形态学打开操作以消除盐和胡椒的声音。
  • 消除小噪音。 查找轮廓并使用轮廓区域进行过滤。
  • 反转图像。 反转图像的原因是因为执行OCR时,我们希望所需的文本为黑色,而背景为白色。


  • 这是每个步骤的可视化:

    二进制图像

    c# - C#如何使用OpenCV消除验证码的噪声?-LMLPHP

    变形开口+轮廓区域过滤

    c# - C#如何使用OpenCV消除验证码的噪声?-LMLPHP

    反转图像以获得结果

    c# - C#如何使用OpenCV消除验证码的噪声?-LMLPHP

    这是其他图像的输出

    c# - C#如何使用OpenCV消除验证码的噪声?-LMLPHP
    c# - C#如何使用OpenCV消除验证码的噪声?-LMLPHP

    我在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()
    

    07-24 16:25
    查看更多