Вот два метода очистки изображения с использованием Python OpenCV
Метод # 1: пороговое значение Numpy
Поскольку вертикальные линии, горизонтальные линии и фон являютсякрасным мы можем воспользоваться этим и использовать пороговое значение Numpy, чтобы изменить все красные пиксели выше порогового значения на белый.
![enter image description here](https://i.stack.imgur.com/UIHeI.png)
import cv2
import numpy as np
image = cv2.imread('1.jpg')
image[np.where((image > [0,0,105]).all(axis=2))] = [255,255,255]
cv2.imshow('image', image)
cv2.waitKey()
Метод № 2: Традиционная обработка изображений
Для более общего подхода, если линии не были красными, мы можем использовать простые методы обработки изображений для очистки изображения. Чтобы удалить вертикальные и горизонтальные линии, мы можем создать специальные ядра, чтобы изолировать линии и удалить их, используя маскирование и побитовые операции. После удаления линий мы можем использовать пороговое значение, морфологические операции и контурную фильтрацию для удаления красного фона. Вот визуализация процесса
Сначала мы строим вертикальные и горизонтальные ядра, а затем cv2.morphologyEx()
, чтобы обнаружить линии. Отсюда у нас есть отдельные маски горизонтальных и вертикальных линий, затем побитовые или две маски для получения маски со всеми удаляемыми линиями. Далее мы поразрядно - или с исходным изображением удаляем все строки
![enter image description here](https://i.stack.imgur.com/Iee5v.png)
Теперь, когда линии удалены, мы можем работать над удалением красного фона. Мы пороговые для получения двоичного изображения и выполняем морфологические операции для сглаживания текста
![enter image description here](https://i.stack.imgur.com/ap5wA.png)
Есть еще маленькие точки, поэтому для их удаления мы находим контуры иФильтр с использованием минимальной пороговой области для удаления небольшого шума
![enter image description here](https://i.stack.imgur.com/N6qZG.png)
Наконец, мы инвертируем изображение, чтобы получить наш результат
![enter image description here](https://i.stack.imgur.com/02q0l.png)
import cv2
image = cv2.imread('1.jpg')
# Remove vertical and horizontal lines
kernel_vertical = cv2.getStructuringElement(cv2.MORPH_RECT, (1,50))
temp1 = 255 - cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel_vertical)
horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (50,1))
temp2 = 255 - cv2.morphologyEx(image, cv2.MORPH_CLOSE, horizontal_kernel)
temp3 = cv2.add(temp1, temp2)
removed = cv2.add(temp3, image)
# Threshold and perform morphological operations
gray = cv2.cvtColor(removed, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 180, 255, cv2.THRESH_BINARY_INV)[1]
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2,2))
close = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel, iterations=1)
# Filter using contour area and remove small noise
cnts = cv2.findContours(close, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
area = cv2.contourArea(c)
if area < 10:
cv2.drawContours(close, [c], -1, (0,0,0), -1)
final = 255 - close
cv2.imshow('removed', removed)
cv2.imshow('thresh', thresh)
cv2.imshow('close', close)
cv2.imshow('final', final)
cv2.waitKey()