Как убрать градиентный фоновый шум? - PullRequest
3 голосов
/ 21 июня 2019

Я пытаюсь удалить градиентный фоновый шум из изображений, которые у меня есть. Я пробовал много способов с cv2 безуспешно.

sample

Сначала преобразуем изображение в оттенки серого, чтобы оно потеряло некоторые градиенты, которые могут помочь найти контуры.

Imgur

Кто-нибудь знает способ справиться с такого рода фоном? Я даже пытался взять образец из углов и применить какой-то фильтр ядра.

Ответы [ 2 ]

7 голосов
/ 21 июня 2019

Один из способов удаления градиентов - использовать cv2.medianBlur(), чтобы сгладить изображение, взяв медиану всех пикселей под ядром.Затем, чтобы извлечь буквы, вы можете выполнить cv2.adaptiveThreshold().

Размытие удаляет большую часть градиентного шума.Вы можете изменить размер ядра, чтобы удалить больше, но он также удалит детали букв

enter image description here

Адаптивный порог изображения для извлечения символов.Из вашего исходного изображения кажется, что на буквы c, x и z добавлен градиентный шум, чтобы он сливался с фоном.

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)
0 голосов
/ 21 июня 2019

Вы можете поставить значение для каждого пикселя, которое определяет, насколько темный пиксель.Затем, если есть похожие числа, просто найдите медиану и установите аналогичные пиксели для этого.Нормализуйте его на белый, серый и черный, тогда вы сможете различать фон и символы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...