Шумоподавляющий двоичный образ в питоне
Для моего проекта я пытаюсь преобразовать изображение в двоичную форму с помощью openCV в python. Я использовал адаптивный гауссовский порог от openCV для преобразования изображения со следующим результатом:
Я хочу использовать двоичное изображение для распознавания текста, но оно слишком шумное. Есть ли способ удалить шум из двоичного изображения в Python? Я уже попробовал fastNlMeansDenoising от openCV, но это не имеет значения.
PS также приветствуются лучшие варианты бинаризации
3 ответа
Вы должны начать с настройки параметров на адаптивный порог, чтобы он занимал большую площадь. Таким образом, шум не будет выделяться. Всякий раз, когда ваше выходное изображение имеет больше шума, чем входное изображение, вы знаете, что делаете что-то не так.
В качестве адаптивного порога я предлагаю использовать закрывающее (на входном изображении серого) элемент структурирования, достаточно большой, чтобы удалить весь текст. Разница между этим результатом и входным изображением состоит в точности всего текста. Затем вы можете применить обычный порог к этой разнице.
Также возможно использование GraphCuts для такого рода задач. Вам нужно будет установить библиотеку maxflow, чтобы запустить код. Я быстро скопировал код из их учебника и изменил его, чтобы вам было проще его запускать. Просто поиграйте с параметром сглаживания, чтобы увеличить или уменьшить шум на изображении.
import cv2
import numpy as np
import matplotlib.pyplot as plt
import maxflow
# Important parameter
# Higher values means making the image smoother
smoothing = 110
# Load the image and convert it to grayscale image
image_path = 'your_image.png'
img = cv2.imread('image_path')
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img = 255 * (img > 128).astype(np.uint8)
# Create the graph.
g = maxflow.Graph[int]()
# Add the nodes. nodeids has the identifiers of the nodes in the grid.
nodeids = g.add_grid_nodes(img.shape)
# Add non-terminal edges with the same capacity.
g.add_grid_edges(nodeids, smoothing)
# Add the terminal edges. The image pixels are the capacities
# of the edges from the source node. The inverted image pixels
# are the capacities of the edges to the sink node.
g.add_grid_tedges(nodeids, img, 255-img)
# Find the maximum flow.
g.maxflow()
# Get the segments of the nodes in the grid.
sgm = g.get_grid_segments(nodeids)
# The labels should be 1 where sgm is False and 0 otherwise.
img_denoised = np.logical_not(sgm).astype(np.uint8) * 255
# Show the result.
plt.subplot(121)
plt.imshow(img, cmap='gray')
plt.title('Binary image')
plt.subplot(122)
plt.title('Denoised binary image')
plt.imshow(img_denoised, cmap='gray')
plt.show()
# Save denoised image
cv2.imwrite('img_denoised.png', img_denoised)
Вы можете попробовать морфологическое преобразование близко, чтобы удалить маленькие "дыры". Сначала определите ядро, используя numpy, вам может потребоваться поэкспериментировать с размером. Выберите размер ядра, равный вашему шуму.
kernel = np.ones((5,5),np.uint8)
Затем запустите morphologyEx, используя ядро.
denoised = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)
Если текст удален, вы можете попытаться стереть изображение, это "увеличит" черные пиксели. Если шум такой же большой, как данные, этот метод не поможет.
erosion = cv2.erode(img,kernel,iterations = 1)