如何消除渐变背景噪音?

时间:2019-06-21 02:22:43

标签: python image opencv image-processing computer-vision

我正在尝试从所拥有的图像中消除渐变背景噪声。我用cv2尝试了很多方法,但都没有成功。

sample

首先将图像转换为灰度,使其失去一定的梯度,这可能有助于查找轮廓。

Imgur

有人知道应对这种背景的方法吗?我什至尝试从各个角落取样并应用某种内核过滤器。

3 个答案:

答案 0 :(得分:7)

消除梯度的一种方法是使用cv2.medianBlur()通过获取内核下所有像素的中值来平滑图像。然后要提取字母,可以执行cv2.adaptiveThreshold()

模糊消除了大部分梯度噪声。您可以更改内核大小以删除更多内容,但同时也会删除字母的详细信息

enter image description here

自适应阈值图像以提取字符。从您的原始图像来看,似乎在字母cxz上添加了渐变噪声,使其融合到背景中。

enter image description here

接下来,我们可以执行cv2.Canny()来检测边缘并获取边缘

enter image description here

然后我们可以使用cv2.morphologyEx()进行形态学打开,以清除小噪声并增强细节

enter image description here

现在,我们使用cv2.dilate()进行扩张以获取单个轮廓

enter image description here

从这里,我们使用cv2.findContours()查找轮廓。我们遍历每个轮廓,并使用cv2.contourArea()进行过滤,并使用最小和最大面积来获得边界框。根据您的图像,您可能需要调整最小/最大面积过滤器。这是结果

enter image description here

import cv2
import numpy as np

image = cv2.imread('1.png')

blur = cv2.medianBlur(image, 7)
gray = cv2.cvtColor(blur, cv2.COLOR_BGR2GRAY)
thresh = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY,11,3)

canny = cv2.Canny(thresh, 120, 255, 1)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5,5))
opening = cv2.morphologyEx(canny, cv2.MORPH_CLOSE, kernel)
dilate = cv2.dilate(opening, kernel, iterations=2)

cnts = cv2.findContours(dilate, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]

min_area = 500
max_area = 7000
for c in cnts:
    area = cv2.contourArea(c)
    if area > min_area and area < max_area:
        x,y,w,h = cv2.boundingRect(c)
        cv2.rectangle(image, (x, y), (x + w, y + h), (36,255,12), 2)

cv2.imshow('blur', blur)
cv2.imshow('thresh', thresh)
cv2.imshow('canny', canny)
cv2.imshow('opening', opening)
cv2.imshow('dilate', dilate)
cv2.imshow('image', image)
cv2.waitKey(0)

答案 1 :(得分:1)

好吧,感谢您提出的非常有趣的挑战。那是我见过的最讨厌的文本验证码,它使用了许多反计算机视觉技术(渐变背景,斜体和普通文本交替出现,阴影数量不同,盐和胡椒噪声,jpeg压缩,棋盘图案,模糊,打孔)字母本身的孔,不连续的字母段,与背景混合的字母,变化的字母颜色以及假轮廓和反轮廓技术)。设计验证码的人真的很棒。

下面的结果图像是完全自动化的,并且几乎完全基于纯Numpy数学,完全没有OpenCV。如果您考虑验证码及其设计,人类如何区分字母,以及必须如何使计算机对其进行分析以隔离和重构每个字母,那么对于您来说,这也是完全可以实现的。但是因为这是一个验证码,所以我不愿意共享代码,因为垃圾邮件发送者可能会滥用它...

我最想知道验证码来自哪个网站...

result

答案 2 :(得分:0)

您可以在每个像素上放置一个值,该值定义像素的暗度。然后,如果有相似的数字,只需找到中位数并将相似的像素设置为此。 将其标准化为白色,灰色和黑色,然后可以区分背景和字符。