%Evandro Luis Copercini
%Trabalho 2 de Processamento digital de sinais 2
%Reconhecimento Ótico de caracteres (OCR - Optical Character Recognition)

%BUGS: só funciona com imagens de uma linha, não reconhece espaços.

warning off %desativa alertas
clc, close all, clear all

%% Abre arquivo
[filename, pathname] = uigetfile('*','Abra a imagem a ser processada'); %busca arquivo

imagem=imread(fullfile(pathname,filename)); %Lê a imagem para o matlab

%imagem=imread('oi.jpg'); %Lê imagem fotografada ou scaniada
imshow(imagem) 
title('Imagem lida (Original)');


%% Pré processamento

retira_de_pixels = 30;  % desconsidera objetos menor que o valor definido em pixels (utilizado para eliminar ruido)

imagem = rgb2gray(imagem);  %Converte imagem para escala de cinza
	figure;
	imshow(imagem) %mostra imagem es escala de cinza
	
% Converte para preto e branco (binário)
threshold = graythresh(imagem);    %Cálculo do limiar da imagem para utilizar na função im2bw
imagem =~im2bw(imagem,threshold);   %Converte a imagem em escala de cinza para uma imagem binária(só preto ou branco) (de forma invertida)
imagem = bwareaopen(imagem,retira_de_pixels);     % Remove objetos menores que o valor definido na constante retira_de_pixels

figure;
imshow(imagem) %mostra imagem em preto e branco

%% Treinamento
%Foi criado um banco de matrizes, uma de cada letra e armazenada no banco 'letras_pre_definidas'
load letras_pre_definidas
global letras_pre_definidas

qtd_letras_pre_definidas=size(letras_pre_definidas,2);


%% Imagem que será processada

texto=[ ];

% bwlabel numera componentes conectados 
% ( explicado melhor em http://www.mathworks.com/help/images/ref/bwlabel.html )
[L, Ne] = bwlabel(imagem);    %Ne é o número total de letras na imagem

for n=1:Ne % Varre letra por letra da imagem
    [r,c] = find(L==n); % obtem as coordenadas de linha e coluna do objecto identificado como n.
    n1=imagem(min(r):max(r),min(c):max(c));  % Extrai letras baseado nas coordenadas obtidas pelo find
    img_r=imresize(n1,[42 24]); % Redimensiona letras para o mesmo tamanho das pré amostradas (42x24 px)    
    figure
    imshow(img_r);pause(0.5)  %Mostra letra por letra (apensa para melhor apresentação)
    
    comp=[ ];
    
    % calcula correlação das matrizes 
    for n=1:qtd_letras_pre_definidas
         sem=corr2(letras_pre_definidas{1,n},img_r);
         comp=[comp sem];
    end
        
    indice=find(comp==max(comp));

    vetor_alfabeto = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O', ...
      'P','Q','R','S','T','U','V','W','X','Y','Z','1','2','3','4','5','6','7','8','9','0'];
 
    letter = vetor_alfabeto(indice);

    % Pega texto anterior e vai adicionando novas letras conforme o processamento
    texto=[texto letter];
end

%% Resultados
texto    %mostra texto na janela de comandos do matlab


