Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
0
UNIVERSIDADE FEDERAL DE MATO GROSSO
CAMPUS UNIVERSITÁRIO DO ARAGUAIA
INSTITUTO DE CIÊNCIAS EXATAS E DA TERRA CURSO DE CIÊNCIA DA COMPUTAÇÃO
DETECÇÃO AUTOMÁTICA DE ELEMENTOS DE
PROPRIEDADES RURAIS EM IMAGEM DE SATÉLITE
PARA SUPORTE A SISTEMAS DE CADASTROS RURAIS
LEONARDO ROMAS TOMAZELI
BARRA DO GARÇAS – MT
2018
1
UNIVERSIDADE FEDERAL DE MATO GROSSO
CAMPUS UNIVERSITÁRIO DO ARAGUAIA
INSTITUTO DE CIÊNCIAS EXATAS E DA TERRA CURSO DE CIÊNCIA DA COMPUTAÇÃO
DETECÇÃO AUTOMÁTICA DE ELEMENTOS DE
PROPRIEDADES RURAIS EM IMAGEM DE SATÉLITE
PARA SUPORTE A SISTEMAS DE CADASTROS RURAIS
LEONARDO ROMAS TOMAZELI
Monografia apresentada ao Instituto de Ciências
Exatas e da Terra, do Campus Universitário do
Araguaia, da Universidade Federal de Mato Grosso,
como requisito parcial para conclusão do Curso de
Graduação em Ciência da Computação.
Orientador: Prof. Dr. Ivairton Monteiro Santos
BARRA DO GARÇAS – MT
2018
2
UNIVERSIDADE FEDERAL DE MATO GROSSO
CAMPUS UNIVERSITÁRIO DO ARAGUAIA
INSTITUTO DE CIÊNCIAS EXATAS E DA TERRA CURSO DE CIÊNCIA DA COMPUTAÇÃO
DETECÇÃO AUTOMÁTICA DE ELEMENTOS DE
PROPRIEDADES RURAIS EM IMAGEM DE SATÉLITE
PARA SUPORTE A SISTEMAS DE CADASTROS RURAIS
LEONARDO ROMAS TOMAZELI
Aprovada em ___/___/___
______________________________________
Prof. Dr. Ivairton Monteiro Santos
ICET/UFMT
(Orientador)
______________________________________
Prof. Dr. Robson Silva Lopes
ICET/UFMT
(Membro)
______________________________________
Prof. Dr. Linder Cândido da Silva
ICET/UFMT
(Membro)
3
DEDICATÓRIA
Ao meu Deus, que sem ele nada seria possível.
À Minha família, que me amparou em todos os momentos da mi-
nha vida.
Ao orientador professor Ivairton, que acreditou até quando eu
não acreditava mais.
Aos meus amigos da faculdade, do GF Universitário, do Coral
UFMT e dos colegas formandos que sempre me deram uma força.
4
RESUMO
Atualmente ganhou força e destaque uma preocupação constante em relação ao meio
ambiente e os impactos que o ser humano causa. No Brasil, um importante fruto de
movimentos ambientalistas foi a consolidação do Código Florestal Brasileiro uma lei
que rege e controla tudo acerca do meio ambiente no país. Este passou por algumas
alterações ao longo de sua história, sendo que a última grande mudança foi a
instauração do Novo Código Florestal Brasileiro de 2012, que dentre as novidades, foi
criado um sistema único de cadastro de propriedades rurais chamado Cadastro
Ambiental Rural (CAR), que também auxilia na fiscalização ambiental. No entanto, os
órgãos fiscalizadores têm dificuldade em conseguir monitorar as ações dos proprietários
ao longo do tempo, especialmente as zonas de proteção. Este trabalho visa desenvolver
uma ferramenta computacional de suporte ao CAR, para verificação automática de
zonas de proteção, por meio de processamento de imagens de satélite, executando
segmentação e detecção automática das áreas de interesse. Foi testado e definido as
melhores disposições de parâmetros dos testes das funções usadas para separação dos
elementos das imagens de propriedades rurais.
PALAVRAS-CHAVE: Segmentação de Imagens, Processamento de Imagens, Cadastro
Ambiental Rural, Código Florestal, Imagem de Satélite
5
ABSTRACT
In the last century, many questions have been raised about the concern about the
environment and the impacts that the human being causes. Many environmental
movements have emerged to protect and control the ecosystem in which we live. In
Brazil, one of the results of these movements was the consolidation of a code that
governs and controls everything about the environment, denominated Brazilian Forest
Code. This has undergone some changes throughout its history, and the last great change
was the introduction of the New Forest Code of 2012, which among the novelties, a
unique system of land register was created called Rural Environmental Register, which
also assists in environmental monitoring, but far from being able to monitor the actions
of the owners over time on the protection zones. This project aims to develop an image
processing algorithm that segments satellite images and returns these images, with their
separated and tagged elements, to be used in a tool that automatically verifies if the
protection zones are in agreement with the Brazilian Forest Code, for the purpose of
assisting Rural Environmental Register.
KEYWORDS: Image Segmentation, Image Processing, Environmental Register, Forest
Code, Satellite Image
6
LISTA DE FIGURAS
Figura 1: Fluxo padrão de Processamento e Análise Digital de Imagens ........................ 9
Figura 2: Exemplo de máscara 5x5 com desvio padrão: 1 Fonte:
https://homepages.inf.ed.ac.uk/rbf/HIPR2/gsmooth.htm ............................................... 12
Figura 3: Diferentes imagens contendo segmentos após o uso do SLIC. Quanto maior a
quantidade de superpixels, menor o tamanho de cada superpixel. Fonte:
https://filebox.ece.vt.edu/~jbhuang/teaching/ece5554-4554/fa16/hw4.html ................. 16
Figura 4: Representação básica de um histograma Fonte:
https://www.citisystems.com.br/histograma/ .................................................................. 16
Figura 5: Imagem obtida pelo SLIC, convencionada como dificuldade Fácil. .............. 27
Figura 6: Imagem obtida pelo SLIC convencionada como dificuldade Média. ............. 27
Figura 7: Imagem obtida pelo SLIC convencionada como dificuldade Difícil. ............. 28
Figura 8: Imagem gerada pelo SLIC, classificada como média, após a união de
segmentos usando histograma com os parâmetros: Folga do Histograma: 0,2 Tamanho
do Histograma: 5 Erro de Colunas:0,0. .......................................................................... 29
Figura 9: Imagem gerada pelo SLIC, classificada como média, após o algoritmo de
união por histograma com os parâmetros: Folga do Histograma: 0,5 Tamanho do
Histograma: 5 Erro de Colunas:0,0. ............................................................................... 30
Figura 10: Imagem gerada pelo SLIC, classificada como média, com o algoritmo de
união por histograma com os parâmetros: Folga do Histograma: 0,9 Tamanho do
Histograma: 5 Erro de Colunas: 0,0. .............................................................................. 30
Figura 11: Imagem obtida pelo SLIC, classificada como média, com o algoritmo de
união por histogramas com os parâmetros: Folga do Histograma: 0,8 Tamanho do
Histograma:10 Erro de Colunas:0,0. .............................................................................. 31
Figura 12: Imagem obtida pelo SLIC, classificada como média, com o algoritmo de
união por histogramas com os parâmetros: Folga do Histograma: 0,8 Tamanho do
Histograma: 256 Erro de Colunas: 0,0. .......................................................................... 32
Figura 13: Imagem gerada pelo SLIC, classificada como média, com o algoritmo de
união por histogramas com os parâmetros: Folga do Histograma: 0,8 Tamanho do
Histograma: 5 Erro de Colunas: 0,1. .............................................................................. 33
Figura 14: Imagem gerada pelo SLIC, classificada como média, com o algoritmo de
união por histogramas com os parâmetros: Folga do Histograma: 0,8 Tamanho do
Histograma:5 Erro de Colunas:0,2. ................................................................................ 33
Figura 15: Imagem gerada pelo SLIC, classificada como média, após a execução do
algoritmo de união por média com o parâmetro Folga da Media igual a 0,02. .............. 35
Figura 16: Imagem gerada pelo SLIC, classificada como difícil, após a execução do
algoritmo de união por média com o parâmetro Folga da Media igual a 0,02 ............... 35
Figura 17: Imagem gerada pelo SLIC, classificada como média, após execução do
algoritmo de união por média com o parâmetro Folga da Media igual a 0,05. .............. 35
Figura 18: Imagem gerada pelo SLIC, classificada como difícil, após a execução do
algoritmo de união por média com o parâmetro Folga da Media igual a 0,05 ............... 36
7
Figura 19: Imagem gerada pelo SLIC, classificada como média, após a execução do
algoritmo de união por média com o parâmetro Folga da Media igual a 0,2. ................ 36
Figura 20: Imagem gerada pelo SLIC, classificada como difícil, após a execução do
algoritmo de união por média com o parâmetro Folga da Media igual a 0,2. ................ 37
Figura 21: Imagem convencionada como dificuldade média, junto aos segmentos
gerados pelo SLIC com o algoritmo de união por histogramas com a média com os
parâmetros: Folga do Histograma: 0,5 Tamanho do Histograma: 5 Erro de Colunas: 0,0
Folga da Média: 0,2 ........................................................................................................ 39
Figura 22: Imagem convencionada como dificuldade média, junto aos segmentos
gerados pelo SLIC com o algoritmo de união por histogramas com a média com os
parâmetros: Folga do Histograma: 0,5 Tamanho do Histograma: 10 Erro de Colunas: 0,0
Folga da Média: 0,2 ........................................................................................................ 39
Figura 23: Imagem convencionada como dificuldade média, junto aos segmentos
gerados pelo SLIC com o algoritmo de união por histogramas com a média com os
parâmetros: Folga do Histograma: 0,5 Tamanho do Histograma: 5 Erro de Colunas: 0,1
Folga da Média: 0,2 ........................................................................................................ 39
Figura 24: Imagem convencionada como dificuldade difícil, junto aos segmentos
gerados pelo SLIC com o algoritmo de união por histogramas com a média com os
parâmetros: Folga do Histograma: 0,5 Tamanho do Histograma: 5 Erro de Colunas: 0,0
Folga da Média: 0,2 ........................................................................................................ 40
Figura 25: Imagem convencionada como dificuldade fácil, junto aos segmentos gerados
pelo SLIC com o algoritmo de união por histogramas com a média com os parâmetros:
Folga do Histograma: 0,5 Tamanho do Histograma: 5 Erro de Colunas: 0,0 Folga da
Média: 0,2 ....................................................................................................................... 40
Figura 26: Imagem convencionada como dificuldade média, junto aos segmentos
gerados pelo SLIC com o algoritmo de união por histogramas com os parâmetros: Folga
do Histograma: 0,5 Tamanho do Histograma: 5 Erro de Colunas: 0,02 Folga da Média:
0,02 ................................................................................................................................. 41
Figura 27: Imagem convencionada como dificuldade média, junto aos segmentos
gerados pelo SLIC com o algoritmo de união por histogramas com a média com os
parâmetros: Folga do Histograma: 0,5 Tamanho do Histograma: 10 Erro de Colunas: 0,0
Folga da Média: 0,02 ...................................................................................................... 41
Figura 28: Imagem convencionada como dificuldade fácil, junto aos segmentos gerados
pelo SLIC com o algoritmo de união por histogramas com a média com os parâmetros:
Folga do Histograma: 0,5 Tamanho do Histograma: 5 Erro de Colunas: 0,0 Folga da
Média: 0,02 ..................................................................................................................... 42
Figura 29: Imagem convencionada como dificuldade difícil, junto aos segmentos
gerados pelo SLIC com o algoritmo de união por histogramas com a média com os
parâmetros: Folga do Histograma: 0,5 Tamanho do Histograma: 5 Erro de Colunas: 0,0
Folga da Média: 0,02 ...................................................................................................... 42
Figura 30: Imagem convencionada como dificuldade fácil, junto aos segmentos gerados
pelo SLIC com o algoritmo de união por histogramas com a média com os parâmetros:
Folga do Histograma: 0,8 Tamanho do Histograma: 10 Erro de Colunas: 0,1 Folga da
Média: 0,05 ..................................................................................................................... 43
Figura 31: Imagem convencionada como dificuldade média, junto aos segmentos
8
gerados pelo SLIC com o algoritmo de união por histogramas com a média com os
parâmetros: Folga do Histograma: 0,8 Tamanho do Histograma: 10 Erro de Colunas: 0,1
Folga da Média: 0,05 ...................................................................................................... 44
Figura 32: Imagem convencionada como dificuldade difícil, junto aos segmentos
gerados pelo SLIC com o algoritmo de união por histogramas com a média com os
parâmetros: Folga do Histograma: 0,8 Tamanho do Histograma: 10 Erro de Colunas: 0,1
Folga da Média: 0,05 ...................................................................................................... 44
Figura 33: Imagem convencionada como dificuldade fácil, junto aos segmentos gerados
pelo SLIC com o algoritmo de união por histogramas com a média com os parâmetros:
Folga do Histograma: 0,8 Tamanho do Histograma: 5 Erro de Colunas: 0,0 Folga da
Média: 0,15 ..................................................................................................................... 45
Figura 34: Imagem convencionada como dificuldade fácil, junto aos segmentos gerados
pelo SLIC com o algoritmo de união por histogramas com a média com os parâmetros:
Folga do Histograma: 0,8 Tamanho do Histograma: 5 Erro de Colunas: 0,0 Folga da
Média: 0,2 ....................................................................................................................... 45
Figura 35: Imagem convencionada como dificuldade média, junto aos segmentos
gerados pelo SLIC com o algoritmo de união por histogramas com a média com os
parâmetros: Folga do Histograma: 0,8 Tamanho do Histograma:10 Erro de Colunas: 0,1
Folga da Média: 0,05 ...................................................................................................... 46
Figura 36: Imagem convencionada como dificuldade média, junto aos segmentos
gerados pelo SLIC com o algoritmo de união por histogramas com a média com os
parâmetros: Folga do Histograma: 0,8 Tamanho do Histograma: 10 Erro de Colunas: 0,1
Folga da Média: 0,1 ........................................................................................................ 46
Figura 37: Imagem convencionada como dificuldade difícil, junto aos segmentos
gerados pelo SLIC com o algoritmo de união por histogramas com a média com os
parâmetros: Folga do Histograma: 0,5 Tamanho do Histograma: 5 Erro de Colunas: 0,0
Folga da Média: 0,02 ...................................................................................................... 47
Figura 38: Imagem convencionada como dificuldade difícil, junto aos segmentos
gerados pelo SLIC com o algoritmo de união por histogramas com a média com os
parâmetros: Folga do Histograma: 0,5 Tamanho do Histograma: 5 Erro de Colunas: 0,0
Folga da Média: 0,05 ...................................................................................................... 47
9
LISTA DE TABELAS
Tabela 1: Comparação entre algoritmos de segmentação de imagens FONTE: Autor
10
LISTA DE ABREVIATURAS E SIGLAS
ADI – Análise Digital de Imagens
APP – Área de Preservação Permanente
CAR – Cadastro Ambiental Rural
DFT – Discrete Fourier Transform
RL – Reserva Legal
FFT – Fast Fourier Transform
PADI - Processamento e Análise Digital de Imagens
PDI – Processamento Digital de Imagens
Pixel – Picture Element
PNMA – Política Nacional do Meio Ambiente
RGB – Red-Green-Blue
SLIC – Simple Linear Iterative Clustering
VHLL – Very High Level Language
1
SUMÁRIO
1 INTRODUÇÃO ........................................................................................................................................ 2
2 REFERENCIAL TEÓRICO ......................................................................................................................... 4
2.1 CÓDIGO FLORESTAL BRASILEIRO ................................................................................................. 4
2.2 IMAGENS DIGITAIS E FUNDAMENTOS DE PROCESSAMENTO DE IMAGENS ................................ 7
2.2.1 ALGORITMOS DE DETECÇÃO DE BORDA ............................................................................... 10
2.2.2 ALGORITMOS DE SUAVIZAÇÃO ............................................................................................. 11
2.2.3 ALGORITMOS DE SEGMENTAÇÃO DE IMAGENS ................................................................... 13
2.2.4 HISTOGRAMA ........................................................................................................................ 16
2.3 LINGUAGEM DE PROGRAMAÇÃO PYTHON E BIBLIOTECAS DE PROCESSAMENTO DE IMAGENS 17
3 METODOLOGIA ................................................................................................................................... 18
3.1 TRABALHOS CORRELACIONADOS .............................................................................................. 19
3.2 DESENVOLVIMENTO .................................................................................................................. 19
3.2.1 COLETA DE IMAGENS PARA TESTES ...................................................................................... 20
3.2.2 DETECÇÃO DE BORDAS E FILTRAGEM ................................................................................... 20
3.2.3 SEGMENTAÇÃO DE IMAGENS ............................................................................................... 21
3.2.4 DESENVOLVIMENTO DO CÓDIGO ......................................................................................... 23
4 RESULTADOS E DISCUSSÕES................................................................................................................ 26
4.1 IMAGENS GERADAS PELO SLIC .................................................................................................. 26
4.2 UNIÃO DE SEGMENTOS A PARTIR DO HISTOGRAMA ................................................................ 28
4.2.1 PARÂMETRO DE FOLGA DO HISTOGRAMA ........................................................................... 28
4.2.2 PARÂMETRO DE TAMANHO DO HISTOGRAMA ..................................................................... 31
4.2.3 PARÂMETRO DE ERRO DE COLUNAS ..................................................................................... 32
4.2.4 CONSIDERAÇÕES A RESPEITO DO ALGORITMO DE UNIÃO POR HISTOGRAMA .................... 33
4.3 UNIÃO DE SEGMENTOS A PARTIR DA MÉDIA DA ESCALA DE CINZA ......................................... 34
4.3.1 CONSIDERAÇÕES QUANTO AO ALGORITMO DE UNIÃO POR MÉDIA .................................... 37
4.4 UNIÃO DE SEGMENTOS A PARTIR DO HISTOGRAMA E MÉDIA DA ESCALA DE CINZA ............... 37
4.4.1 FOLGA DA MÉDIA .................................................................................................................. 38
4.5 COMPLEXIDADE DO ALGORITMO E TEMPO DE PROCESSAMENTO .......................................... 48
5 CONCLUSÕES ...................................................................................................................................... 49
5.1 TRABALHOS FUTUROS ............................................................................................................... 49
6 BIBLIOGRAFIA ..................................................................................................................................... 51
7 ANEXO A ............................................................................................................................................. 53
2
1 INTRODUÇÃO
O incessante crescimento e desenvolvimento da humanidade impõem ao mundo
constantes transformações, decorrentes da dinâmica dos indivíduos na busca de
modificar o meio2 de acordo com as suas necessidades e extrair da natureza o máximo
que ela lhes pode ofertar. Historicamente o homem pouco se importou com a
preservação da natureza, mundo afora as populações extinguiram suas faunas,
reduziram suas floras e contaminaram suas fontes hídricas em função do desejo de
acumular riquezas.
Essa situação deve-se em boa parte à revolução industrial, onde os países mais
industrializados impuseram uma divisão internacional do trabalho, dando aos menos
desenvolvidos e dependentes economicamente o dever de supri-los de matérias-primas
para alimentar suas indústrias. Assim como a maioria dos países subdesenvolvidos, o
Brasil figura nessa divisão como um fornecedor de matéria-prima, função que exerce
desde os tempos coloniais.
Com o aumento populacional o país passou a diversificar e intensificar sua
produção e por consequência a exploração dos recursos naturais, de onde resultou num
certo enriquecimento e desenvolvimento, possibilitando a nação alcançar o estágio
atual. Contudo o desenvolvimento fundado na exploração cada vez mais intensa e
mecanizada deu lugar à degradação, poluição e a desertificação em muitos lugares do
país, fenômenos replicados em diversas regiões do planeta, cuja severidade fez com que
autoridades mundiais tomassem a iniciativa de combatê-los.
Na Constituição Federal brasileira há várias iniciativas governamentais visando
dar efetividade aos dispositivos constitucionais concernentes à proteção do meio
ambiente. Na seara legislativa ocorreu uma verdadeira reformulação, seja com a
aprovação de novas leis tutelando bens naturais específicos, seja atualizando normas já
existentes, como por exemplo, o antigo Código Florestal de 1965 que deu lugar a Lei N.
12.651, de 2012, instituindo o novo Código Florestal.
O novo Código Florestal inovou no desenvolvimento de um sistema único para
cadastramento de propriedades rurais, denominado Cadastro Ambiental Rural (CAR),
impondo aos proprietários a regularização no quesito ambiental.
Tal imposição visa atender o que é expresso no caput do Art. 225 da Constituição,
que diz “Todos tem direito ao meio ambiente ecologicamente equilibrado, bem de uso
comum do povo e essencial à sadia qualidade de vida, impondo-se, ao poder público e
3
à coletividade o dever de defendê-lo e preservá-lo para o presente e futuras gerações”.
Porém, somente a inscrição no CAR não é suficiente para garantir que os
proprietários não venham degradar o meio ambiente após a regularização. É necessária
uma fiscalização contínua, e é nesta fiscalização e controle que há maior carência de
recursos para atender com máxima eficácia e eficiência.
Levando em consideração esse contexto, neste trabalho foram levantadas algumas
indagações: é possível a construção de uma ferramenta capaz de auxiliar os
instrumentos de fiscalização já existentes, de maneira automatizada, utilizando imagens
aéreas (especialmente de satélite)? Como essa ferramenta irá definir qual elemento está
contido na imagem, ou seja, como diferenciar mata de rio, ou mata de pasto, sendo que
há vários padrões distintos de cores de cada elemento dependendo da imagem?
Nesse sentido o presente trabalho tem como objetivo desenvolver e definir um
meio de separar regiões em uma imagem aérea de modo que cada elemento da imagem
(mata, pastagem, rios, lagos) tenha seu próprio segmento (único e indivisível) para
possibilitar a análise e identificação automática de cada elemento.
A partir do desenvolvimento de uma proposta de sistema e com os testes
realizados ficou evidente que é um desafio conseguir separar com qualidade os
diferentes elementos de uma imagem aérea, e que para uma completa segmentação
ainda é necessário a supervisão de um especialista. Ainda assim, a automação alcançada
representou um avanço no processo manual feito atualmente, o que pode representar
uma otimização considerável e um ganho relevante (sobretudo de tempo) no processo
de fiscalização.
Este trabalho abordará o embasamento teórico referente aos dispositivos
presentes no Código Florestal Brasileiro, ferramentas estudadas e utilizadas, os
algoritmos de processamento de imagens estudados e testados, as funções e os métodos
de calibragem dos parâmetros das funções utilizadas e os resultados obtidos.
4
2 REFERENCIAL TEÓRICO
Este capítulo irá tratar dos principais conceitos e elementos utilizados no
desenvolvimento deste trabalho.
2.1 CÓDIGO FLORESTAL BRASILEIRO
A história da legislação ambiental no Brasil é mais antiga do que a criação do
primeiro código florestal. Segundo (Carvalho, et al., 2018) os antecedentes da legislação
ambiental derivam dos povos nativos, que associavam a derrubada de florestas a algum
tipo de sentimento religioso profundo.
Ainda segundo (Carvalho, et al., 2018), após as chegadas dos Portugueses,
trouxeram consigo de Portugal suas legislações, inclusive as com enfoque ambiental.
Porém a realidade que Portugal vivia era de escassez de recursos florestais, enquanto no
Brasil esses recursos eram abundantes, portanto, as leis não funcionavam da mesma
forma no Brasil, mas por outro lado, eram importantes para salvaguardar as “madeiras
de lei”, como por exemplo, o pau-brasil.
Em 1934, mediante Decreto Nº 23.793/1934, foi criado o primeiro Código
Florestal Brasileiro, que dentre outros pontos, destacou-se o estabelecimento de
conceitos como Florestas Protetoras (matas que têm algumas das seguintes finalidades:
conservar regime de água, evitar erosões, fixar dunas, etc).
Segundo (Praes, 2012), a partir da década de 60, com a eclosão dos movimentos
ambientais e a preocupação com o possível esgotamento de recursos para as futuras
gerações fez-se necessária a revisão do Código Florestal de 1934.
Em 15 de setembro de 1965, foi editada a Lei Federal Nº 4.771, revogando o
Decreto Federal Nº 23.793/1934. De acordo com (Spavorek, et al., 2011), o Código
Florestal de 1965 aplica-se a propriedades privadas. Ou seja, o proprietário rural deve
reservar parte da sua terra, destinando-a a manutenção da vegetação natural, sendo esta
realizada, principalmente, por meio de dois estatutos: Áreas de Preservação Permanente
(APP’s) e Reserva Legal (RL). Sendo que, os proprietários que não estiverem
cumprindo as determinações previstas para as APP’s e RL, segundo o código (Lei N.
4.771), terão que recompor as áreas que foram desmatadas.
5
De acordo com a definição proposta por (SEBRAE, 2017)
Áreas de Preservação Permanente são áreas protegidas, cobertas
ou não por vegetação nativa, com a função ambiental de
preservar as margens dos rios, nascentes e lagoas, a paisagem, a
estabilidade geológica e a biodiversidade, proteger o solo e
assegurar o bem-estar das populações humanas (SEBRAE,
2017).
Como exemplo, podemos citar as faixas marginais de qualquer curso de água
natural; as áreas no entorno dos lagos e lagoas naturais, reservatórios e nascentes; as
restingas; os manguezais e áreas com altitude superior a 1.800 m.
Já a Reserva Legal consiste (SEBRAE, 2017):
É a área localizada no interior de uma propriedade ou posse
rural que deve ter a vegetação nativa preservada com função de
assegurar o uso econômico sustentável dos recursos naturais do
imóvel rural, auxiliar a conservação e a reabilitação dos
processos ecológicos e promover a conservação da
biodiversidade, bem como o abrigo e a proteção da fauna
silvestre e da flora nativas (SEBRAE, 2017).
Na RL só é permitido uso restrito, que deve ser autorizado pelo órgão ambiental.
O tamanho da RL varia em função da região e do bioma. Se localizado na Amazônia
Legal, deve observar limites:
• Preservação de 80% do imóvel situado em área de floresta;
• Preservação de 35% do imóvel situado em área de cerrado;
• Preservação de 20% do imóvel situado em área de campos gerais.
Se localizado nas demais regiões do país:
• Preservação de 20% do imóvel.
O Código Florestal de 1965 seguiu vigente por mais de 40 anos e em 25 de maio
de 2011, foi aprovado um novo pedido de revisão do código. Proposta esta, muito
criticada por ambientalistas e pela comunidade científica com o argumento de ser uma
proposta voltada exclusivamente aos interesses dos ruralistas.
Essa proposta foi analisada e aprovada no dia 25 de abril de 2012. Das principais
edições houve a manutenção da porcentagem de reserva legal de acordo com o bioma,
houve redução nos limites protegidos das APP’s (Áreas de Preservação Permanente),
6
como por exemplo, nas faixas de leito de rio (Considerando um rio de 10 metros de
largura, o limite anterior era de 30 m de mata protegida, agora são 15 m).
Dentre as novidades neste novo Código Florestal, é destacável a implementação
do CAR, que é um registro nacional obrigatório online das propriedades rurais, com o
intuito do governo conseguir gerir a utilização e ocupação do solo, bem como analisar
os fatores ambientais.
Segundo (SEBRAE, 2017):
O Cadastro Ambiental Rural (CAR) é o registro público
eletrônico das informações ambientais dos imóveis rurais com
objetivo de viabilizar controle, monitoramento ambiental,
facilitação dos processos de licenciamento, gestão integrada dos
territórios e acompanhamento dos ativos ambientais das
propriedades. (SEBRAE, 2017)
O cadastro é realizado por intermédio de um sistema eletrônico que identifica
imagens aéreas georreferenciadas dos imóveis rurais e delimita as zonas de proteção,
como as APP’s e as reservas florestais.
Segundo (SEBRAE, 2017) os principais benefícios aos proprietários em utilizar
o CAR são:
• Garantir a preservação da vegetação nativa existente na propriedade rural e o
reaproveitamento de nutrientes no solo;
• Propiciar que a fauna e a flora tenham condições de equilibrar a região onde
estiver localizado;
• Possibilitar uma espécie de “radiografia” das áreas rurais, com o
levantamento de múltiplos indicadores ambientais e de outras informações
para benefício do próprio produtor rural e para a governança socioambiental
dos imóveis de uma determinada região;
• Facilitar acesso ao crédito agrícola e a outros programas do governo que
garantam o pagamento por desempenho, compensação pelas medidas de
conservação, incentivos para a comercialização agrícola e para a inovação,
etc.;
• Possibilitar a comercialização de Cotas de Reserva Ambiental e uma
remuneração ao produtor que optou por deixar uma maior área para
7
conservação de vegetação nativa daquela exigida na legislação (tanto para as
APPS, como para as RLs).
A inscrição pode ser feita diretamente pelo site do CAR ou nos sites dos órgãos
estaduais ambientais.
2.2 IMAGENS DIGITAIS E FUNDAMENTOS DE
PROCESSAMENTO DE IMAGENS
Uma imagem pode ser definida como uma função f(x,y), onde f representa a
intensidade (brilho) ou o nível de cinza em um ponto, denotado pelas coordenadas
espaciais x e y (Gonzalez, et al., 2007).
Em seu modelo computacional, a imagem deve passar por uma conversão para um
formato discreto denominada de digitalização, que envolve duas etapas, a amostragem e
a quantização. A amostragem é o número de pixels em x e y da imagem que gera uma
matriz bidimensional M x N. A quantização consiste em escolher o nível de cinza de
cada pixel da imagem representado por um valor inteiro L em uma imagem
monocromática. Normalmente esse valor é uma potência de 2, onde L é o número de
níveis de cinza e p é a profundidade da imagem. A associação desse valor ao pixel
respeita a escolha do intervalo [Lmin, Lmax] denominado de escala de cinza. (Bueno,
2016)
O Processamento Digital de Imagens (PDI) é um conjunto de formas de
processamento de dados em que tanto a entrada quanto a saída envolvem imagens
digitais. As técnicas ou formas de processamento de imagens são baseadas
principalmente em abstrações na forma em que o olho humano processa uma imagem.
PDI é uma área em constante desenvolvimento, pois ele serve de base para várias
áreas que estão em intenso desenvolvimento nos últimos tempos, como redes neurais,
compressão de imagens, reconhecimento de imagens médicas, espaciais, marinhas,
reconhecimento de padrões, entre outras.
Os elementos e conceitos essenciais quando se trata de imagens digitais são:
• Pixel: ou Picture Element, é o menor ponto de uma imagem digital, utilizado como
unidade básica de medida.
8
• Escala de Cinza: é uma representação numérica da intensidade de um pixel, que
pode assumir valores entre 0 de 255. Quanto mais próximo de 0, mais o pixel
tenderá à cor preta e quanto mais próximo de 255, mais tenderá à cor branca.
• RGB (Red-Green-Blue): em uma imagem colorida digital, cada pixel é composto
por um sistema aditivo de 3 cores (Vermelho, Verde e Azul), sendo que cada um
desses espectros de cores são capazes de assumir valores entre 0 e 255,
representando tonalidades diferentes, variando do mais escuro (próximo a 0) ao
mais claro (próximo de 255). Combinando os 3 pontos, é possível definir cerca de
16,7 milhões de cores diferentes.
• Resolução: define o nível de detalhe que uma imagem digital possui. Quanto maior
a quantidade de pixels em uma imagem, maior sua resolução e maior o nível de
detalhe. A resolução geralmente é medida como uma contagem de números de
pixels na largura e na altura da imagem, por exemplo: 600 x 400 (600 pixels de
largura por 400 pixels de altura).
Segundo (Augusto, 2012), a área de processamento de imagens pode ser
entendida como o conjunto de duas técnicas: Processamento Digital de Imagens (PDI),
que consiste no preparo da imagem para posteriores análises, em que são realizadas
operações matemáticas que alteram os valores dos pixels; e Análise Digital de Imagens
(ADI), que compreende a análise quantitativa do processo a partir da qual as regiões,
partículas e objetos identificados na imagem são medidos. A junção das duas técnicas é
denominada Processamento e Análise Digital de Imagens (PADI).
A Figura 1 apresenta um fluxograma que exemplifica o passo-a-passo de um
típico PADI.
9
Figura 1: Fluxo padrão de Processamento e Análise Digital de Imagens
O primeiro procedimento é a formação e aquisição das imagens e logo após isso,
utiliza-se um pré-processamento (se necessário) para melhorar a imagem para as
próximas etapas, como conversões para escala de cinza ou eliminação de ruído.
Após isso vem a segmentação das imagens, para separar os objetos de interesse.
Muitas vezes somente a segmentação de imagens não é o suficiente para separar
adequadamente os objetos de interesse, portanto, geralmente se utiliza uma etapa de pós
processamento para correção de falhas.
Indo para a fase onde se trabalha com os dados, o procedimento seguinte é a
extração de atributos para ter dados que possam, de alguma forma, discriminar os
objetos que foram segmentados.
O último procedimento do fluxograma é a classificação dos atributos extraídos e,
a partir da classificação, reconhecer padrões a fim de transformar esses dados em
informações a serem trabalhadas.
Segundo (Gomes, 2001) apud (Augusto, 2012):
As setas ao lado do fluxograma indicam os níveis com que se
trabalha em cada etapa. No pré-processamento e na
segmentação, as operações são feitas nos pixels das imagens,
resultando em imagens com objetos ou regiões de pixels
contíguos de valores iguais. As medidas para a geração de dados
são feitas na extração de atributos e estas medidas são utilizadas
10
no fim do processo, na etapa de reconhecimento de padrões e
classificação, de forma a obter dados mais complexos. Do pré-
processamento ao pós-processamento a análise é considerada
qualitativa e a partir da extração de atributos, quantitativa.
(Gomes, 2001) apud (Augusto, 2012)
Nas Subseções seguintes são apresentados e discutidos alguns tipos de
algoritmos de processamento de imagens, utilizados neste trabalho.
2.2.1 ALGORITMOS DE DETECÇÃO DE BORDA
A detecção de borda é uma técnica de processamento de imagens que consiste
em identificar e determinar pontos em uma imagem onde há mudanças repentinas de
intensidade luminosa, pois essas mudanças podem indicar que há características únicas
no objeto presente na imagem. Portanto, a área de detecção de bordas é muito utilizada
em extração de características de uma imagem, que por sua vez são usadas em
procedimentos como análise de imagens e reconhecimento de padrões.
Os principais algoritmos de detecção de borda são: Canny, Prewitt, Roberts e
Sobel (Walt, et al., 2014). A título de exemplo, será explanado o algoritmo Canny.
O algoritmo Canny foi desenvolvido por John F. Carrey em 1986 em sua Tese de
doutorado e apresentado no artigo “A Computacional Approach to Edge Detection”
(Canny, 1986). O filtro de Canny é um filtro de convolução que utiliza da primeira
derivada. Ele suaviza o ruído e localiza as bordas, combinando um operador diferencial
com um filtro Gaussiano.
Este algoritmo foi baseado em uma teoria sobre o detector de bordas ótimo,
idealizado pelo próprio Carrey em sua tese, em que um detector de bordas ótimo deveria
respeitar os seguintes parâmetros:
Boa Detecção - O algoritmo deve ser capaz de identificar todas as bordas
possíveis na imagem.
Boa Localização - As bordas encontradas devem estar o mais próximo
possível das bordas da imagem original.
Resposta Mínima - Cada borda da imagem deve ser marcada apenas
uma vez. O ruído da imagem não deve criar falsas bordas.
Para satisfazer tais condições Canny utilizou um cálculo de variações, visando en-
contrar uma função que aperfeiçoasse os valores desejados. A função ideal para o detec-
11
tor de Canny é descrito pela soma de quatro termos de exponenciais, que pode ser apro-
ximada pela primeira derivada de uma gaussiana.
O algoritmo Canny geralmente traz bons resultados ao separar e suavizar (elimi-
nar ruídos) em problemas em que se busca ressaltar algum objeto ou elemento da ima-
gem em relação ao plano de fundo.
2.2.2 ALGORITMOS DE SUAVIZAÇÃO
Os filtros de suavização, segundo (Gonzalez, et al., 2007), são aqueles que utili-
zam um algoritmo com uma função para realizar o procedimento de suavização, e são
utilizados para borramentos e redução de ruídos. O borramento é aplicado em tarefas de
pré-processamento, como a remoção de pequenos detalhes da imagem antes da extração
de objetos e conexão de pequenas descontinuidades em linhas ou curvas.
Ruídos são quaisquer tipos de informações indesejáveis nas imagens. Eles podem
ser causados por vários fatores, como a variação de brilho ou problemas na transmissão.
Assim existe a necessidade de se tratar as imagens para então conseguir extrair as in-
formações mais relevantes, de acordo com a finalidade. A redução de ruídos pode ser
obtida pelo borramento com um filtro linear e também pela filtragem não-linear.
Existem dois tipos de filtragem de imagem: Filtragem no Domínio do Espaço e
Filtragem no Domínio da Frequência. A Filtragem no Domínio do Espaço consiste em
manipular os valores de uma vizinhança para modificar a imagem diretamente. Os tipos
de filtros no Domínio do Espaço podem se dividir em: Filtros Lineares, que fazem o
processo de realce, suavização e minimizam ruídos sem alterar o nível médio de escala
de cinza; e Filtros Não-Lineares, que fazem os mesmos processos sem se preocupar em
manter o nível de cinza.
A Filtragem no Domínio da Frequência realiza uma transformação para mudar a
representação dos dados para o domínio da frequência, utilizando por exemplo o FFT
(Fast Fourier Transform) ou o DFT (Discrete Fourier Transform), este sempre usado
para sinais digitalizados. Nesse tipo de abordagem, os filtros mais conhecidos são o
Filtro de Passa Baixa, que consiste em diminuir altas frequências (como bordas e ruí-
dos) causando um efeito de borramento na imagem; e o Filtro de Passa Alta que faz jus-
tamente o contrário, aumentando a frequência em locais de baixa frequência sem afetar
as de alta frequência, fazendo com que essas zonas sejam mais aguçadas.
12
Alguns dos principais algoritmos de suavização são: Filtro Gaussiano, Filtro da
Mediana e Filtro de Sobel (Gonzalez, et al., 2007). Aqui será destacado o Filtro Gaussi-
ano, pois ele é utilizado no algoritmo de segmentação empregado neste trabalho.
O Filtro Gaussiano é baseado na curva de Gauss, muito utilizada na área
estatística. De acordo com (Alves, 2007), o Filtro Gaussiano também é muito utilizado
para suavização de imagens, com a diferença de não preservar as arestas uma vez que
não considera a diferença das intensidades. Ele possui dois parâmetros, a dimensão da
janela e um valor para o desvio padrão sigma. Seu comportamento é similar ao filtro
passa-baixa, isto é, suavização de imagens. O quanto à imagem será suavizada está
relacionado ao desvio padrão sigma, isto é, quanto maior o sigma, mais a imagem é
suavizada. Quanto maior o sigma, maior o número de pixels cujo valor é diferente de
zero, o que leva os pixels vizinhos a terem maior influência em cada ponto, realizando
uma suavização maior na imagem. Neste filtro, assim como em outros, a suavização da
imagem é realizada através da substituição de cada pixel pela média ponderada dos
pixels vizinhos. Porém, o filtro Gaussiano funciona de forma que o peso dado a um
vizinho decresce monotonamente com a distância do pixel central. O custo
computacional requerido por um filtro Gaussiano é relativo ao tamanho da máscara. Um
exemplo de uma máscara utilizada no filtro gaussiano está presente na Figura 2.
Figura 2: Exemplo de máscara 5x5 com desvio padrão: 1 Fonte:
https://homepages.inf.ed.ac.uk/rbf/HIPR2/gsmooth.htm
13
2.2.3 ALGORITMOS DE SEGMENTAÇÃO DE IMAGENS
Baseado em (Chipana, et al., 2012), segmentação de imagens é uma importante
etapa no que tange ao processamento de imagens. O objetivo dessa etapa é subdividir a
imagem em várias partes visando facilitar a análise posterior da imagem.
O conceito de segmentação de imagens nada mais é do que um processo de
identificação de pixels com características similares utilizando etiquetas. Os pixels
vizinhos com a mesma etiqueta representam um objeto ou região e, para fazer a análise
de imagens, basta rotular pixel ou grupo de pixels de mesma classe.
Existem vários métodos de segmentação de imagens, com diferentes enfoques,
podemos citar:
• Algoritmos Baseados em Limiar: Os algoritmos baseados em Threshold, como
por exemplo o método de OTSU (Otsu, 1976), são algoritmos que utilizam um
limiar, isto é, definem um ponto na escala de cinza em que os valores acima e
abaixo desse limiar tornam-se objetos distintos. Muito usado em problemas onde
o foco é separar um objeto do plano de fundo.
• Algoritmos Baseados em Detecção de Bordas: Esses algoritmos utilizam
alguma morfologia matemática (gradiente, por exemplo) para detecção de bordas
(como o Canny, Roberts e Prewitt). Também utilizada para separar elementos de
um plano de fundo. Um bom exemplo é no reconhecimento de placas de
automóveis.
• Algoritmos Baseados em Regiões: Essa abordagem assume que os pixels
vizinhos de um certo conjunto de pixels denominado região têm um valor com um
certo grau de similaridade. Nessa abordagem têm-se como os principais
algoritmos supervisionados (algoritmos que necessitam de seeds pelo usuário para
trazer um resultado satisfatório): Split and Merge e Region Growing (Gonzalez, et
al., 2007). E tem como algoritmos não supervisionados algoritmos J-SEG
(algoritmos baseados em cor ou textura) como Felzenswalb (Walt, et al., 2014).
• Algoritmos Baseados em Clusters: Nessa abordagem a ideia principal é o uso de
centros de agrupamento para representar cada grupo e realizar a classificação com
base na similaridade. O algoritmo SLIC é um exemplo que utiliza essa
14
abordagem. Como o SLIC foi o principal algoritmo utilizado no projeto, ele será
explicado em mais detalhes na sequência.
• Algoritmos Híbridos: São algoritmos que combinam duas ou mais abordagens.
Temos por exemplo o algoritmo Watershed, que se baseia em algoritmos por
regiões e por detecção de borda.
2.2.3.1 ALGORITMO SLIC
O Simple Linear Iterative Clustering (SLIC) é um algoritmo de segmentação de
imagens por agrupamento (clustering) baseado em Superpixels, que é uma técnica que
consiste em agrupar pixels de uma imagem e classificá-los em regiões que tentam
preservar as características comuns da imagem, como bordas e cores (Alexandre, 2016).
Este algoritmo utiliza um plano 5D, com os parâmetros sendo os valores do espaço de
cores CIELab (que é uma forma de representar as cores, semelhante ao RGB, porém
utiliza um espaço 5D e de acordo com (Pedro, 2017) o CIE (Comissão Internacional de
Iluminação) desenvolveu o modelo colorimétrico Lab (também conhecido como
CIELab), no qual uma cor é identificada por três valores: L, para a luminância, expressa
em percentagem (de 0 para o preto a 100 para o branco); a e b, para as duas gamas de
cor que vão, respectivamente, do verde ao vermelho e do azul ao amarelo com valores
que vão de -120 a +120. O CIELab pode ser entendido melhor em (Oliveira, 2006).
De acordo com (Achanta, et al., 2011) o SLIC é uma adaptação do algoritmo K-
means, que pode ser entendido em (Alsabti, et al., 1998), porém há duas grandes
distinções:
O número de cálculos de distância na otimização é drasticamente
reduzido, limitando o espaço de pesquisa a uma região proporcional ao
tamanho do superelipse. Isso reduz a complexidade de ser linear no
número de pixels, independente do número de superpixels.
Uma medida de distância ponderada combina cor e espaço, enquanto
simultaneamente fornece controle sobre o tamanho e compactação dos
superpixels.
No SLIC, baseado nas definições presentes em (Achanta, et al., 2011), o pa-
râmetro principal do algoritmo é um número N de quantidade desejada de regiões, de
15
dimensões aproximadamente iguais. O procedimento de agrupamento começa com uma
etapa de inicialização em que n centros de clusters iniciais são amostrados em uma gra-
de regular espaçada S pixels separados. Para produzir superpixels aproximadamente
iguais, o intervalo da grade é √ . Os centros são movidos para localizações de
sementes correspondentes à posição de gradiente mais baixa em uma vizinhança 3 × 3.
Isso é feito para evitar a centralização do superpixel em uma borda, e reduzir a chance
de semear um superpixel com um pixel com ruído.
Em seguida cada pixel i é associado ao centro do cluster mais próximo cuja
região de pesquisa se sobrepõe à localização. Esta técnica tem como objetivo acelerar o
algoritmo porque limitando o tamanho da região de pesquisa reduz significativamente o
número de cálculos de distância, e resulta em uma vantagem de velocidade significativa
sobre os agrupamentos onde cada pixel deve ser comparado com todos os centros do
cluster. Isso só é possível através da introdução de uma medida de distância D, que de-
termina o cluster mais próximo para cada pixel. Se uma região esperada for de tamanho
M x N, a busca por pixels semelhantes será feita em uma área de tamanho 2M x 2N.
Depois que cada pixel tiver sido associado ao cluster mais próximo do centro,
uma etapa de atualização ajusta os centros dos clusters para ser a média de todos os
pixels pertencentes ao cluster.
A Figura 3 apresenta 3 imagens processadas pelo SLIC, cada imagem com o
resultado da aplicação do algoritmo considerando diferentes configurações em relação à
quantidade de superpíxels.
16
Figura 3: Diferentes imagens contendo segmentos após o uso do SLIC. Quanto maior a quantidade de
superpixels, menor o tamanho de cada segmento. Fonte:
https://filebox.ece.vt.edu/~jbhuang/teaching/ece5554-4554/fa16/hw4.html
2.2.4 HISTOGRAMA
Outro conceito importante a respeito de processamento de imagens digitais,
utilizado neste trabalho, é o histograma. Um histograma é uma representação gráfica da
função de probabilidades ou da função de densidade de um conjunto de dados
independentes e foi introduzido pela primeira vez por Karl Pearson (Pearson, 1895). A
representação mais comum do histograma é um gráfico de barras verticais, como no
exemplo da Figura 4.
Figura 4: Representação básica de um histograma Fonte:
https://www.citisystems.com.br/histograma/
Segundo (Augusto, 2012), o histograma de uma imagem digital com k níveis de
cinza é uma função discreta dada pela eq. (1):
𝑝(𝑘) 𝑛𝑘
𝑛 (1)
Onde:
k = nível de cinza, podendo variar entre 0 (preto) e 255 (branco);
nk = número de pixels na imagem com o nível de cinza k;
17
n = número total de pixels na imagem;
p(k) = estimativa da ocorrência do nível de cinza k. O somatório de p(k), é sempre
igual a 1.
O gráfico do histograma é plotado com a intensidade dos pixels para 256 tons no
eixo horizontal e, no eixo vertical, é plotado a probabilidade de ocorrência dos tons de
cinza na imagem (Gonzalez, et al., 2007).
Por fornecer uma descrição global da aparência de uma imagem, o histograma é
uma das características mais importantes a ser avaliada.
2.3 LINGUAGEM DE PROGRAMAÇÃO PYTHON E
BIBLIOTECAS DE PROCESSAMENTO DE IMAGENS
Python é uma linguagem de programação de altíssimo nível (VHLL – Very High
Level Language) criado pelo holandês Guido Van Rossum. É uma linguagem de código
aberto, disponível em varias plataformas, com sintaxe clara, orientada a objetos e
procedural, altamente modular (possui vários módulos já desenvolvidos), de tipagem
dinâmica e forte. É altamente popular por permitir a fácil leitura do código e exigir
poucas linhas de código se comparado ao mesmo programa em outras linguagens.
Python possui várias bibliotecas de auxílio ao desenvolvimento na área de
processamento de imagens e serão citadas aquelas utilizadas no desenvolvimento deste
trabalho.
• Numpy é uma biblioteca do Python que otimiza o trabalho com arranjos, vetores
e matrizes multidimensionais, possuindo inúmeros módulos de funções
matemáticas para trabalhar com essas estruturas de dados.
• Matplotlib é uma biblioteca com diversas funcionalidades para plotagem de
gráficos e imagens.
• Scikit-image é uma biblioteca que tem um conjunto de ferramentas/algoritmos
para trabalhar com processamento de imagens, como filtros, transformações e
algoritmos de segmentação de imagens.
18
3 METODOLOGIA
A proposta inicial deste trabalho foi desenvolver uma ferramenta que ao receber
uma imagem aérea de uma propriedade rural, retorna o valor em porcentagem de cada
elemento (tipo de área, como por exemplo, mata, pasto, área de plantio, rios) presente
na imagem, com o intuito de ser utilizada como ferramenta de auxílio na fiscalização
ambiental, tendo como base os parâmetros do Código Florestal Brasileiro.
Entretanto, ao realizar os primeiros estudos, percebeu-se que o problema em
questão tinha alta complexidade e envolvia um desafio na área de processamento de
imagens. Visto que não se encontrou nenhuma ferramenta adequada para solucionar o
problema de processamento de imagens, resolveu-se então que este trabalho seria
dedicado à proposição de uma ferramenta para esse problema.
Portanto, o objetivo desse projeto caracterizou-se por desenvolver e definir um
meio de demarcar regiões de modo que cada elemento da imagem (mata, pastagem, rios,
lagos) tenha seu próprio segmento (único e indivisível).
O processo metodológico desse trabalho é descrito da seguinte forma:
Primeiramente, foi realizado um levantamento bibliográfico para estudar artigos que
tivessem o mesmo teor do trabalho proposto ou outros trabalhos relevantes correlatos.
Após o levantamento, percebeu-se que um bom ponto de partida para a execução do
trabalho seria estudar algum Sistema de Informação Geográfica (SIG) capaz de
trabalhar com processamento de imagens. Segundo o estudo, o SIG Spring se mostrou,
em teoria, ter essas competências. Ao longo do estudo prático do Spring, constatou que
era necessário o desenvolvimento de algumas funções do nível de processamento de
imagens, e com isso, o foco do trabalho passou à implementação de tais ferramentas.
Para o desenvolvimento, foram estudados os recursos disponíveis em Python,
como bibliotecas de processamento de imagens. Em relação à própria implementação,
foi abordado da seguinte maneira: Primeiramente trabalharíamos a imagem de entrada
utilizando alguma ferramenta de detecção de bordas, por que de início entendíamos que
detecção de bordas era um pré-processamento essencial para qualquer segmentação
(mas não é verdade, detecção de bordas é somente uma das abordagens para se realizar
segmentação), logo após foram estudados filtros para suavização de imagens,
19
conseguinte foram estudados algoritmos de segmentação de imagens, e por último, visto
que a saída resultante era uma imagem com muitos segmentos pequenos, implementou-
se algoritmos de união de segmentos semelhantes.
3.1 TRABALHOS CORRELACIONADOS
O início do projeto pautou-se pela busca dos referenciais teóricos que dessem
suporte e embasamento científico à pesquisa, então procedeu-se com a leitura das leis
que amparam as propriedades rurais, bem como as que regulamentam o cadastramento e
fiscalização ambiental. Nesta etapa foram estudados: o novo Código Florestal, Lei Nº
12.651/2012 e o Decreto N° 7.830/2012 que criou e regulamentou o Cadastro
Ambiental Rural, além da Lei Nº 9.638/81 que criou a Política Nacional do Meio
Ambiente-PNMA. Este estudo teve como foco conhecer a realidade, as ferramentas
utilizadas na fiscalização e a necessidade de aprimoramento que justificaria o presente
estudo. Houve também uma busca por referências em projetos de mesmo teor. Destes,
cabem destacar:
O Geocar (Alves, 2017) é um software comercial disponível na área para extração
de imagens espaciais para o cadastramento do CAR, ele possui um repositório grande
de imagens, de todo o Brasil, para ser utilizado na regularização das propriedades
referentes a reserva legal. Portanto Geocar é simplesmente um banco de imagens para
suporte ao cadastramento no CAR.
O trabalho de conclusão de curso de (Silva, 2016) descreve detalhadamente o
passo-a-passo de como uma propriedade georreferenciada é cadastrada no Sicar
(Sistema Nacional de Cadastro Ambiental Rural), ou seja, é um trabalho que descreve o
processo metodológico de execução do cadastro. Este trabalho seria uma etapa neste
processo de cadastro, ou uma etapa num processo de fiscalização.
3.2 DESENVOLVIMENTO
Com os estudos realizados passou-se ao desenvolvimento do sistema. De modo
geral, o sistema consiste no carregamento da imagem digital aérea, pré-processamento
da imagem e segmentação. As Subseções seguintes descrevem os procedimentos
realizados neste contexto.
20
3.2.1 COLETA DE IMAGENS PARA TESTES
Foram extraídas 36 imagens de satélite a partir da ferramenta Google Earth
(Google), com escala de 1/25.000 em uma região próxima (a sudeste) à cidade de Barra
do Garças e dessas, foram selecionadas 9 imagens categorizadas em 3 níveis de
dificuldades classificadas de maneira subjetiva (fácil, médio, difícil), de acordo com a
quantidade e diversidade de elementos na foto, sem o intermédio de um especialista na
área. A resolução das imagens testadas foi em média no tamanho 1366x900 pixels. As
imagens foram convertidas para o padrão escala de cinza, utilizando a função
“rgb2gray()” disponível na biblioteca SciKit (Walt, et al., 2014).
3.2.2 DETECÇÃO DE BORDAS E FILTRAGEM
A partir das imagens já coletadas e selecionadas, verificou-se que o primeiro
passo para a solução do problema de separação de elementos na imagem é detectar as
bordas de cada elemento, de modo a separar e contornar (desenhar) mudanças de níveis
de cinza na matriz da imagem, de acordo com os parâmetros definidos na função.
Foram estudados alguns algoritmos clássicos para a solução de detecção de
borda e dentre as verificações feitas, descartou-se logo de início algoritmos
supervisionados, pois necessita de entrada de seeds (valores iniciais de posições da
imagem) fornecidas pelo usuário para processar, sendo que para o problema que
demanda um resultado automatizado essa ação é indesejada.
No passo seguinte, foi testado o algoritmo Canny, que por ser automático e por
ter uma boa sensibilidade às alterações de escala de cinza acreditou-se que o Canny
combinado com um algoritmo de filtragem e de pós-processamento traria um resultado
satisfatório. Também foi testado o algoritmo Watershed com seeds definidos
automaticamente, dispersos ao longo da imagem (randomicamente). Na etapa inicial do
trabalho usou-se os algoritmos Canny e Watershed, que mais tarde foram descartados
em razão da melhor qualidade de segmentação do algoritmo SLIC.
Foram também analisados alguns dos principais algoritmos de filtragem (Scharr,
Gauss, La Place, Roberts, Sobel), buscando ressaltar elementos importantes e ocultar
bordas desnecessárias. Estes algoritmos foram testados junto aos algoritmos de detecção
de bordas, porém, como foi verificado que os algoritmos de segmentação de imagens
estudados, já aplicam algoritmos de filtragem durante seu processamento (no caso do
algoritmo de segmentação escolhido na fase posterior, o algoritmo de suavização
21
utilizado foi o filtro gaussiano), a implementação do algoritmo de filtragem junto ao
algoritmo de detecção foi desnecessária e portanto, não houve uma análise aprofundada
de tais algoritmos supracitados.
3.2.3 SEGMENTAÇÃO DE IMAGENS
Esta fase é o ponto chave para a solução do problema, que é definir qual algoritmo
de segmentação de imagens e quais parâmetros se adequam melhor ao contexto de
aplicação. Durante esta fase, foram estudados e testados quatro algoritmos de
segmentação (Felzenswalb, SLIC, Watershed e Quickshift) além de outros
(Segmentação por Threshold e Randon Walker) descartados antes da fase de testes por
terem características não convenientes ao problema (como por exemplo, ser feito para
separações entre objeto e plano de fundo, ou por serem supervisionados).
Dentre os quatro algoritmos de segmentação selecionados (Felzenswalb, SLIC,
Watershed e QuickShift), buscou-se verificar e selecionar aquele algoritmo que, com
parâmetros ajustados, retorne como resultado uma separação total de elementos (sem
junções indevidas) independente da dificuldade da imagem.
Os algoritmos Felzenswalb e Quickshift trazem bons resultados quando os
parâmetros estão devidamente configurados para o tipo de imagem, porém não
conseguem trazer bons resultados quando se trata de imagens genéricas, isto é, imagens
com características diversas, com a presença de diferentes tipos de elementos e formas.
O Watershed teve piores resultados em comparação com o algoritmo SLIC por que tem
menos parâmetros e os parâmetros não tiveram tanta sensibilidade quanto o SLIC.
O algoritmo SLIC foi escolhido, por que sabendo que no SLIC cada segmento
possui a mesma taxa de compressão e, portanto, tamanhos muito similares, quanto
maior a quantidade de segmentos gerados pelo SLIC, mais sensíveis serão a mudanças
de contraste, independente da quantidade de elementos da imagem. Essa característica
facilita a detecção de elementos, de diversos tipos e tamanhos, desde que um pós-
processamento faça a união dos segmentos (elementos) semelhantes. Além disso, há
outras vantagens e características para utilizar o algoritmo SLIC neste trabalho. A
Tabela 1 apresenta um comparativo entre os algoritmos de segmentação testados no
projeto.
Tabela 1: Comparação entre algoritmos de segmentação de imagens FONTE: Autor
22
Felzenswalb QuickShift SLIC Watershed
Utiliza imagens coloridas como entrada X X X
Possuem Filtro Gaussiano para
Suavização
X X X
Retorna vários segmento igualmente
distribuídos de tamanhos similares
X X
Faz a busca para um dado segmento em
uma região vizinha (não na imagem
toda
X
Tempo de processamento alto X
Calibração dos parâmetros mais
flexível, permitindo processar, com
certo grau de qualidade, diferentes tipos
de imagens.
X
3.2.3.1 UNIÃO DE SEGMENTOS
O algoritmo SLIC retorna uma imagem com um conjunto fragmentado de
segmentos. É inviável para esta pesquisa obter múltiplas separações de um mesmo
elemento, portanto houve a necessidade de unir segmentos de um mesmo elemento.
Para isso, foram desenvolvidos e testados dois algoritmos: Um que compara a
média de escala de cinza dos pixels de cada segmento e outro que compara vetores que
representam histogramas sendo que os histogramas somente serão considerados
semelhantes se os valores (de cada posição) forem semelhantes, considerando que há
margem de erro em relação a comparação dos valores e margem de erro em relação ao
total de colunas (valores) iguais do vetor de histograma. No caso do histograma, a
contabilidade dos tons de cinza foi normalizada em função do número de pixels da
imagem.
Além disso, foi observado também se a junção entre o algoritmo que compara as
médias e o que compara histogramas poderia retornar um resultado mais satisfatório do
que separados, pois o algoritmo que compara histogramas se mostrou útil como pré-
processamento dos segmentos e a média se mostrou eficiente em realizar o
processamento final.
23
3.2.4 DESENVOLVIMENTO DO CÓDIGO
Descartada a utilização do SIG Spring, optou-se pelo desenvolvimento do sistema
na linguagem de programação Python, pois essa linguagem de programação tem como
principais características ser uma linguagem de alto nível, possuir diversas bibliotecas
para processamento de imagens e pode ser implementada tanto aplicando o conceito de
orientação à objetos, quanto procedural.
Das bibliotecas de processamento de imagens disponíveis no Python foram
estudadas as bibliotecas: PIL, OpenCV e Scikit-image, sendo que foi adotada a
biblioteca Scikit-image. Também foram utilizadas as bibliotecas Time para contagem do
tempo de processamento de cada teste, Numpy para operações numéricas e matemáticas
e Matplotlib para plotagem de imagens e gráficos.
A IDE utilizada na implementação foi o Geany 1.27 (www.geany.org).
O código foi implementado da seguinte forma:
Obtém-se a imagem de entrada a ser trabalhada, cria outra variável para receber a
imagem transformada em nível de cinza (pois em certos pontos do código também usa a
imagem colorida), chama a função que calcula e retorna o resultado do SLIC de acordo
com os parâmetros ajustados. Se for desejado utilizar o algoritmo de união por
histogramas, chama a função “criaHistogramas” (Algoritmo 1) que cria n vetores que
representam os histogramas, sendo n o número de segmento na imagem, e após isso,
nesta mesma função é chamada a função “ComparaHistogramas” (Algoritmo 2), função
essa que busca fazer comparações entre todos os n-histogramas, de modo que ao
encontrar histogramas semelhantes (chamando a função “comp2hist”) faz a união de
tais segmentos em um só. Essa função retorna o segmento unificado.
Algoritmo 1 – Algoritmo que gera n histogramas, rearranja em um tamanho T do histograma e chama a
função comparaHistograma.
criaHistogramas(Matriz_segmento):
Para i percorrendo na quantidade de segmentos faça:
Para j em cada posição da imagem faça:
Se i igual segmento do slic[i][j]:
Histograma[valor_escala_de_cinza[i][j]] ←
Histograma[valor_escala_de_cinza[i][j]] + 1
//rearranja o vetor de histogramas de acordo com o tamanho do
histograma definido como parametro
ConverteHistograma(Matriz_segmento, intervalo_de_entrada)
//verifica se os histogramas são similares. Se sim, unem os segmentos
pertencentes a cada histograma
ComparaHistograma(Matriz_segmento)
24
Algoritmo 2 – Algoritmo que verifica se existe histogramas similares e, se existe, mescla os segmentos
pertencentes aos histogramas
ComparaHistograma(Matriz_segmento, valor_desprezivel, erro_das_colunas){
Para cada histograma1 faça:
Para cada histograma2 faça:
Para cada posição i do histograma faça:
Se |histograma1[i] menos histograma2[i]| <= taxa de
erro permitida e se |histograma1[i] menos histograma2[i]|
> valorDesprezivel:
Contador ← Contador + 1
Se tamanho do histograma igual Contador +
erro_de_colunas:
Resultado ← UneSegmentos
(segmento1,segmento2)
retorna Resultado
Se a intenção for realizar a união baseado na média é chamada a função “Media”
que retorna um vetor com a média do nível de cinza de cada segmento, após isso é
chamada a função “ComparaMedia” (Algoritmo 3) que compara as médias de cada
posição do vetor e unem as posições semelhantes (atualizando o identificador do
segmento), retornando assim um conjunto de segmentos auxiliar.
Algoritmo 3 – Algoritmo que compara as medias dos Superpixels(segmentos) e retorna os conjuntos de
segmentos unidos
ComparaMedia(Matriz_segmento):
Resultado ← segmento[][]
Para cada segmento1 faça:
Para cada segmento2 faça:
//taxa de erro permitida é o valor da folga máxima para os dois
segmentos serem considerados iguais
Se |segmento1 menos segmento2| <= taxa de erro permitida:
//retorna os segmentos similares unidos
Resultado ← UneSegmentos(segmento1,segmento2)
retorna Resultado
Se a intenção for realizar a união utilizando ambos os algoritmos baseados em
histograma e média, simplesmente deverá chama-los na função principal tendo como a
entrada de conjunto de segmentos do segundo algoritmo a saída do primeiro algoritmo.
O pseudo código da função principal do sistema pode ser visto no Algoritmo 4.
Algoritmo 4: Função principal que descreve o fluxo básico do algoritmo
Principal( ){
img ← CarregaImg()
imgray ← TransformaCinza(img)
segmentos_slic ← GeraSlic(imgray)
vetorMedia ← CalculaMédiadoTomdeCinza(segmentos_slic)
vetorHistograma ← Histograma(segmentos_slic)
imgMedia ← ComparaMedia(vetorMedia)
imgHistograma ← ComparaHistograma(vetorHistograma)
25
imgMediaAndHistograma ← UneSegmentos (imgMedia, imgHistograma)
imprime imagem com os segmentos resultantes
26
4 RESULTADOS E DISCUSSÕES
Neste capítulo vamos apresentar os resultados dos testes executados. Vale ressaltar
que a análise da qualidade da segmentação das imagens é subjetiva. Foi adotado como
referência o contexto do CAR, de modo que o objetivo seria segmentar áreas de mata,
pasto, plantação, rio e suas margens.
Para a realização dos testes foi utilizado um Notebook DELL INSPIRON 3421
x64, com 4 Gb de memória física, 1 Tb de HD e processador Intel64 Family 6 Model 58
Stepping 9 GenuineIntel ~1801Mhz Dell Inc. A13.
O Sistema operacional utilizado foi o Ubuntu 16.04.5, em um ambiente
virtualizado em Windows 10, utilizando o virtualizador Oracle VirtualBox versão
5.2.18.
4.1 IMAGENS GERADAS PELO SLIC
Das nove imagens testadas, foram escolhidas três, cada um com um nível de
dificuldade (fácil, médio, difícil) para serem utilizadas nos testes finais de união de
segmentos. O SLIC foi executado com os parâmetros (900,10,5), selecionados a partir
de testes, sendo que 900 é a quantidade de segmentos, 10 é o índice de compressão e o 5
é o valor sigma, que é um parâmetro para o tratamento de imagens (gaussiano).
A Figura 51 apresenta a imagem categorizada como Fácil, após a execução do
SLIC. É importante observar que não ocorrem segmentos que misturam diferentes
elementos objetos do CAR (por exemplo, não ocorre de certo segmento ter uma parte de
mata e pasto).
1 As descontinuidades aparentes dos segmentos nas imagens apresentadas nesse capítulo são falhas de
impressão.
27
Figura 5: Imagem obtida pelo SLIC, convencionada como dificuldade Fácil.
A Figura 6 traz a imagem categorizada como Média.
Figura 6: Imagem obtida pelo SLIC convencionada como dificuldade Média.
A Figura 7 apresenta o resultado do algoritmo SLIC para a imagem categorizada como
Difícil. Nesta imagem nota-se diferentes formas e tons de diversos elementos, inclusive
com a presença de um trecho do rio Garças. Ainda assim, percebe-se poucas falhas,
sutis, em relação à segmentação de elementos distintos em um mesmo segmento.
28
Figura 7: Imagem obtida pelo SLIC convencionada como dificuldade Difícil.
4.2 UNIÃO DE SEGMENTOS A PARTIR DO HISTOGRAMA
Nos testes utilizando somente histograma como algoritmo de união de segmentos
foram avaliados parâmetros como “folga do histograma”, “tamanho do histograma” e
tolerância de colunas diferentes na comparação entre histogramas, que aqui foi
denominada de “erro de coluna”. Os parâmetros e os melhores valores apontados são
discutidos a seguir.
4.2.1 PARÂMETRO DE FOLGA DO HISTOGRAMA
Quando comparados dois histogramas sabe-se que dificilmente os valores serão
idênticos, dessa forma, para viabilizar a comparação foi considerada uma taxa de folga,
ou seja, uma porcentagem de tolerância de diferença em relação ao maior valor daqueles
comparados. Essa taxa de tolerância do erro usada na comparação entre cada coluna do
histograma foi chamada de “folga do histograma”. Para verificar as consequências no
resultado com relação à variação da Folga do Histograma foi testado todo o intervalo
(entre 0 e 1), aqui será destacado os valores de 0,2, 0,5 e 0,9, que bem representam os
testes executados. Os outros parâmetros serão mantidos em valores que não
comprometem a análise de um parâmetro específico, também para as etapas seguintes.
Os parâmetros serão definidos manualmente, restringindo o intervalo de acordo com os
testes empiricamente analisados. Os demais parâmetros apresentados na legenda serão
discutidos posteriormente.
Com o parâmetro Folga do Histograma igual a 0,2 houve muitos segmentos,
até os visualmente semelhantes, que não se uniram, ou seja, os histogramas desses
29
segmentos se diferem mais do que a folga permitem. Houve poucas uniões, mas boa
parte das uniões se concentrou nas regiões de pasto e, empiricamente, podemos dizer
que não houve uniões indevidas (uniões de segmentos que representam objetos ou
regiões distintas). A Figura 8 ilustra um exemplo de execução com Folga do Histograma
igual a 0,2.
Figura 8: Imagem gerada pelo SLIC, classificada como média, após a união de segmentos usando
histograma com os parâmetros: Folga do Histograma: 0,2 Tamanho do Histograma: 5 Erro de
Colunas:0,0.
Com a Folga do Histograma igual a 0,5, representada pela Figura 9, também
houve muitos segmentos que não se uniram, porém ocorram mais uniões que no
contexto anterior e essas novas uniões foram mais distribuídas, incluindo a mata
fechada que tinha poucas uniões. Houve poucas uniões, mas boa parte das uniões se
concentrou na região de pasto. Neste contexto ocorreram algumas poucas uniões entre
elementos distintos (uniões incorretas)
30
Figura 9: Imagem gerada pelo SLIC, classificada como média, após o algoritmo de união por
histograma com os parâmetros: Folga do Histograma: 0,5 Tamanho do Histograma: 5 Erro de
Colunas:0,0.
Usando a Folga do Histograma igual a 0,9, representada pela Figura 10, uniram-
se muitos segmentos, restando algumas áreas isoladas, mesmo dentro de um mesmo
elemento (como observado na região da mata, na parte direita e superior da imagem).
Houve um aumento da ocorrência de uniões indevidas, devido ao valor da folga ser
bastante alto.
Figura 10: Imagem gerada pelo SLIC, classificada como média, com o algoritmo de união por
histograma com os parâmetros: Folga do Histograma: 0,9 Tamanho do Histograma: 5 Erro de Colunas:
0,0.
31
4.2.2 PARÂMETRO DE TAMANHO DO HISTOGRAMA
Um histograma clássico deve contabilizar todos os tons de cinza da imagem, o
que corresponde a um vetor de 256 posições (maior nível de detalhe possível). No
entanto, é possível contabilizar intervalos de tons de cinza diminuindo o tamanho do
vetor do histograma, porém, generaliza e perde precisão na representação da imagem.
As Figuras 11 e 12 demonstram a consequência da variação no “Tamanho do
Histograma”, variável que corresponde ao tamanho do vetor do Histograma,
representando respectivamente um histograma com tamanho de 10 (intervalos de
aproximadamente 25 valores) e de 256.
Como esperado, o histograma com tamanho de 10 proporcionou mais uniões de
segmentos (em razão da generalização). Já no histograma com tamanho de 256, a
imagem obteve poucas junções, pois quanto maior o tamanho do histograma, mais
precisa é sua representação, ou seja, maior a dificuldade de se ter histogramas
semelhantes por que os valores dispostos ao longo do histograma podem se diferenciar
bastante, mesmo que tenha uma semelhança aparente em relação ao resultado visual.
Portanto, segmentos semelhantes, com menor tamanho de histograma, tendem a
ter histogramas “parecidos”.
Figura 11: Imagem obtida pelo SLIC, classificada como média, com o algoritmo de união por
histogramas com os parâmetros: Folga do Histograma: 0,8 Tamanho do Histograma:10 Erro de
Colunas:0,0.
32
Figura 12: Imagem obtida pelo SLIC, classificada como média, com o algoritmo de união por
histogramas com os parâmetros: Folga do Histograma: 0,8 Tamanho do Histograma: 256 Erro de
Colunas: 0,0.
4.2.3 PARÂMETRO DE ERRO DE COLUNAS
Em razão da dificuldade em se classificar histogramas como “semelhantes”, outro
parâmetro adotado é em relação à folga permitida quanto ao número de colunas
diferentes na comparação entre histogramas. Ou seja, além de considerar uma folga em
relação aos valores de cada coluna, ainda se considerou uma tolerância em relação ao
número de colunas que podem ser diferentes. Essa folga foi aqui denominada de “Erro
de Colunas”.
As imagens apresentadas pelas Figuras 13 e 14 mostram os resultados com a
variação deste parâmetro. O Erro de Colunas com taxa igual a 0,1 (Figura 12)
proporciona uma união de vários segmentos, porém ainda há muitos segmentos que
poderiam ser unidos. No entanto, com Erro de Colunas com taxa igual a 0,2 ocorrem
uniões de segmentos em excesso, com várias uniões inadequadas (união de elementos
distintos). Portanto para esse caso, 0,2 é um valor alto para ser escolhido, visto que
ocorrem uniões de regiões diferentes.
33
Figura 13: Imagem gerada pelo SLIC, classificada como média, com o algoritmo de união por
histogramas com os parâmetros: Folga do Histograma: 0,8 Tamanho do Histograma: 5 Erro de Colunas:
0,1.
Figura 14: Imagem gerada pelo SLIC, classificada como média, com o algoritmo de união por
histogramas com os parâmetros: Folga do Histograma: 0,8 Tamanho do Histograma:5 Erro de
Colunas:0,2.
4.2.4 CONSIDERAÇÕES A RESPEITO DO ALGORITMO DE UNIÃO POR
HISTOGRAMA
Na implementação deste algoritmo, foi definida uma variável denominada
ValorDesprezível que define um valor baixo o suficiente para ser tratado como
irrelevante. Definimos como padrão o valor 0,01. Essa estratégia foi adotada em razão
34
de alguns contextos que comparavam valores muito baixos (próximos à zero) e por
conta da taxa ser aplicada no valor, acabava por não considerar a equivalência entre os
valores.
De acordo com os experimentos, o algoritmo de união por histograma utilizado de
forma avulsa, não gera bons resultados, visto que necessita que parâmetros altos (como
por exemplo, folga de histograma igual a 0,9) para unir vários segmentos, só que dessa
maneira aumenta muito as chances de ocorrer uniões indevidas.
4.3 UNIÃO DE SEGMENTOS A PARTIR DA MÉDIA DA ESCALA
DE CINZA
Na união pela média da escala de cinza, foi calculado o valor médio da escala de
cinza a partir de todos os pixels de cada segmento. Então, foram considerados
segmentos equivalentes aqueles com valores iguais ou com uma taxa de tolerância de
erro, aqui denominada de “folga da média”.
Os experimentos variaram o valor da folga da média com taxa entre 0 e 0,5. Aqui
serão apresentados os resultados com valores iguais a 0,02; 0,05 e 0,2, que bem
representam os resultados obtidos.
O parâmetro Folga da Média definido em 0,02 é um valor baixo, pois conforme
demonstram as imagens das Figuras 15 e 16 foram unidos poucos segmentos, deixando
muitos ruídos na imagem e dificultando a correta segmentação das regiões da imagem.
35
Figura 15: Imagem gerada pelo SLIC, classificada como média, após a execução do algoritmo de união
por média com o parâmetro Folga da Media igual a 0,02.
Figura 16: Imagem gerada pelo SLIC, classificada como difícil, após a execução do algoritmo de união
por média com o parâmetro Folga da Media igual a 0,02
O parâmetro Folga da Média definido em 0,05 é o valor encontrado mais próximo
do ideal, pois conforme as Figuras 17 e 18 obtiveram uniões de segmento com melhor
característica entre os testes, mesmo que com alguns ruídos, mas facilitam um pós-
processamento ou uma possível marcação (manual) das regiões de interesse definidas
pelo usuário.
Figura 17: Imagem gerada pelo SLIC, classificada como média, após execução do algoritmo de união
por média com o parâmetro Folga da Media igual a 0,05.
36
Figura 18: Imagem gerada pelo SLIC, classificada como difícil, após a execução do algoritmo de união
por média com o parâmetro Folga da Media igual a 0,05
O parâmetro Folga da Média definido em 0,2 é um valor bastante alto, pois
conforme as Figuras 19 e 20 só não foram unidos alguns segmentos que estão dispersos
pela imagem, enquanto várias regiões em que seria necessária uma separação foram
completamente unificadas.
Figura 19: Imagem gerada pelo SLIC, classificada como média, após a execução do algoritmo de união
por média com o parâmetro Folga da Media igual a 0,2.
37
Figura 20: Imagem gerada pelo SLIC, classificada como difícil, após a execução do algoritmo de união
por média com o parâmetro Folga da Media igual a 0,2.
4.3.1 CONSIDERAÇÕES QUANTO AO ALGORITMO DE UNIÃO POR
MÉDIA
Quando comparadas as estratégias de união de segmentos por meio do histograma
e da média da escala de cinza, o algoritmo que une a partir da média se apresentou
melhor.
No entanto, após os testes, percebeu-se que poderiam ser utilizados os dois
algoritmos em conjunto, e possivelmente gerar bons resultados. Dessa forma, optou-se
por aplicar inicialmente o algoritmo de união pelo histograma e, a partir da saída dada,
ser aplicado o algoritmo de união pela média dos tons da escala de cinza, pois havia
uma hipótese de que o algoritmo de união pelo histograma seria útil como parte de pré-
processamento.
4.4 UNIÃO DE SEGMENTOS A PARTIR DO HISTOGRAMA E
MÉDIA DA ESCALA DE CINZA
Foi realizada uma bateria de testes, calibrando a Folga da Media, a Folga do
Histograma, o Tamanho do Histograma e o Erro de Colunas a fim de encontrar as
melhores combinações. Os testes consistiram das combinações dos valores para Folga
da Média (0,02; 0,05; 0,1; 0,15; 0,2), para o Tamanho do Histograma (5; 10), para o
Erro de Colunas do Histograma (0,0; 0,1; 0,2) e para a Folga do Histograma (0,5; 0,8).
38
Essas entradas de testes também foram escolhidas mediante testes (empiricamente),
para verificar bons e ruins parâmetros para ser discutido no trabalho.
Para não ter excesso de imagens de testes para justificar certos pontos, foi
reduzida a quantidade de imagens e muitas das possíveis combinações não foram
expostas ao longo deste capítulo, destacando aqueles resultados mais representativos.
4.4.1 FOLGA DA MÉDIA
4.4.1.1 FOLGA DA MÉDIA IGUAL A 0,2
Assim como na abordagem de Média (Seção 4.3), com folga da média igual a 0,2,
como observado na Figura 21, há muita união de segmentos, ao ponto de fazer uniões
de duas regiões distintas. Mesmo modificando os outros parâmetros, como Erro da
Coluna ou tamanho do Histograma, como nas Figuras 22 e 23 ou utilizando imagem
estabelecida como difícil, como na Figura 24 tendem a serem ruins por uniões de
elementos indevidos.
Somente em imagens classificadas como fácil, que a Folga da Média igual a 0,2
gera um bom resultado, como se pode observar na Figura 25, pois em imagens com
poucos elementos, a tendência é que folgas maiores sejam mais próximas do ideal, pois
folgas maiores são mais generalistas e deixam menos segmentos similares sem união.
Acima desse valor de folga, comprovado em outros testes, não apresentados neste
texto, os resultados tendem a juntar mais segmentos até chegar ao ponto de unir todos
os segmentos.
39
Figura 21: Imagem convencionada como dificuldade média, junto aos segmentos gerados pelo SLIC com
o algoritmo de união por histogramas com a média com os parâmetros: Folga do Histograma: 0,5
Tamanho do Histograma: 5 Erro de Colunas: 0,0 Folga da Média: 0,2
Figura 22: Imagem convencionada como dificuldade média, junto aos segmentos gerados pelo SLIC com
o algoritmo de união por histogramas com a média com os parâmetros: Folga do Histograma: 0,5
Tamanho do Histograma: 10 Erro de Colunas: 0,0 Folga da Média: 0,2
Figura 23: Imagem convencionada como dificuldade média, junto aos segmentos gerados pelo SLIC com
o algoritmo de união por histogramas com a média com os parâmetros: Folga do Histograma: 0,5
Tamanho do Histograma: 5 Erro de Colunas: 0,1 Folga da Média: 0,2
40
Figura 24: Imagem convencionada como dificuldade difícil, junto aos segmentos gerados pelo SLIC com
o algoritmo de união por histogramas com a média com os parâmetros: Folga do Histograma: 0,5
Tamanho do Histograma: 5 Erro de Colunas: 0,0 Folga da Média: 0,2
Figura 25: Imagem convencionada como dificuldade fácil, junto aos segmentos gerados pelo SLIC com o
algoritmo de união por histogramas com a média com os parâmetros: Folga do Histograma: 0,5
Tamanho do Histograma: 5 Erro de Colunas: 0,0 Folga da Média: 0,2
4.4.1.2 FOLGA DA MÉDIA IGUAL A 0,02
Também, como na abordagem de Média (Seção 4.3), com folga da média igual a
0,02, como observado nas Figuras 26 e 27, há pouca união de segmentos, mesmo com
os outros parâmetros modificados ou utilizando imagem classificada como fácil como
na Figura 28.
Somente em imagens estipuladas como difícil, que a folga igual a 0,2 pode gerar
um bom resultado, pois como se pode observar na Figura 29, em imagens com vários
elementos distintos são necessário muitos segmentos para que cada elemento seja
41
etiquetado adequadamente, pois folgas menores são mais especialistas e geralmente
deixam muitos segmentos como resultado.
Figura 26: Imagem convencionada como dificuldade média, junto aos segmentos gerados pelo SLIC com
o algoritmo de união por histogramas com os parâmetros: Folga do Histograma: 0,5 Tamanho do
Histograma: 5 Erro de Colunas: 0,02 Folga da Média: 0,02
Figura 27: Imagem convencionada como dificuldade média, junto aos segmentos gerados pelo SLIC com
o algoritmo de união por histogramas com a média com os parâmetros: Folga do Histograma: 0,5
Tamanho do Histograma: 10 Erro de Colunas: 0,0 Folga da Média: 0,02
42
Figura 28: Imagem convencionada como dificuldade fácil, junto aos segmentos gerados pelo SLIC com o
algoritmo de união por histogramas com a média com os parâmetros: Folga do Histograma: 0,5
Tamanho do Histograma: 5 Erro de Colunas: 0,0 Folga da Média: 0,02
Figura 29: Imagem convencionada como dificuldade difícil, junto aos segmentos gerados pelo SLIC com
o algoritmo de união por histogramas com a média com os parâmetros: Folga do Histograma: 0,5
Tamanho do Histograma: 5 Erro de Colunas: 0,0 Folga da Média: 0,02
4.4.1.3 MELHORES COMBINAÇÕES VISANDO A ENTRADA DE IMAGENS
GENÉRICAS
Tratando em linhas gerais, sem a definição de padrões de dificuldade, Folga da
Média 0,05 e com Folga do Histograma 0,8, Folga das Colunas 0,1 e Tamanho do
Histograma 10 é, segundo a bateria de testes realizados, a melhor faixa buscando uma
aplicação genérica, independente da dificuldade das imagens, pois é a faixa média onde
43
não há muitos segmentos semelhantes que não se unem e nem há muitas uniões
indevidas.
Na imagem fácil da Figura 30, podemos observar que na região de mata,
praticamente inteira, foi agrupada em um único segmento, enquanto na região de pasto,
por ter diferentes texturas e tonalidades, gerou mais segmentos específicos para as
diferenças nessa região.
Figura 30: Imagem convencionada como dificuldade fácil, junto aos segmentos gerados pelo
SLIC com o algoritmo de união por histogramas com a média com os parâmetros: Folga do Histograma:
0,8 Tamanho do Histograma: 10 Erro de Colunas: 0,1 Folga da Média: 0,05
Na imagem da Figura 31, ocorreu a união de toda faixa de mata mais escura,
separando da mata mais clara. Na região de pasto, houve bastante “ruído” proveniente
também das mudanças de tonalidade, intensidade luminosa e textura.
44
Figura 31: Imagem convencionada como dificuldade média, junto aos segmentos gerados pelo SLIC com
o algoritmo de união por histogramas com a média com os parâmetros: Folga do Histograma: 0,8
Tamanho do Histograma: 10 Erro de Colunas: 0,1 Folga da Média: 0,05
Na imagem da Figura 32, excetuando por alguns pequenos segmentos que não
foram unidos, subdividiu bem de acordo com as variações presentes em todos os
elementos, inclusive no rio e nas regiões de mata.
Figura 32: Imagem convencionada como dificuldade difícil, junto aos segmentos gerados pelo SLIC com
o algoritmo de união por histogramas com a média com os parâmetros: Folga do Histograma: 0,8
Tamanho do Histograma: 10 Erro de Colunas: 0,1 Folga da Média: 0,05
4.4.1.4 MELHORES COMBINAÇÕES VISANDO A ENTRADA DE IMAGENS
COM NÍVEIS DE DIFICULDADE
Se considerar os padrões de dificuldade, a Folga da Média ideal é no intervalo de
0,02 a 0,10, sendo que quanto maior a dificuldade menor deve ser a folga da média.
Na imagem fácil, de acordo com as Figuras 33 e 34, com Folga da Média entre
0,15 e 0,2 e com Folga do Histograma 0,8, Folga das Colunas 0.0 e Tamanho do
Histograma 5, foi constatado que nos resultados ocorreu a união de toda a mata e no
pasto, mesmo com as diferenças de cor, intensidade luminosa e textura, subdivide em
poucos segmentos, deixando pouco “ruído” na imagem. Portanto, são considerados os
melhores intervalos de resultados para as imagens de nível fácil.
45
Figura 33: Imagem convencionada como dificuldade fácil, junto aos segmentos gerados pelo SLIC com o
algoritmo de união por histogramas com a média com os parâmetros: Folga do Histograma: 0,8
Tamanho do Histograma: 5 Erro de Colunas: 0,0 Folga da Média: 0,15
Figura 34: Imagem convencionada como dificuldade fácil, junto aos segmentos gerados pelo SLIC com o
algoritmo de união por histogramas com a média com os parâmetros: Folga do Histograma: 0,8
Tamanho do Histograma: 5 Erro de Colunas: 0,0 Folga da Média: 0,2
Na imagem média, de acordo com as Figuras 35 e 36 com Folga da Média entre
0,05 e 0,1 e com Folga do Histograma 0,8, Folga das Colunas 0,1 e Tamanho do
Histograma 10, foi observado que nos resultados com folga 0,05 (Figura 35), houve
alguns segmentos semelhantes que não foram unidos pelas diferenças de tonalidade,
intensidade luminosa e textura, porém, há poucos erros de união indevida, ou seja, não
ocorre união de segmentos de regiões diferentes.
Já com a Folga da Média 0,1, representada pela imagem da Figura 36, separou-se
praticamente toda a mata, independente de ser mais clara ou mais escura, e também
separou praticamente todo o pasto, exceto em alguns pontos. Porém ocorreu a união de
46
áreas que entendemos como indevidas, como a área circular no canto superior esquerdo
com a restinga de mata. Mas no geral esse intervalo de parâmetros geram os melhores
resultados nas imagens de nível médio.
Figura 35: Imagem convencionada como dificuldade média, junto aos segmentos gerados pelo SLIC com
o algoritmo de união por histogramas com a média com os parâmetros: Folga do Histograma: 0,8
Tamanho do Histograma:10 Erro de Colunas: 0,1 Folga da Média: 0,05
Figura 36: Imagem convencionada como dificuldade média, junto aos segmentos gerados pelo SLIC com
o algoritmo de união por histogramas com a média com os parâmetros: Folga do Histograma: 0,8
Tamanho do Histograma: 10 Erro de Colunas: 0,1 Folga da Média: 0,1
Na imagem classificada como difícil, de acordo com as Figuras 37 e 38 com
Folga da Média entre 0,05 e 0,02, com Folga do Histograma 0,5, Folga das Colunas 0,0
47
e Tamanho do Histograma 5, foi observado que no resultado com Folga da Média 0,02
(Figura 37) gera bastante “ruído”, visto que os parâmetros são bem baixos para a união
dos segmentos, porém, não há praticamente união de elementos distintos, até em regiões
como o rio na região onde tem contato com o pasto, que na maioria dos testes realizados
(testes não apresentados neste texto) houve união entre rio e pasto.
Já com a Folga da Média 0,05 (Figura 38), houve bem menos ruído, e ainda
assim, separou muito bem as regiões, sem perdas relevantes da mata ou do rio. Esse
intervalo de parâmetros foi o que gerou os melhores resultados na imagem considerada
como difícil.
Figura 37: Imagem convencionada como dificuldade difícil, junto aos segmentos gerados pelo SLIC com
o algoritmo de união por histogramas com a média com os parâmetros: Folga do Histograma: 0,5
Tamanho do Histograma: 5 Erro de Colunas: 0,0 Folga da Média: 0,02
Figura 38: Imagem convencionada como dificuldade difícil, junto aos segmentos gerados pelo SLIC com
o algoritmo de união por histogramas com a média com os parâmetros: Folga do Histograma: 0,5
Tamanho do Histograma: 5 Erro de Colunas: 0,0 Folga da Média: 0,05
48
4.5 COMPLEXIDADE DO ALGORITMO E TEMPO DE
PROCESSAMENTO
Não foi foco neste trabalho a análise de eficiência dos algoritmos, o que pode ser
fonte de novas pesquisas. As verificações realizadas pelos algoritmos consideram,
sobretudo, a comparação pixel a pixel, portanto, força bruta. Em alguns trechos do
código a complexidade assintótica pode chegar a ordem de O(n4).
Dos testes realizados, o valor médio de tempo de processamento nos testes de
maior duração, que correspondente aos testes que utilizam o histograma mais a média
da escala de cinza ficou entre 20 a 25 minutos por teste, sendo que a média avulsa fica
na faixa de 8 segundos.
49
5 CONCLUSÕES
Com relação ao algoritmo de segmentação de imagens utilizado, o SLIC com 900
segmentos se mostrou ter um bom custo benefício para a solução do problema, pois
separa bem os elementos em pequenos segmentos e não demandou muito tempo de
processamento para cada teste.
Já se tratando dos algoritmos de união de segmentos, o resultado da junção entre
histograma com a média retornou resultados melhores do que o histograma ou média
avulsas, pois no contexto, a média serviu para definir um intervalo bom genérico (com o
parâmetro Folga da Média com valor 0,05) e o histograma serviu para calibrar em
relação ao intervalo gerado pela média, ou seja, o histograma foi utilizado como uma
etapa de pré-processamento.
A abordagem dos testes definindo imagens com níveis dificuldades se mostrou
mais preciso do que sem níveis de dificuldade, gerando um parâmetro único, portanto é
relevante, nesse caso, trabalhar as imagens de entrada subdividindo com relação a
quantidade de variações e elementos dispostos na imagem.
Em ambas as abordagens, os melhores resultados discutidos podem ser
trabalhados posteriormente tanto de forma supervisionada, com o usuário selecionando
cada segmento e informando o que cada segmento representa (mesmo os “ruídos” dos
resultados podem ser selecionados e unidos ou não de acordo com o interesse do
usuário), ou utilizando como entrada em algum algoritmo de aprendizado de maquina,
para treinar e retornar a identificação que cada segmento representa.
5.1 TRABALHOS FUTUROS
Como trabalhos futuros, pode se realizar o reconhecimento das imagens
trabalhadas utilizando ferramentas de aprendizado de máquina. Podemos trabalhar na
implementação de métricas para validar os testes de modo mais sistemático, como
contabilização de segmentos ou de mudanças de tonalidades. Utilizar novos métodos de
união de segmentos, como média das imagens coloridas ou união por similaridade de
textura. Também buscar automatizar a parametrização, para que venha convergir com
mais exatidão com maior facilidade. Trabalhar a saídas das imagens para melhorar em
50
outra etapa de pós processamento e por fim, desenvolver a ferramenta de suporte
idealizada inicialmente, para suporte ao CAR.
51
6 BIBLIOGRAFIA
Achanta Radhakrishna [et al.] SLIC Superpixels Compared to State-of-the-art SuperPixel Method *Artigo+ // Journal of Latex Class Files. - 2011. - 1 : Vol. 6. Alexandre Pedro Ferreira Analisando o SLIC como um gerador de Super Pixels para a Image Foresting Transform (IFT). - *s.l.+ : Universidade de São Paulo, 2016. - Disponível em: https://linux.ime.usp.br/~pfa/mac0499/p1.pdf. Acesso em 2018. Alsabti Khaled, Ranka Sanjay e Singh Vineet An Efficient K-Means Clustering Algorithm. - 1998. - Disponivel em: https://www.cs.utexas.edu/~kuipers/readings/Alsabti-hpdm-98.pdf. Acesso em Outubro, 2018. Alves Alexandra Camargo Filtros. - 2007. - Disponível em: http://lvelho.impa.br/ip09/demos/jbu/filtros.html. Acesso em 2018. Alves Paulo Rafael Imagens de Satélite do Brasil de 1973 a 2016 *Online+ // Cadastro Ambiental. - 22 de 06 de 2017. - 2018. - http://cadastroambiental.com/imagens-de-satelite-do-brasil-de-1973-e-2008-2014-2015-2016-recente/. Augusto Karen Soares Identificação Automática no Grau de Maturação de Pelotas de Ferro *Artigo+ // Dissertação de Mestrado. - Rio de Janeiro : *s.n.+, 2012. Bueno Regis Cortes Detecção de Contornos em Imagens de Padrões de Escoamento Bifásico com Alta Fração de Vazio em Experimentos de Circulação Natural com o uso de Processamento // Tese de Doutorado - Instituto de Pesquisas Energéticas e Nucleares. Autarquia associada à Universidade de São Paulo. - São Paulo : *s.n.+, 2016. - Disponível em: http://pelicano.ipen.br/PosG30/TextoCompleto/Regis%20Cortez%20Bueno_D.pdf. Acesso em Janeiro - 2018. Canny John A Computational Approach to Edge Detection // IEEE TRANSACTIONS ON PATTERN ANALYSIS AND MACHINE INTELLIGENCE. - 1986. - Vol. nº 6. Carvalho Ely Bergo de, Rajão Raoni e Giudice Roberta del Uma Breve História da Legislação Florestal Brasileira *Livro+. - Brasília : Observatório do Código Florestal (OCF), 2018. - Vols. Primeira Parte (1500 -1979). - Disponível em http://www.observatorioflorestal.org.br/content/uploads/2018/06/OCF-livro-historia-codigo-florestal.pdf. Cese Alexandre Fernandes e Guimarães David Augusto Histograma de Superpixels para Aplicações em Palinologia Forense. - Campo Grande : *s.n.+, Junho de 2017. - Disponivel em: http://www.gpec.ucdb.br/pistori/orientacoes/planos/davalex2017.pdf. Acesso em 2018. Chipana Fredy Elmer Arias e Iano Yuzo Segmentação de Imagens: abordagens para reconhecimento de placas de veículos. - Campinas : *s.n.+, 2012. - Disponivel em: http://www.sps.fee.unicamp.br/sps2012/proceedings_sps2012/Fredy_veiculos1_SPS2012.pdf. Acesso em 2018. Conci Aura Canny: Detecção de Borda. - Niterói (RJ) : *s.n.+. - Disponivel em: http://www2.ic.uff.br/~aconci/canny.pdf. Acesso em 2018. Gonzalez Rafael C. e Woods Richard E. Digital Image Processing *Livro+. - *s.l.+ : Pearson/Prentice Hall, 2007. - 3ª Edição. Google Google Earth *Online+. - Google. - https://www.google.com/earth/. Oliveira Danielle Ferreira de Confiabilidade Metrológica e Validação de Procedimentos Espectroradiométricos para Medição de Fontes Luminosas // Dissertação de Mestrado. - Rio de Janeiro : Pontifícia Universidade Católica, 2006. - Disponivel em: https://www.maxwell.vrac.puc-rio.br/9324/9324_3.PDF Acesso em Outubro, 2018. Otsu Nobuyuki A Tlreshold Selection Method from Gray-Level Histograms // IEEE TRANSACTIONS ON SYSTREMS, MAN, AND CYBERNETICS. - *s.l.+ : IEEE, 1976. - Vols. SMC-9 nº1. Pearson Karl Contributions to the Mathematical Theory of Evolution. II. Skew Variation in Homogeneous Material // Philosophical Transactions of the Royal Society A: Mathematical, Physical and Engineering Sciences. - 1895. Pedrini Hélio e Schwartz Willian Robson Análise De Imagens Digitais: Princípios, Algoritmos E Aplicações . - São Paulo : Thompson Learning, 2008. Pedro CCM *Online+ // https://br.ccm.net/. - 30 de 06 de 2017. - Outubro de 2018. -
52
https://br.ccm.net/contents/712-a-codificacao-cie-lab-l-a-b. Praes Elaine Oliveira CÓDIGO FLORESTAL BRASILEIRO: EVOLUÇÃO HISTÓRICA E DISCUSSÕES ATUAIS SOBRE O NOVO CÓDIGO FLORESTAL *Artigo+ // VI Colóquio Internacional: Educação e Contemporaniedade. - São Cristovão (SE) : *s.n.+, 2012. SEBRAE Cadastro Ambiental Rural: como regularizar sua propriedade. *Livro+. - Cuiabá, MT : SEBRAE, 2017. - Disponivel em: http://sustentabilidade.sebrae.com.br/Sustentabilidade/Para%20sua%20empresa/Publica%C3%A7%C3%B5es/5-Cadastro-Ambiental-Rural_MIOLO-final.pdf. Acesso em 2018. Silva Ricardo Heinen Borges da CADASTRAMENTO AMBIENTAL RURAL DE UMA PROPRIEDADE GEORREFERENCIADA DE PARANATINGA – MT *Artigo+. - Cuiabá : *s.n.+, 2016. - Disponível em: http://www.ufmt.br/fenf/arquivos/347daa88035b776b2c08e51a11f76d00.pdf Acesso em 2018. Spavorek Gerd [et al.] A revisão do Código Florestal brasileiro. Novos estudos - CEBRAP, *Artigo+ // SPAROVEK, Gerd et al . A revisão do Código Florestal brasilei. - São Paulo : *s.n.+, 2011. Walt Stéfan van der [et al.] scikit-image: Image processing in Python. - 2014. - http://dx.doi.org/10.7717/peerj.453.
53
7 ANEXO A
Código em Python de todo o sistema desenvolvido:
54
1 from __future__ import print_function
2
3 # BIBLIOTECAS
4 import matplotlib.pyplot as plt
5 import numpy as np
6 import skimage
7 from skimage.data import astronaut
8 from skimage.color import rgb2gray
9 from skimage.filters import scharr, roberts, prewitt, laplace,
sobel,gaussian
10 from skimage.segmentation import felzenszwalb, slic, quickshift,
watershed, random_walker
11 from skimage.segmentation import mark_boundaries
12 from skimage.util import img_as_float
13 from skimage.util import img_as_int
14 from skimage import exposure
15 import cv2
16 import time
17 #import plotly.plotly as py
18
19
20 #----------FUNCAO QUE RETORNA O SLIC------------------
21 def Slic(nSeg, comp, sigma, img):
22 #Roda funcao de segmentacao SLIC
23 segments_slic = slic(img, nSeg, comp, sigma)
24 segcopy = segments_slic[:]
25 return (segments_slic, segcopy)
26 #------------------------------------------------------
27
28 #-----FUNCAO QUE RECEBE A LARGURA E A ALTURA DA IMAGEM
29 def LarguraAltura(segments_slic):
30 ### TODO: USAR ESTE MODELO...
31 altura = np.size(img,0)
32 largura = np.size(img,1)
33 return (altura, largura)
34 #------------------------------------------------------
35
36 #-----FUNCAO QUE INICIALIZA ALGUMAS VARIAVEIS----------
37 def InicializaVariaveis(segments_slic):
38
39 #VARIAVEL DO FOR ABAIXO
40 k = 0
41
42 #VARIAVEL QUE RECEBE A MEDIA
43 media = []
44
45 #VARIAVEL QUE CONTA OS PIXELS
46 countpx = []
47
48 #VARIAVEL QUE RECEBE A MEDIA FINAL
49 mediaF = []
50
51 #VARIAVEL FLAG QUE RECEBE 1 SE JA PERCORRIDO
52 flag = []
53
54 #VARIAVEL QUE RECEBE OUTRA MEDIA FINAL
55 mediaFinal = []
56
57 #VARIAVEL AUXILIAR
58 aux = []
59
60 #VARIAVEL CONTADOR
61 count = []
62
63 #ZERA TODOS OS VETORES
64 for k in range(len(np.unique(segments_slic))):
65 media.append(0)
66 countpx.append(0)
55
67 mediaF.append(0)
68 flag.append(0)
69 mediaFinal.append(0)
70 aux.append(0)
71 count.append(0)
72 #media0.append(0)
73
74 #RETORNA TODOS OS VETORES
75 return (media, countpx, mediaF, flag, mediaFinal, aux, count)
76
77 #---------FUNCAO QUE CHAMA OS HISTOGRAMAS
78 def CriaHistogramas(segments_slic, folgaH, intervalo_de_entrada,
erro_das_colunas):
79
80 #DEFINE UM VETOR QUE PEGA CADA HISTOGRAMA UNICO
81 vetHistograma = []
82
83 #VALOR RECEBE A QUANTIDADE DE PIXEL DE CADA SLIC
84 valor = []
85 #-----CRIA HISTOGRAMAS PARA CADA SLIC----------------------------
-------
86 for i in range(len(np.unique(segments_slic))):
87
88 valor.append(0)
89 vetHistograma.append(0)
90
91 #CHAMA A FUNCAO HISTOGRAMA COM O INTERVALO DE ENTRADA PARA
SER DIVIDIDO POR 256
92 vetHistograma[i], intervalo, somaPixel =
Histograma(segments_slic, i, intervalo_de_entrada)
93
94 #valor contem a soma de todos os pixels de um slic
95 valor[i] = somaPixel[i]
96 #----------------------------------------------------------------
--------
97 '
98 #----CHAMA A FUNCAO QUE COMPARA HISTOGRAMAS-------------------
99 segments_slic = ComparaHistograma(segments_slic, vetHistograma,
intervalo, valor, intervalo_de_entrada, folgaH, erro_das_colunas)
100 return (segments_slic)
101
102 #---------FUNCAO QUE INICIALIZA E CRIA OS HISTOGRAMAS
103 def Histograma(segments_slic, Valor_segment_slic, intervalo_de_entrada):
104
105 #CRIA DUAS VARIAVEIS: UMA PARA RECEBER O HISTOGRAMA E OUTRA PARA
SOMAR OS PIXELS
106 histograma = []
107 somaPixel = []
108
109
110 #ZERA HISTOGRAMA
111 for i in range(256):
112 histograma.append(0)
113
114 #print(1.1)
115 #FOR PARA PERCORRER A IMAGEM
116 for i in range(altura):
117 for j in range(largura):
118
119 #ZERA SOMAPIXEL
120 somaPixel.append(0)
121
122 #VERIFICA QUAL DOS SLICS QUEREMOS COMPARAR
123 if(Valor_segment_slic == segments_slic[i][j]):
124 #VALUEGRAYSCALE RECEBE A IMAGEM EM ESCALA DE
CINZA EM ESCALA DE 0 A 255
125 valueGrayScale = (int)(round(imgray[i][j] *
255))
56
126
127
128 #HISTOGRAMA INCREMENTA NA POSICAO DE ACORDO
COM A TONALIDADE DA ESCALA DE CINZA
129 histograma[valueGrayScale] += 1
130
131 #INCREMENTA A QUANTIDADE DE PIXEL Pode ser
que tenha um erro aqui por talvez ser segments_slic[i][j] no lugar de
valor_seg_slic
132 somaPixel[Valor_segment_slic] += 1
133
134 #divide os intervalos de acordo com a entrada
135 intervalo = (int)(256 / intervalo_de_entrada)
136 #---SUBSTITUI DE ACORDO COM O INTERVALO----------
137 soma = 0
138 vet = []
139 count = 0
140 j = 0
141
142 for i in range(0, 255, intervalo):
143 vet.append(0)
144
145 if((j + i) < 256):
146
147 for j in range (intervalo):
148 soma += histograma[j+i]
149 vet[count] = soma
150 count += 1
151 soma = 0
152 if((i + intervalo) <= 256):
153 ValorI = i + intervalo
154 else:
155 ValorI = i
156 #Pega o restante do vetor
157 if(ValorI < 256):
158 vet.append(0)
159 while(ValorI < 256):
160 soma += histograma[ValorI]
161 ValorI += 1
162 vet[count] = soma
163 #-----------------------------------------------
164 return (vet,intervalo, somaPixel)
165
166 #-----------------FUNCAO QUE COMPARA OS HISTOGRAMAS
167
168 def ComparaHistograma(segments_slic, vetHistograma, intervalo, valor,
intervalo_de_entrada, folgaH, erro_das_colunas):
169 #---------DEFINE VARIAVEIS DE CONTADOR E DE FLAG-----------
170 count = 0
171 #contador que redefine para uma ordem crescente o segments_slic
172 vetRearranjo = []
173 #contador que pega o valor do primeiro i que entra no laco de
verificacao
174 count_do_primeiro_slic = 0
175 #flag para evitar ir para a segunda opcao se ja entrou na
primeira
176 flagcount = 0
177 #flag
178 flag = []
179 #--DEFINE A VARIAVEL DE QUEREMOS DE FOLGA------------------------
---------
180 #folga = 0.2
181 #----------------------------------------------------------------
--------
182
183
184 #---------ZERA A FLAG-------------------------------------------
185 for i in range(0,len(np.unique(segments_slic))+1,1):
57
186 flag.append(0)
187 #---------------------------------------------------------------
188
189
190 #define uma variavel fixa pois o np.unique(segments_slic) altera
com as iteracoes
191 FlagUniqueSegments = len(np.unique(segments_slic))
192
193 #FOR PARA O I QUE SERA O VETOR DE HISTOGRAMA A SER
COMPARADO(BASE)
194 for i in range(FlagUniqueSegments):
195 #FOR PARA O K QUE SERA O VETOR DE HISTOGRAMA QUE IRA
COMPARAR COM O I
196 for k in range(i + 1, FlagUniqueSegments ,1):
197
198 #CHAMA A FUNCAO QUE COMPARA PONTO A PONTO DOIS
HISTOGRAMAS
199 bool1, count, k = Comp2Hist(i, k, count,
vetHistograma, folgaH, valor, flag, intervalo_de_entrada, erro_das_colunas)
200
201 #VERIFICA SE O RESULTADO DA COMPARACAO ENTRE 2 SLICS
DEU VERDADEIRO(OS DOIS SAO IGUAIS)
202 if (bool1 == True):
203 for i1 in range(altura):
204 for j1 in range(largura):
205 #SE OS DOIS SAO IGUAIS, AMBOS
VIRAM UM SO
206 if(segments_slic[i1][j1] == k):
207 segments_slic[i1][j1] = i
208
209
210 for l in range (0,len(np.unique(segments_slic)), 1):
211
212 if(l < len(np.unique(segments_slic))):
213 vetRearranjo.append(0)
214 vetRearranjo[l] = np.unique(segments_slic)[l]
215 for i1 in range(altura):
216 for j1 in range(largura):
217 if(vetRearranjo[l] == segments_slic[i1][j1]):
218 segments_slic[i1][j1] = l
219
220 return (segments_slic)
221
222 #---------FUNCAO QUE COMPARA 2 HISTOGRAMAS-----------------------------
223 def Comp2Hist(i, k, count, vetHistograma, folgaH, valor, flag,
intervalo_de_entrada,erro_das_colunas):
224 #DEFINE BOOL1 COMO FALSE INICIALMENTE
225 bool1 = False
226 ValorDesprezivel = 0.01
227
228 #VERIFICA SE O HISTOGRAMA I E O HISTOGRAMA K JA FOI VERIFICADO
229 if(flag[i] == 0 and flag[k] == 0):
230 #FOR QUE PERCORRE O TAMANHO DO HISTOGRAMA
231 for j in range(0, len(vetHistograma[i]),1):
232 if(i ==0 and k == 1):
233 arq.writelines( (str)(vetHistograma[k][j]))
234 arq.writelines( (str)(vetHistograma[i][j]))
235 #DEFINE OS SLICS, DIVIDINDO NORMALIZADO O VALOR DO
HISTOGRAMA PELA QUANTIDADE TOTAL DE PIXELS
236 slic1 = ((float)(vetHistograma[k][j]) /
(float)(valor[k]))
237
238 slic2 = ((float)(vetHistograma[i][j]) /
(float)(valor[i]))
239 #---------------------------------------------------
--------------------------------------
240
58
241 #PEGA O MAIOR SLIC
242 MaiorSlic = max(slic1, slic2)
243 MinSlic = min(slic1, slic2)
244 #Extrai a porcentagem de folga do maior slic
245 PCorrente = MaiorSlic * folgaH
246
247 #VERIFICA SE A DIFERENCA DOS ENTRE OS SLICS ESTA DE ACORDO
COM O VALOR MAXIMO DE FOLGA
248 if((abs)(MaiorSlic - PCorrente) > MinSlic and
(abs)(MaiorSlic - PCorrente) > ValorDesprezivel):
249
250 bool1 = False
251 else:
252 count += 1
253 #SE TODAS AS POSICOES DO VETOR ESTIVEREM DE ACORDO COM O
VALOR DE FOLGA, RETORNA VERDADEIRO
254
255 if(count >= ((int)(len(vetHistograma[i])) -
(int)(len(vetHistograma[i]) * erro_das_colunas))):
256 bool1 = True
257 flag[k] = 1
258 #----------------------------------------------------------
--------------------------------
259
260 #SE O HISTOGRAMA I OU O HISTOGRAMA K JA FOI VERIFICADO, RETORNA
FALSE
261 else:
262
263 bool1 = False
264 #----------------------------------------------------------------
----
265
266 #ZERA NOVAMENTE O CONTADOR
267 count = 0
268
269 return (bool1, count, k)
270
271
272 #---------FUNCOES DE MEDIA DE ESCALA DE CINZA-----------------------
273
274 def Media(segments_slic, altura, largura):
275 #Media com 2 FOR's
276 #PERCORRE A IMAGEM INTEIRA
277 for i in range(altura):
278 for j in range(largura):
279
280 #A VARIAVEL INDEX RECEBE O SEGMENTO NA POSICAO
[I][J]
281 index = segments_slic[i][j]
282 #A MEDIA NA POSICAO INDEX RECEBE O VALOR EM CINZA NA
POSICAO [I][J]
283 media[index] += imgray[i][j]
284
285 #O CONTADOR DE PIXEL INCREMENTA
286 countpx[index] += 1
287
288 #Media final
289 for k in range(len(np.unique(segments_slic))):
290 mediaF[k] = media[k]/countpx[k]
291 return (mediaF)
292
293
294
295 #-----FUNCAO QUE TRANSFORMA
296 def Transforma(segments_slic, mediaF, folga):
297
298 #CRIA CONTADOR
299 count = 0
59
300
301 for j in range(len(mediaF)):
302 if(flag[j] == 0):
303 aux[j] = count
304 for k in range(j+1, len(mediaF),1):
305 subtracao = mediaF[j] - mediaF[k]
306 if((flag[k] == 0) and (subtracao <= folga)
and (subtracao >=((-1) * folga))):
307 aux[k] = count
308 flag[k] = 1
309 count +=1
310 return ( aux)
311
312 #FUNCAO QUE CONVERTE OS SEGMENTOS SLIC ORIGNIAIS NOS NOVOS
313 def Converte(segcopy, segments_slic, transforma, altura, largura):
314
315 for i in range(altura):
316 for j in range(largura):
317 segcopy[i][j] = transforma[segments_slic[i][j]]
318 segments_slic = segcopy
319 return (segments_slic)
320 #----------------------------------------------------------------
321
322
323
324 #---------------------------------------------------------------------
325
326 #-------------------------MAIN--------------------------------------
327 arq = open('saida2.txt', 'w')
328
329 #im1 :------------------- IMAGEM DE ENTRADA----------
330 im1 = cv2.imread('Captura de Tela (82).png')
331 img = img_as_float(im1[::1, ::1])
332 #-----------------------------------------------------
333
334 #-TRANSFORMA EM ESCALA DE CINZA E IMPRIME TODA A MATRIZ
335 # Configuracao para imprimir toda a mtz
336 np.set_printoptions(threshold = np.inf)
337 # Converte para tons de cinza
338 imgray = rgb2gray(img)
339 #print (imgray[0][0])
340 #-------------------------------------------------------
341
342 #----------------------SLIC--------------------------
343 #Parametros: img, num_segmentos, Compactness, sigma
344 #nSeg = 12
345 #comp = 10
346 #sigma = 5
347 #-----------------------------------------------------
348
349
350 #-----CRIA UM NOVO SLIC-------------------
351
352 ref_arquivo = open("testeHist4.txt", "r")
353 linha = ref_arquivo.readline()
354 while(linha):
355 inicio = time.time()
356 arq = open('saida1.txt', 'w')
357 valores = linha.split()
358 imagemName = "Captura de Tela ("+ valores[2] + ").png"
359 #imagemName = "Captura de Tela (98).png"
360
361 print (imagemName, linha)
362 #im1 :------------------- IMAGEM DE ENTRADA----------
363 im1 = cv2.imread(imagemName)
364 img = img_as_float(im1[::1, ::1])
365 im2 = im1[::2,::2]
366 #-----------------------------------------------------
60
367
368 #-TRANSFORMA EM ESCALA DE CINZA E IMPRIME TODA A MATRIZ
369 # Configuracao para imprimir toda a mtz
370 np.set_printoptions(threshold = np.inf)
371 # Converte para tons de cinza
372 imgray = rgb2gray(img)
373 #print (imgray[0][0])
374 #-------------------------------------------------------
375
376 #----------------------SLIC--------------------------
377 #Parametros: img, num_segmentos, Compactness, sigma
378 #nSeg = 12
379 #comp = 10
380 #sigma = 5
381 #-----------------------------------------------------
382
383
384 #-----CRIA UM NOVO SLIC-------------------
385 segments_slic, segcopy= Slic(900,10,5,img)
386
387 #-----RETORNA A ALTURA E A LARGURA DA IMAGEM---------
388 altura, largura = LarguraAltura(segments_slic)
389
390
391
392 #FUNCAO PARA COMPARAR CADA SLIC USANDO HISTOGRAMA EM ESCALA DE
CINZA
393
394 folgaH = (float)(valores[3])
395 intervalo_de_entrada = (float)(valores[4])
396 erro_das_colunas = (float)(valores[5])
397 criaHistogramas = CriaHistogramas(segments_slic,
folgaH,intervalo_de_entrada, erro_das_colunas)
398
399 folga = (float)(valores[6])
400 media, countpx, mediaF, flag, mediaFinal, aux, count =
InicializaVariaveis(segments_slic)
401 mediaF = Media(criaHistogramas, altura, largura)
402 transforma = Transforma(criaHistogramas, mediaF, folga)
403 segfinal = Converte(segcopy, criaHistogramas, transforma, altura,
largura)
404
405 #fecha arquivo
406 arq.close()
407 fim = time.time()
408 tempo = (str)(fim - inicio)
409
410 #PARA HIST + MEDIA
411 resul_slic = 'TesteAtualFinal' +valores[0] + valores[1] +
valores[2] +"folgaH" + valores[3] + "intEnt"+ valores[4] + "ErroC"+ valores[5]
+ "folgaM" + valores[6] +"Tempo" + tempo
412 #PARA HIST
413 #resul_slic = 'TesteParaVariarIntervaloH ' +valores[0] +
valores[1] + valores[2] +"folgaH" + valores[3] + "intEnt"+ valores[4] +
"ErroC"+ valores[5] + "Tempo" + tempo
414 #PARA MEDIA
415 #resul_slic = 'TesteAtualFinalMedia' +valores[0] + valores[1] +
valores[2] + "folgaM" + valores[6] +"Tempo" + tempo
416
417 plt.imshow(mark_boundaries(img, segcopy), cmap = 'gray')
418 plt.savefig('%s.jpg'%(resul_slic))
419 linha = ref_arquivo.readline()
420