Detecção e extração de texto usando OpenCV e OCR
OpenCV (Open source computer vision) é uma biblioteca de funções de programação voltada principalmente para a visão computacional em tempo real. OpenCV em python ajuda a processar uma imagem e aplicar várias funções como redimensionamento de imagem, manipulação de pixels, detecção de objetos, etc. Neste artigo, aprenderemos como usar contornos para detectar o texto em uma imagem e salvá-lo em um arquivo de texto.
Instalações necessárias:
pip install opencv-python pip install pytesseract
O pacote OpenCV é usado para ler uma imagem e executar certas técnicas de processamento de imagem. Python-tesseract é um wrapper para o mecanismo Tesseract-OCR do Google, que é usado para reconhecer texto de imagens.
Baixe o tesseract
arquivo executável deste link .
Abordagem:
Após as importações necessárias, uma imagem de amostra é lida usando a imread
função de opencv.
Aplicando processamento de imagem para a imagem:
O espaço de cores da imagem é primeiro alterado e armazenado em uma variável. Para conversão de cores, usamos a função cv2.cvtColor (input_image, flag). O segundo sinalizador de parâmetro determina o tipo de conversão. Podemos escolher entre e . nos ajuda a converter uma imagem RGB em imagem em escala de cinza e é usado para converter uma imagem RGB em imagem de espaço de cor HSV (matiz, saturação, valor). Aqui, usamos . Um limite é aplicado à imagem encoberta usando a função. cv2.COLOR_BGR2GRAY
cv2.COLOR_BGR2HSV
cv2.COLOR_BGR2GRAY
cv2.COLOR_BGR2HSV
cv2.COLOR_BGR2GRAY
cv2.threshold
Existem 3 tipos de limite:
- Limiar Simples
- Limiar Adaptativo
- Binarização de Otsu
Para obter mais informações sobre limiares, consulte Técnicas de limiares usando OpenCV .
cv2.threshold()
tem 4 parâmetros, sendo o primeiro parâmetro a imagem alterada do espaço de cores, seguido pelo valor de limite mínimo, o valor de limite máximo e o tipo de limite que deve ser aplicado.
Para obter uma estrutura retangular:
cv2.getStructuringElement()
é usado para definir um elemento estrutural como elíptico, circular, retangular etc. Aqui, usamos o elemento estrutural retangular ( cv2.MORPH_RECT
). cv2.getStructuringElement
leva um tamanho extra do parâmetro do kernel . Um kernel maior faria agrupar blocos maiores de textos. Depois de escolher o kernel correto, a dilatação é aplicada à imagem com cv2.dilate
função. A dilatação torna os grupos de texto a serem detectados com mais precisão, uma vez que dilata (expande) um bloco de texto.
Encontrando contornos:
cv2.findContours()
é usado para encontrar contornos na imagem dilatada. Existem três argumentos em cv.findContours(): a imagem de origem, o modo de recuperação de contorno e o método de aproximação de contorno.
Esta função retorna contornos e hierarquia. Contours é uma lista python de todos os contornos da imagem. Cada contorno é uma matriz Numpy de (x, y) coordenadas de pontos de fronteira no objeto. Os contornos são normalmente usados para localizar um objeto branco em um fundo preto. Todas as técnicas de processamento de imagem acima são aplicadas para que o Contours possa detectar as bordas dos blocos de texto da imagem. Um arquivo de texto é aberto no modo de gravação e liberado. Este arquivo de texto é aberto para salvar o texto da saída do OCR.
Aplicando OCR:
Faça um loop em cada contorno e pegue as coordenadas xey e a largura e altura usando a função cv2.boundingRect()
. Em seguida, desenhe um retângulo na imagem usando a função cv2.rectangle() com a ajuda das coordenadas xey obtidas e da largura e altura. Existem 5 parâmetros em cv2.rectangle(), o primeiro parâmetro especifica a imagem de entrada, seguido pelas coordenadas xey (coordenadas iniciais do retângulo), as coordenadas finais do retângulo que é (x + w, y + h), a cor do limite para o retângulo no valor RGB e o tamanho do limite. Agora recorte a região retangular e passe-a para o tesseract para extrair o texto da imagem. Em seguida, abrimos o arquivo de texto criado no modo anexar para anexar o texto obtido e fechar o arquivo.
Amostra de imagem usada para o código:
import
cv2
import
pytesseract
pytesseract.pytesseract.tesseract_cmd
=
'System_path_to_tesseract.exe'
img
=
cv2.imread(
"sample.jpg"
)
gray
=
cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh1
=
cv2.threshold(gray,
0
,
255
, cv2.THRESH_OTSU | cv2.THRESH_BINARY_INV)
rect_kernel
=
cv2.getStructuringElement(cv2.MORPH_RECT, (
18
,
18
))
dilation
=
cv2.dilate(thresh1, rect_kernel, iterations
=
1
)
contours, hierarchy
=
cv2.findContours(dilation, cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_NONE)
im2
=
img.copy()
file
=
open
(
"recognized.txt"
,
"w+"
)
file
.write("")
file
.close()
for
cnt
in
contours:
x, y, w, h
=
cv2.boundingRect(cnt)
rect
=
cv2.rectangle(im2, (x, y), (x
+
w, y
+
h), (
0
,
255
,
0
),
2
)
cropped
=
im2[y:y
+
h, x:x
+
w]
file
=
open
(
"recognized.txt"
,
"a"
)
text
=
pytesseract.image_to_string(cropped)
file
.write(text)
file
.write(
"\n"
)
file
.close
As postagens do blog Acervo Lima te ajudaram? Nos ajude a manter o blog no ar!
Faça uma doação para manter o blog funcionando.
70% das doações são no valor de R$ 5,00...
Diógenes Lima da Silva