【问题标题】:How to remove small particle background noise from an image?如何去除梯度背景噪声?
【发布时间】:2019-06-21 02:22:43
【问题描述】:

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

首先将图像转换为灰度,使其失去一些可能有助于找到轮廓的渐变。

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

【问题讨论】:

  • 验证码实际上与背景噪音几乎无法区分。

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


【解决方案1】:

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

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

自适应阈值图像提取字符。从您的原始图像来看,似乎在字母cxz 上添加了渐变噪点,使其与背景融为一体。

接下来我们可以执行cv2.Canny()来检测边缘并得到这个

然后我们可以用cv2.morphologyEx()做形态开环,清理小噪点,增强细节

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

从这里,我们使用cv2.findContours() 找到轮廓。我们使用具有最小和最大区域的cv2.contourArea() 遍历每个轮廓和过滤器以获得边界框。根据您的图像,您可能需要调整最小/最大区域过滤器。这是结果

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)

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我认为你错过了验证码中的渐变点
    猜你喜欢
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 2020-05-03
    相关资源
    最近更新 更多