Eu preciso remover a seção enegrecida em vários partes da imagem usando Python CV. Eu tentei com denoising que não dá resultados satisfatórios.
Por exemplo. I necessário remover a parte enegrecida na Tabela Cabeçalho (abaixo da imagem) e converter o fundo cabeçalho para branco com conteúdos como preto.
Alguém pode me ajudar com a escolha da biblioteca ou solução correta para superar isso?
Aqui está uma versão modificada do @ do eldesgraciado abordagem para filtrar o padrão pontilhada usando um hit morfológica ou operação perder nos pixels alvo em Python. A diferença é que em vez de subtrair a máscara com a imagem binária que diminui a qualidade do texto, que dilatam a imagem binária, em seguida, bit a bit e para manter a qualidade do texto.
Obter imagem binária. Imagem de carga, em tons de cinza, limiar de Otsu
Execute hit morfológica ou operação perder. Nós criamos um kernel padrão de pontos com
cv2.getStructuringElement
, em seguida, usocv2.filter2D
a convolve a imagemRemover pontos. Nós
cv2.bitwise-xor
a máscara com a imagem bináriaFix danificados pixels de texto. Nós
cv2.dilate
, em seguida,cv2.bitwise_and
a máscara finalizado com a imagem de entrada e fundo da cor pixels brancos
imagem binária
máscara Dot
remover pontos
Dilatam para corrigir danificado pixels de texto a partir do processo de thresholding
Resultado
Código
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()