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 tesseractarquivo 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_BGR2GRAYcv2.COLOR_BGR2HSV cv2.COLOR_BGR2GRAY cv2.threshold

Existem 3 tipos de limite:

  1. Limiar Simples
  2. Limiar Adaptativo
  3. 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.dilatefunçã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