Retirez la section d'en-tête noire de l'image en utilisant Python OpenCV

Raja:

Je dois enlever la section noircie en plusieurs parties de l'image à l'aide de CV Python. J'ai essayé avec débruitage qui ne donne pas de résultats satisfaisants.

Par exemple. Je dois enlever la partie noircie dans le tableau en-tête (image ci-dessous) et convertir le fond d'en-tête en blanc avec le contenu en noir.

entrez la description d'image ici

aider quelqu'un peut me choisir avec la bibliothèque correcte ou d'une solution pour surmonter cela?

nathancy:

Voici une version modifiée de l'approche @ eldesgraciado pour filtrer le motif pointillé en utilisant un coup morphologique ou opération de manquer sur les pixels cibles en Python. La différence est qu'au lieu de soustraire le masque à l'image binaire qui diminue la qualité du texte, nous dilatons l'image binaire alors logique binaire de conserver la qualité du texte.

  1. Obtenir l' image binaire. Charger l' image, niveaux de gris, seuil de Otsu

  2. Effectuer coup morphologique ou une opération miss. Nous créons un noyau de motif de points avec cv2.getStructuringElementensuite l' utilisation cv2.filter2Dde l'image convoluer

  3. Retirer des points. Nous cv2.bitwise-xorle masque avec l'image binaire

  4. Correction des pixels de texte endommagé. Nous cv2.dilatealors cv2.bitwise_andle masque finalisé avec les pixels d'image d'entrée et arrière - plan de couleur blanc


image binaire

entrez la description d'image ici

masque dot

entrez la description d'image ici

Supprimer points

entrez la description d'image ici

Dilatent pour fixer les pixels de texte endommagé du processus de seuillage

entrez la description d'image ici

Résultat

entrez la description d'image ici

Code

import cv2
import numpy as np

# Load image, grayscale, Otsu's threshold
image = cv2.imread('1.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

# Perform morphological hit or miss operation
kernel = np.array([[-1,-1,-1], [-1,1,-1], [-1,-1,-1]])
dot_mask = cv2.filter2D(thresh, -1, kernel)

# Bitwise-xor mask with binary image to remove dots
result = cv2.bitwise_xor(thresh, dot_mask)

# Dilate to fix damaged text pixels
# since the text quality has decreased from thresholding
# then bitwise-and with input image
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2,2))
dilate = cv2.dilate(result, kernel, iterations=1)
result = cv2.bitwise_and(image, image, mask=dilate)
result[dilate==0] = [255,255,255]

cv2.imshow('dot_mask', dot_mask)
cv2.imshow('thresh', thresh)
cv2.imshow('result', result)
cv2.imshow('dilate', dilate)
cv2.waitKey()

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=281036&siteId=1
conseillé
Classement