шумоподавление двоичного изображения в python

Для моего проекта я пытаюсь бинаризировать изображение с помощью openCV в python. Я использовал адаптивный порог Гаусса из openCV для преобразования изображения со следующим результатом: введите здесь описание изображения

Я хочу использовать бинарное изображение для OCR, но оно слишком шумное. Есть ли способ удалить шум из двоичного изображения в python? Я уже пробовал fastNlMeansDenoising из openCV, но это не имеет значения.

P.S. Также приветствуются лучшие варианты бинаризации.


person R.hagens    schedule 16.03.2018    source источник


Ответы (3)


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

Я предлагаю в качестве адаптивного порога использовать закрытие (на входном изображении в оттенках серого) с элементом структурирования, достаточно большим, чтобы удалить весь текст. Разница между этим результатом и входным изображением как раз и составляет весь текст. Затем вы можете применить к этой разнице обычный порог.

person Cris Luengo    schedule 16.03.2018
comment
Я уже использую адаптивное пороговое значение, но я пробовал играть с переменными, которые имели огромное значение. Спасибо за Ваш ответ - person R.hagens; 19.03.2018

Также возможно использование 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)

Результат

person p13rr0m    schedule 16.03.2018
comment
отлично сработало для меня - person Sergio Ferrer Sánchez; 28.01.2021

Вы можете попробовать морфологическое преобразование близко, чтобы удалить маленькие «дыры». Сначала определите ядро ​​с помощью numpy, возможно, вам придется поиграть с размером. Выберите размер ядра таким же большим, как ваш шум.

kernel = np.ones((5,5),np.uint8)

Затем запустите morphologyEx с помощью ядра.

denoised = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernel)

Если текст удаляется, вы можете попытаться размыть изображение, это «вырастет» черными пикселями. Если шум такой же большой, как и данные, этот метод не поможет.

erosion = cv2.erode(img,kernel,iterations = 1)
person aclown    schedule 16.03.2018
comment
Спасибо за ваш ответ, мне нравится ваш подход, но он не работает для этого изображения. Но я уже нашел другой способ бинаризации изображения с именем порог Саувола. - person R.hagens; 16.03.2018
comment
Спасибо за ваш комментарий. Я боялся, что это не сработает, изображение довольно шумное. Порог Sauvola выглядит многообещающе, я тоже попробую! - person aclown; 16.03.2018