Один из способов удаления градиентов - использовать 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)