簡體   English   中英

C# 如何使用 OpenCV 去除驗證碼的噪音?

[英]C# how to use OpenCV to remove noise of a captcha?

我正在嘗試學習如何去除驗證碼圖像的噪音。 我開始嘗試在圖像中找到模式。

1)背景總是橙色:

驗證碼 1 驗證碼 2 驗證碼 3

2) 字體相同,大小相同。

驗證碼 4

現在是嘗試消除噪音的時候了,但在我的搜索中,我無法理解如何使用我擁有的驗證碼有效地消除噪音。

我熟悉 C# 並且我正在閱讀有關 OpenCV 的內容,我如何使用它來消除我擁有的圖像中的噪音?

這是一個非常簡單的方法:

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

對於這些非常二元的圖像,我建議使用 OpenCV 的形態變換。 有關不同類型的說明, 請參見此處 這種轉換可能是您想要消除噪音的方法,盡管它會稍微改變字母的形狀:

形態開口

這稱為“開口”,它會侵蝕白色空間(完全擦除像噪音一樣的小斑點),然后它會擴大剩余的白色空間,因此較大的碎片將保持大致相同的大小。 嘗試對圖像進行閾值處理,然后使用不同大小的內核打開以查看哪個效果最好。

是有關形態學打開所需的函數的文檔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM