Ord*_*hez 3 python opencv image image-processing computer-vision
我正在尝试从我的图像中删除渐变背景噪音。我已经尝试了许多方法,cv2但均未成功。

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

有人知道应对这种背景的方法吗?我什至尝试从各个角落取样并应用某种内核过滤器。
消除梯度的一种方法是使用cv2.medianBlur()取内核下所有像素的中值来平滑图像。然后要提取字母,可以执行cv2.adaptiveThreshold()。
模糊消除了大多数梯度噪声。您可以更改内核大小以删除更多内容,但也将删除字母的详细信息
自适应阈值图像以提取字符。从您的原始图像来看,似乎在字母c,上添加了梯度噪点x,并z使其融合到背景中。
接下来,我们可以执行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)
Run Code Online (Sandbox Code Playgroud)