Удалите шум с изображения, не теряя данные в OpenCV - PullRequest
1 голос
/ 18 марта 2020

я использовал этот код:

    horizontalStructure = cv2.getStructuringElement(cv2.MORPH_RECT, (horizontalsize, 1))
    horizontal = cv2.erode(horizontal, horizontalStructure, (-1, -1))
    horizontal = cv2.dilate(horizontal, horizontalStructure, (-1, -1))

для удаления линий.

и некоторые фильтры для удаления шумов и полужирного шрифта:

 blur = cv2.GaussianBlur(img, (11, 11), 0)
 thresh = cv2.threshold(blur, 80, 255, cv2.THRESH_BINARY)[1]
 kernel = np.ones((2,1), np.uint8)
 dilation = cv2.erode(thresh, kernel, iterations=1)
 dilation = cv2.bitwise_not(dilation)

Несмотря на порог и другие методы, как вы можете видеть, много шума осталось

Вот результат, которого я хочу достичь:

Знаете ли вы фильтр OpenCV, который поможет мне достичь этого результата?

1 Ответ

0 голосов
/ 18 марта 2020

Следующее решение не является идеальным и не универсальным c решением, но я надеюсь, что оно достаточно для ваших нужд.

Для удаления линии я предлагаю использовать cv2.connectedComponentsWithStats для поиска кластеров и маскировать широкие или длинные кластеры.

В решении используются следующие этапы:

  • Преобразование изображения в оттенки серого.
  • Применение порогового значения и инвертирования полярности.
    Использование автоматического определения порога c путем применения flag cv2.THRESH_OTSU.
  • Используйте морфологическую операцию «закрыть», чтобы закрыть небольшие пробелы.
  • Найти связанные компоненты (кластеры) со статистикой.
  • Переберите кластеры и удалите кластеры большой ширины и большой высоты.
    Удалите очень маленькие кластеры - считается шумом.
  • Верх и левая сторона очищаются «вручную».

Вот код:

import numpy as np
import cv2

img = cv2.imread('Heshbonit.jpg')  # Read input image

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # Convert to Grayscale.

ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)  # Convert to binary and invert polarity

# Use "close" morphological operation to close small gaps
thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, np.array([1, 1]));
thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, np.array([1, 1]).T);

nlabel,labels,stats,centroids = cv2.connectedComponentsWithStats(thresh, connectivity=8)

thresh_size = 100

# Delete all lines by filling wide and long lines with zeros.
# Delete very small clusters (assumes to be noise).
for i in range(1, nlabel):
    #
    if (stats[i, cv2.CC_STAT_WIDTH] > thresh_size) or (stats[i, cv2.CC_STAT_HEIGHT] > thresh_size):
        thresh[labels == i] = 0
    if stats[i, cv2.CC_STAT_AREA] < 4:
        thresh[labels == i] = 0

# Clean left and top margins "manually":
thresh[:, 0:30] = 0
thresh[0:10, :] = 0

# Inverse polarity
thresh = 255 - thresh

# Write result to file
cv2.imwrite('thresh.png', thresh)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...