ReconhecimentoCoresFuzzy
Author
John Theo
Last Updated
11 years ago
License
Creative Commons CC BY 4.0
Abstract
UTFPR Report temaplate
\documentclass[11pt]{article}
% template
\usepackage{if69d-template}
% pacotes
\usepackage[brazil]{babel}
\usepackage[utf8]{inputenc}
\usepackage{graphicx}
\usepackage{amsthm,amsfonts,amsmath}
\usepackage[font=footnotesize,
labelfont=it,
labelformat=simple]{subcaption}
\usepackage{wrapfig}
\usepackage{lscape}
\usepackage{rotating}
\usepackage{epstopdf}
\usepackage{graphicx}
\renewcommand\thesubfigure{(\alph{subfigure})}
% capa
\instituicao{Universidade Tecnológica Federal do Paraná -- UTFPR}
\departamento{Departamento Acadêmico de Eletrônica -- DAELN}
\curso{Engenharia de Computação}
\disciplina{IF69D – Processamento Digital de Imagens}
\semestre{2013/2}
\professor{Gustavo B. Borba}
\titulo{Reconhecimento de cores utilizando Lógica Fuzzy}
\autor{John Théo Sierpinski de Souza}{938459}
\autordois{Tiago Rafael Volkmann Coelho}{889237}
\date{Mar.2014}
% começo do documento
\begin{document}
\maketitle
\section{Objetivo}
Implementar no MATLAB uma lógica fuzzy para reconhecimento de cores combinações de RGB em imagens.
\section{Fundamentação Teórica}
Definiu-se que para esse projeto utilizaria-se o mapa de cores RGB e logíca Fuzzy por permitir uma definição mais "maléavel" dos limites das níveis de vermelho, ver e azul da imagem.
\subsection{\textit{Color Maps} - mapas de cores}
\begin{figure}[h]
\begin{center}
\includegraphics[width=0.5\columnwidth]{colorMap.png}
\caption{Mapa de cores. Um i-bit na memória da imagem é usado como índice no mapa de cores. Neste endereço no mapa está um valor que é interpretado pelo \textit{hardware} como uma cor ou uma intensidade para ser mostrada.}Fonte: \cite{Sloan}
\label{fig:colorMap}
\end{center}
\end{figure}
Segundo \cite{Sloan} O mapa de cores é uma tabela que especifica a transformação dos \textit{bits} de memória da imagem e os \textit{bits} que serão apresentados no \textit{display} \ref{fig:colorMap}. A tabela é endereçada pelo valor do pixel na memória da imagem. O conteúdo em cada endereço é um conjunto de \textit{bits} que determina qual sinal será enviado ao \textit{display}.
Se a memória da imagem for do tipo \textit{single-bit plane}, existem apenas dois endereços no mapa de cores sendo um para cada pixel. Os valores do mapa de cores podem ter tamanho variado, podem ser de 24 \textit{bits} e especificar 8 \textit{bits} de intensidade para ser enviado para cada uma das três cores RGB no monitor.
\subsection{Lógica Fuzzy}
%Falar sobre lógica fuzzy. Ler file:///C:/Users/John/Downloads/1242-2947-1-SP.pdf
A lógica \textit{Fuzzy} possui o objetivo de modelar situações onde existem incertezas ou imprecisões. Segundo \cite {Ribeiro} estes casos não podem ser representados através de conjuntos binários os quais possuem apenas dois graus de pertinência, enquanto que nos conjuntos \textit{fuzzy} o elemento pode ter um grau de pertinência que vai de 0 a 1. Isto possibilita o sistema a representar os conhecimentos linguísticos, os quais representamos dizendo por exemplo, que uma fruta está quase madura, ou quando dizemos que devemos pisar no ferio de um automóvel com uma força média. A obtenção de por exemplo, qual seria o valor da força para se pisar no freio do automóvel com uma força média representa uma incerteza pois este valor pode váriar de pessoa para pessoa. Para eliminar esta imprecisão foram criados conjuntos \textit{fuzzy} e a lógica \textit{fuzzy}.
Segundo \cite{Tanscheit} a funão triangular é o modelo computacional mais simples e é ilustrado na figura \ref{fig:funcTriangular}. O grau de pertinência, ou seja, o quanto o elemento pertence ao conjunto está representado pelo eixo y e o valor da variável em questão está no eixo x. A variável terá grau de pertinência máxima ao conjunto quando ela assumir o valor 1. Além deste conjunto existem outros, como por exemplo o \textit{Singleton}.
\begin{figure}[h]
\begin{center}
\includegraphics[width=0.5\columnwidth]{funcaoTriangular1.png}
\caption{Conjunto Triangular.}Fonte: \cite{Tanscheit}
\label{fig:funcTriangular}
\end{center}
\end{figure}
Segundo \cite {Tanscheit} o sistema fuzzy possui um conjunto de regras no formato \textit{SE antecedente ENTÃO consequente}. Estas regras são utilizadas para realizar a inferência e informar um valor crisp para as variáveis de saída do sistema, ou seja, obter o valor de uma aceleração a ser aplicada por exemplo. Estas regras podem ser formadas através de um algoritmo de \textit{Wang-Mendel}. Este algoritmo possui 5 passos os quais são descritos abaixo:
\begin{enumerate}
\item Divisão dos dados de entrada e de saída de conjuntos \textit{fuzzy};
\item Geração das regras \textit{fuzzy};
\item Definição de um grau para cada regra gerada;
\item Composição da base de conhecimento;
\item Defuzzificação (previsão de valores futuros);
\end{enumerate}
Os quatro primeiros passos são responsáveis pela geração da base de conhecimento e compõem a chamada etapa de treinamento. O quinto passo realiza, a partir da base de conhecimento gerada, a previsão dos dados \cite{Ribeiro}.
\section{Implementação}
A figura~\ref{fig:diagrama_bloco} mostra como foi implementado o projeto.
\begin{figure}[!htb]
\centering
\begin{subfigure}{0.8\textwidth}
\centering
\includegraphics[width=1\textwidth]{diagrama_bloco}
\end{subfigure}
\caption{Diagrama de blocos do projeto}
\label{fig:diagrama_bloco}
\end{figure}
A seguir será descrita cada etapa do diagrama em detalhes:
\subsection{Imagem RGB}
Nesta etapa o sistema recebe uma imagem RGB para ser analisada. A imagem é guardada através das seguintes linhas de código:
\begin{verbatim}
% Carrega a imgem em um array
[rgbImage, storedColorMap] = imread(fullImageFileName);
[rows, columns, numberOfColorBands] = size(rgbImage);
\end{verbatim}
Sendo 'fullImageFileName' o caminho para a imagem que deseja-se carregar
\subsection{Seperação por banda de cor}
Nesta estapa separamamos a matriz tridimensional da imagem em 3 matrizes separadas, uma representando cada banda de cor: R(vermelho), G(verde) e B(azul). Para tanto, usa-se as seguintes linhas de código:
\begin{verbatim}
% Extriando R, G e B separadamente
rImage = rgbImage(:,:,1);
gImage = rgbImage(:,:,2);
bImage = rgbImage(:,:,3);
\end{verbatim}
A figura~\ref{fig:banda_cores} ilustra como o processo de separação por bandas de cor age na imagem. A imagem foi serparada em bandas de RGB pois o\textit{ColorMap}(mapa de cores) definido era o mapa de cores RGB.
\begin{figure}[!htb]
\centering
\begin{subfigure}{0.8\textwidth}
\centering
\includegraphics[width=1\textwidth]{banda_cores}
\end{subfigure}
\caption{Separação da imagem por banda de cores RGB}
\label{fig:banda_cores}
\end{figure}
Esse processo é importante pois é através dele que serão obtidas as entradas para a máquina de inferência Fuzzy.
\subsection{Máquina de Inferência Fuzzy}
A Máquina de Inferência Fuzzy foi desenvolvida utilizando a toolbox de Fuzzy do próprio MATLAB. Nela pode-se definir toda a lógica a ser utilizada no projeto, que envolve a criação das variáveis linguísticas, as entradas, o método de inferência e as demais características da máquina de inferência fuzzy.
Em resumo o sistema fuzzy deste projeto é um sistema Mamdani com 3 entradas e 1 saída. Cada entrada representa uma banda de cor RGB e é dotada de 3 variáveis linguísticas: "pouco", "médio" e muito" que denotam a intensidade da banda de cor em questão na imagem de entrada do sistema, são iguais no seu niverso de discurso e são do tipo triangular. A saída é composta por 8 variáveis linguísticas que representam as cores: vermelho, verde, azul, magenta, ciano, amarelo, branco e preto. Adotou-se essa abordagem de modo a dar uma semântica para a saída crisp. Para o processo de defuzzificação foi utilizado o método do centro de gravidade.
As figura~\ref{fig:config_fuzzy} representa como ficaram configuradas as entradas e a saída do sistema fuzzy.
\begin{figure}[!htb]
\centering
\begin{subfigure}{0.8\textwidth}
\centering
\includegraphics[width=0.4\textwidth]{fuzzy_input}
\caption{Configuração da entrada}
\end{subfigure}
\begin{subfigure}{0.8\textwidth}
\centering
\includegraphics[width=0.4\textwidth]{fuzzy_output}
\caption{Configuração da saída}
\end{subfigure}
\caption{Configuração sistema fuzzy}
\label{fig:config_fuzzy}
\end{figure}
Como existem 3 entradas e 3 varáveis linguísticas, isso resulta em um conjunto de 27 possíveis combinações que serão as regras da Máquina de Inferência Fuzzy. A figura~\ref{fig:regras_fuzzy} mostra como ficaram configuradas as regras.
\begin{figure}[!htb]
\centering
\begin{subfigure}{0.8\textwidth}
\centering
\includegraphics[width=1\textwidth]{regras_fuzzy}
\end{subfigure}
\caption{Regras fuzzy para reconhecimento de cores}
\label{fig:regras_fuzzy}
\end{figure}
As regras foram configuradas de modo supervisionado, ou seja, com a ajuda de uma ferramenta de paleta de cores(http://www.colorschemer.com/online.html) usou-se valores para as bandas correspondentes aos intervalos(variáveis linguísticas) correspondentes a "pouco"(valor em torno de 60), "médio"(valor em torno de 100) e "muito"(valor em torno de 200) e de acordo com as combinações possíveis foi-se verificando qual cor dentre as 8 se encaixava melhor à cor obtida e com isso gerava-se a regra. Neste passo percebeu-se que a discretização em "pouco", "médio" e "muito" não era satisfatória visto que em uma mesma combinação, duas classes de cores distintas(mas próximas) eram possíveis. Isso foi percebido ao fazer o reconhecimento de cores em imagens com varias nuances de cor.
\subsection{Tradução/Máscara}
Com base nas saídas defuzzificadas, foram sendo preenchidas 8 matrizes de imagens correspondetes a cada com os valores 1 caso fosse a cor desejda ou com 0 quando não fosse a cor desejada, na posição do pixel referente a imagem origal. Dessa forma ter-se-ia uma máscara que ao ser multiplicada à imagem original, deixaria apenas passar os pixels referentes à cor desejada. Isso foi feito com a seguinte linha de código(para o caso da máscara de cor vermelha):
\begin{verbatim}
subplot(4,3,4), imshow(rgbImage.*repmat(rImage,[1,1,3])), title('Vermelho');
\end{verbatim}
\section{Resultados e conclusões}
A primeira abordagem adotada foi utilizar apenas duas variáveis linguísticas para cada entrada("pouco" e "muito"). Essa estratégia tinha o objetivo de reduzir o número de regras fuzzy e por consequência o erro por parte de treinamento humano das mesmas. Essa abordagem se apresentou muito ruim pois havia muitas possibilidades de cores dentro de um mesmo cluster fuzzy. A figura~\ref{fig:resultado_cores1} mostra o resultado onde é possível perceber que há uma falta de classificação de cores principalmente no verde e no amarelo.
\begin{figure}[!htb]
\centering
\begin{subfigure}{1\textwidth}
\centering
\includegraphics[width=1\textwidth]{saida_peppers_cor3}
\end{subfigure}
\caption{Resultado da execução da máquina de inferência fuzzy para reconhecimento de cores utilizando apenas duas variáveis linguísticas na entrada("pouco" e "muito")}
\label{fig:resultado_cores1}
\end{figure}
Posteriormente aumentou-se o número de variáveis linguísticas para 3("pouco", "médio" e "muito) e, portanto, a quantidade de regras subiu de 8 para 27. A figura~\ref{fig:resultado_cores1} permite fazer um comparativo com a execução anterior. Neste caso já percebe-se uma boa melhora quanto à classificação/reconhecimento das cores(principalmente no verde no amarelo), mas ainda há confusões em algumas tonalidades proximas como vermelho e magenta, verde e amarelo. A classificação do azul apresenta um comportamento bem fora do esperado, mas com o tempo dedica a este projeto, não foi possível concluir a causa desse fenômeno
Como sugestões de melhorias pode-se levantar as seguintes:
\begin{itemize}
\item Usar um espaço de cores diferente de RGB, pois este não responde bem a variações de luminosidade.
\item Usar uma abordagem Neuro-Fuzzy para treinar os clusters de cores das variáveis de entrada.
\item Melhorar a modelagem fuzzy para obter uma defuzzificação mais performática bem como uma semântica melhor da utilizada para esse projeto
\end{itemize}
O projeto está disponível em: http://johntheo.github.io/PDI/
\begin{sidewaysfigure}[ht]
\makebox[\textwidth]{\includegraphics[width=1.6\paperwidth]{saida_img1_cor4}}
\caption{Resultado da execução da máquina de inferência fuzzy para reconhecimento de cores utilizando três variáveis linguísticas na entrada("pouco", "médio" e "muito")}
\label{fig:PropProf}
\end{sidewaysfigure}
\begin{sidewaysfigure}[ht]
\makebox[\textwidth]{\includegraphics[width=1.6\paperwidth]{saida_img2_cor4}}
\caption{Resultado da execução da máquina de inferência fuzzy para reconhecimento de cores utilizando três variáveis linguísticas na entrada("pouco", "médio" e "muito")}
\label{fig:PropProf}
\end{sidewaysfigure}
\begin{sidewaysfigure}[ht]
\makebox[\textwidth]{\includegraphics[width=1.6\paperwidth]{saida_img3_cor4}}
\caption{Resultado da execução da máquina de inferência fuzzy para reconhecimento de cores utilizando três variáveis linguísticas na entrada("pouco", "médio" e "muito")}
\label{fig:PropProf}
\end{sidewaysfigure}
\begin{sidewaysfigure}[ht]
\makebox[\textwidth]{\includegraphics[width=1.6\paperwidth]{saida_img4_cor4}}
\caption{Resultado da execução da máquina de inferência fuzzy para reconhecimento de cores utilizando três variáveis linguísticas na entrada("pouco", "médio" e "muito")}
\label{fig:PropProf}
\end{sidewaysfigure}
\begin{sidewaysfigure}[ht]
\makebox[\textwidth]{\includegraphics[width=1.6\paperwidth]{saida_img5_cor4}}
\caption{Resultado da execução da máquina de inferência fuzzy para reconhecimento de cores utilizando três variáveis linguísticas na entrada("pouco", "médio" e "muito")}
\label{fig:PropProf}
\end{sidewaysfigure}
\begin{sidewaysfigure}[ht]
\makebox[\textwidth]{\includegraphics[width=1.6\paperwidth]{saida_img6_cor4}}
\caption{Resultado da execução da máquina de inferência fuzzy para reconhecimento de cores utilizando três variáveis linguísticas na entrada("pouco", "médio" e "muito")}
\label{fig:PropProf}
\end{sidewaysfigure}
\begin{sidewaysfigure}[ht]
\makebox[\textwidth]{\includegraphics[width=1.6\paperwidth]{saida_img7_cor4}}
\caption{Resultado da execução da máquina de inferência fuzzy para reconhecimento de cores utilizando três variáveis linguísticas na entrada("pouco", "médio" e "muito")}
\label{fig:PropProf}
\end{sidewaysfigure}
\newpage
% Referências Bibliográficas %
% usar 'cite' %
\bibliography{bibliografia}
\bibliographystyle{plain}
\end{document}
% fim do documento