109
DETECÇÃO AUTOMÁTICA DE CÉLULAS VIA TÉCNICAS DE MORFOLOGIA MATEMÁTICA E PROCESSAMENTO DIGITAL DE IMAGENS Bruno Saraiva da Silva Projeto de Graduação apresentado ao Curso de Engenharia Eletrônica e de Computação da Escola Politécnica, Universidade Federal do Rio de Janeiro, como parte dos requisitos necessários à obtenção do título de Engenheiro. Orientador: Eduardo Antônio Barros da Silva Coorientador: Charles Bezerra do Prado Rio de Janeiro Março de 2015

GERENCIAMENTO DE TEXTURAS PARA APLICAÇÕES DE …monografias.poli.ufrj.br/monografias/monopoli10013465.pdf · Dedico este projeto a meu pai e à minha mãe, por todos os dias dos

Embed Size (px)

Citation preview

DETECÇÃO AUTOMÁTICA DE CÉLULAS VIA

TÉCNICAS DE MORFOLOGIA MATEMÁTICA E

PROCESSAMENTO DIGITAL DE IMAGENS

Bruno Saraiva da Silva

Projeto de Graduação apresentado ao Curso de

Engenharia Eletrônica e de Computação da Escola

Politécnica, Universidade Federal do Rio de

Janeiro, como parte dos requisitos necessários à

obtenção do título de Engenheiro.

Orientador: Eduardo Antônio Barros da Silva

Coorientador: Charles Bezerra do Prado

Rio de Janeiro

Março de 2015

ii

DETECÇÃO AUTOMÁTICA DE CÉLULAS VIA

TÉCNICAS DE MORFOLOGIA MATEMÁTICA E

PROCESSAMENTO DIGITAL DE IMAGENS

Bruno Saraiva da Silva

PROJETO DE GRADUAÇÃO SUBMETIDO AO CORPO DOCENTE DO CURSO

DE ENGENHARIA ELETRÔNICA E DE COMPUTAÇÃO DA ESCOLA

POLITÉCNICA DA UNIVERSIDADE FEDERAL DO RIO DE JANEIRO COMO

PARTE DOS REQUISITOS NECESSÁRIOS PARA A OBTENÇÃO DO GRAU DE

ENGENHEIRO ELETRÔNICO E DE COMPUTAÇÃO

Autor:

_________________________________________________

Bruno Saraiva da Silva

Orientador:

_________________________________________________

Prof. Eduardo Antônio Barros da Silva, Ph. D.

Coorientador:

_________________________________________________

Eng. Charles Bezerra do Prado, D. Sc.

Examinador:

_________________________________________________

Prof. Alexandre Visintainer Pino, D. Sc.

Examinador:

_________________________________________________

Prof. Márcio Nogueira de Souza, D. Sc.

Rio de Janeiro – RJ, Brasil

Março de 2015

iii

UNIVERSIDADE FEDERAL DO RIO DE JANEIRO

Escola Politécnica – Departamento de Engenharia Eletrônica e de Computação

Centro de Tecnologia, bloco H, sala H-217, Cidade Universitária

Rio de Janeiro – RJ CEP 21949-900

Este exemplar é de propriedade da Universidade Federal do Rio de Janeiro, que

poderá incluí-lo em base de dados, armazenar em computador, microfilmar ou adotar

qualquer forma de arquivamento.

É permitida a menção, reprodução parcial ou integral e a transmissão entre

bibliotecas deste trabalho, sem modificação de seu texto, em qualquer meio que esteja

ou venha a ser fixado, para pesquisa acadêmica, comentários e citações, desde que sem

finalidade comercial e que seja feita a referência bibliográfica completa.

Os conceitos expressos neste trabalho são de responsabilidade do autor.

iv

DEDICATÓRIA

Dedico este projeto a meu pai e à minha mãe, por todos os dias dos últimos 24

anos em que acordaram cedo para trabalhar e garantir que eu tivesse as melhores

condições possíveis para assegurar um futuro próspero e feliz (ainda que isso

prorrogasse os seus próprios planos e sonhos), e ao meu irmão, por todos os momentos

de companheirismo, alegria, força, esperança, paciência e reflexão que compartilhamos

em longas jornadas diárias dentro de coletivos abarrotados ou em madrugadas tomadas

por estudos e trabalhos.

O dedico também aos meus avós, pois lembro aqui o carinho, o cuidado e a

orientação que transmitiram a mim, ajudando a moldar o caráter e os valores que

carregarei comigo por toda a vida. O mesmo se estende aos meus queridos tios e primos,

que sempre me proporcionaram a felicidade de possuir a família que tanto amo.

Por último, mas não menos importante, dedico uma grande parte dos esforços

envolvidos neste projeto aos meus amigos da época do colégio e, principalmente,

àqueles que entraram na minha vida ao longo da graduação, tanto no Brasil, quanto nos

Estados Unidos. Sem vocês, meus verdadeiros amigos, eu não teria superado muitos dos

obstáculos acadêmicos e pessoais que surgiram a cada novo semestre, sempre crescendo,

aprendendo e vivendo ao seu lado.

Do fundo do coração, espero ter retribuído ao menos um pouco do amor e da

amizade oferecidos por todos vocês a mim.

Muito obrigado. Não vos esquecerei.

v

AGRADECIMENTO

Agradeço, primeiramente, ao meu orientador, o professor Eduardo Antônio

Barros da Silva, por todas as horas de instrução dedicadas a me ajudar a tornar esse

projeto numa realidade, acreditando no meu potencial e sempre exigindo o melhor do

profissional que sou. Tenha a certeza de que o admiro e também o considero como um

amigo, um mestre e um exemplo do engenheiro que eu gostaria de ser.

Em segundo lugar, agradeço ao Charles Bezerra do Prado e ao Gustavo Conde

Menezes, por terem sido tão solícitos e gentis nas discussões enriquecedoras e trocas de

conteúdo imprescindíveis à realização deste projeto; bem como pela concretização da

parceria entre o Laboratório de Sinais, Multimídia e Telecomunicações da UFRJ e o

INMETRO (Instituto Nacional de Metrologia, Qualidade e Tecnologia), o mais

respeitado e renomado órgão brasileiro de metrologia e controle de qualidade.

Em terceiro lugar, ressalto as contribuições valiosas do jovem Daniel Barradas

Ribeiro, aluno de iniciação científica do SMT-UFRJ e meu amigo, que implicaram em

soluções de problemas pertinentes ao escopo deste projeto. Orgulho-me muito em ter

trabalhado junto a vocês quatro.

Também agradeço a todos os demais professores dos quais fui aluno durante a

graduação, tanto em território nacional, quanto no exterior, pelos conhecimentos

transmitidos a mim. Em especial, destaco os agradecimentos pessoais aos mestres

Alexandre Visintainer Pino e Márcio Nogueira de Souza, por me darem a honra de

aceitarem o convite à banca avaliadora deste trabalho; a Eduardo Vieira Leão Nunes e a

Fernando Antônio Pinto Barúqui, por me apoiarem ao escreverem as cartas de

recomendação requisitadas para o intercambio acadêmico que mudou a minha vida; a

Antônio Cláudio Gómez de Sousa e a Carlos Fernando Teodósio Soares, pelas

orientações de carreira no começo da faculdade; e a Carlos José Ribas D’Avila, a José

Paulo Brafman e a Joarez Bastos Monteiro, pelo imenso suporte prestado tanto às

minhas atividades acadêmicas, quanto àquelas relacionadas às organizações e eventos

estudantis que representei ao longo destes seis anos e meio de graduação.

Além disso, gostaria de agradecer a todos os meus amigos que partilharam dos

sucessos e das decepções proporcionadas pela faculdade, que, pela evidente limitação de

espaço neste texto, são aqui especialmente representados pelas figuras de Helena Bento

Martins do Valle, Ana Luiza Barros Tarrisse da Fontoura, Nilson Carvalho Silva Junior,

Timóteo Alvarenga da Silva Nascimento, Maurício de Castro Pereira, Pedro Oliveira

vi

Quitete de Lima, Luiz Gomes Ribeiro Neto, Eduardo Trombetta Filgueiras Lima de

Almeida e Henrique Moreira Índio do Brasil.

Agradeço à Escola Politécnica do Centro de Tecnologia da Universidade Federal

do Rio de Janeiro pelo ensino gratuito e de excelência oferecido a mim, possível graças

às louváveis contribuições do povo brasileiro. Também sou grato às oportunidades de

bolsas acadêmicas fornecidas a mim pelo Governo Federal, através do CNPq (Conselho

Nacional de Desenvolvimento Científico e Tecnológico) e da CAPES (Coordenação de

Aperfeiçoamento de Pessoal de Nível Superior), quando da minha atuação como aluno

de iniciação científica e da minha graduação sanduíche nos Estados Unidos da América

pelo programa “Ciência Sem Fronteiras”.

Por fim, agradeço especialmente à UFRJ pela menção honrosa concedida a mim

e a este trabalho durante a XXXVI Jornada Giulio Massarani de Iniciação Científica,

Tecnológica, Artística e Cultural da UFRJ. Este projeto foi eleito como um dos dez

melhores trabalhos apresentados no Centro de Tecnologia na JIC 2014, o que me deixa

ainda mais orgulhoso da minha estada nesta tão estimada e prodigiosa universidade e

comunidade.

vii

RESUMO

A indústria de biotecnologia enfrenta dificuldades para acompanhar os efeitos

que drogas em teste produzem sobre culturas de células, uma vez que esse

monitoramento é geralmente feito por equipamentos oferecidos por poucos fabricantes,

através de soluções sigilosas. Eles usam o processamento digital de imagens para

efetuar medições, tais como a contagem do número de células existentes na amostra ou

a quantidade de área do substrato que é coberta por material celular, porque estas são

importantes métricas na avaliação de processos celulares.

Este trabalho visa realizar tais tarefas de contagem, porém de forma

automatizada e alternativa, construindo uma ferramenta que faça a detecção de células e

forneça meios de se estimar as incertezas de medição atreladas aos resultados numéricos

obtidos. A ideia principal é comprovar que um algoritmo utilizando operações de

morfologia matemática de domínio público pode gerar medições confiáveis, estando

apto a ser empregado em processos de metrologia em sistemas biológicos.

Palavras-Chave: células, processamento digital de imagens, ferramenta de medição,

metrologia biológica, morfologia matemática, segmentação de imagens, imagens

médicas.

viii

ABSTRACT

The biotechnology industry is facing problems to track experimental drugs’

effects on cell cultures, given that there are just a few manufacturers providing

equipment to monitor these phenomena and all of them achieve this using proprietary

solutions. They use digital image processing to inspect the samples and measure the

number of cells featured or the substratum area covered by cellular material, because

these are key measurements in cellular processes analysis.

This project tries to accomplish the same measurements, in an automatic and

alternative approach, by developing a tool that detects the cells and estimates

measurements’ uncertainties related to the numerical results informed. The main goal is

to prove that an algorithm using well known mathematical morphology operations can

achieve reliable results, being useful in biological systems metrology.

Key-words: cells, digital image processing, measurement tool, biological metrology,

mathematical morphology, image segmentation, medical imaging.

ix

SIGLAS

UFRJ – Universidade Federal do Rio de Janeiro

SMT – Laboratório de Sinais, Multimídia e Telecomunicações

INMETRO – Instituto Nacional de Metrologia, Qualidade e Tecnologia

BIPM – “Bureau International des Poids et Mesures” ou Bureau Internacional de Pesos

e Medidas

ISO – “International Organization for Standardization” ou Organização Internacional

de Padronização

DNA – “Deoxyribonucleic Acid” ou ácido desoxirribonucléico

ROI – “Region of Interest” ou região de interesse

TIFF – “Tagged Image File Format” ou formato de arquivo de imagens rotuladas

GUI – “Graphical User Interface” ou interface gráfica de usuário

GUIDE – “Graphical User Interface Design Environment” ou ambiente de

desenvolvimento de interfaces gráficas de usuário

x

Sumário

1 Introdução ............................................................................................................... 1

1.1 – Tema .................................................................................................................... 1

1.2 – Delimitação .......................................................................................................... 1

1.3 – Justificativa .......................................................................................................... 1

1.4 – Objetivos .............................................................................................................. 2

1.5 – Metodologia ......................................................................................................... 2

1.6 – Descrição ............................................................................................................. 3

2 Contextualização ................................................................................................... 4

2.1 – Motivação ............................................................................................................ 4

2.2 – Projeto .................................................................................................................. 4

3 Morfologia Matemática aplicada a Imagens Binárias ........................... 13

3.1 – Conceitos ........................................................................................................... 13

4 Operações sobre Imagens em Tons de Cinza ............................................ 29

4.1 – Conceitos ........................................................................................................... 29

5 A Ferramenta Desenvolvida e o seu Algoritmo ....................................... 41

5.1 – Conceitos ........................................................................................................... 41

6 Resultados e Conclusões ................................................................................... 59

6.1 – Constatações ...................................................................................................... 59

Bibliografia ................................................................................................................ 63

Apêndice A ................................................................................................................. 65

Demonstração de Resultados ...................................................................................... 65

Apêndice B ................................................................................................................. 77

Código fonte ............................................................................................................... 77

xi

Lista de Figuras

2.1 - Fotos da linhagem celular A-549. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

2.2 - Diagrama do fabricante detalhando as marcações existentes na placa

Grid 500. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

2.3 - Explicitando os valores numéricos dos 63 elementos de uma imagem

binária de 7 linhas e 9 colunas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

2.4 - Evidenciando os valores contidos em uma imagem em tons de cinza. . . . 9

2.5 - Representação das escalas de tons de cinza em 8 “bits” (à esquerda) e

em 16 “bits” (à direita). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

2.6 - Imagem concebida após a conversão da figura 2.4 para o tipo de dupla

precisão. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

2.7 - (a) Imagem de contraste de fase com células e gravações da placa Grid

500; (b) Recorte de 200 x 300 “pixels” do canto superior esquerdo. . . . . 11

2.8 - (a) Imagem da microscopia por fluorescência do marcador DAPI; (b)

Recorte de 200 x 300 “pixels” do canto superior esquerdo. . . . . . . . . . . . 12

2.9 - (a) Imagem da microscopia por fluorescência do marcador Texas Red-

C2-Maleimide; (b) Recorte de 200 x 300 “pixels” do canto superior

esquerdo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

3.1 - Imagem binária possuindo dois conjuntos finitos, formados por grupos

de “pixels” de valor igual a 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

3.2 - Elementos individuais e subconjuntos assinalados. . . . . . . . . . . . . . . . . . 14

3.3 - Resultado da superposição dos dois conjuntos do exemplo anterior. . . . . 15

3.4 - Máscaras que demarcam as tetraconexões (esq.) e octaconexões (dir.)

para um dado “pixel” . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

3.5 - Analisando a imagem binária quanto à octaconectividade (acima) e à

tetraconectividade (abaixo) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

3.6 - Exemplos de conjuntos de teste simples. . . . . . . . . . . . . . . . . . . . . . . . . . . 18

3.7 - Erodindo o conjunto A com a máscara 3.6a . Uma das translações do

elemento estruturante que não atende à regra está representada pelo

contorno em azul (com o "pixel" central em roxo) . . . . . . . . . . . . . . . . . . 18

3.8 - Resultados das erosões do conjunto A pelos estruturantes 3.6a (esq.),

3.6b (centro) e 3.6c (dir.) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

3.9 - Resultados das erosões do conjunto B pelos estruturantes 3.6a (esq.),

3.6b (centro) e 3.6c (dir.) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

3.10 - Versões refletidas dos estruturantes da figura 3.6 (giro de 180° em torno

do "pixel" central) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

3.11 - Dilatando o conjunto A com a máscara 3.6a. Uma das translações do

elemento estruturante refletido que não atende à regra está representada

pelo contorno em azul (com o "pixel" central em roxo). . . . . . . . . . . . . . . 20

3.12 - Resultados das dilatações do conjunto A pelos estruturantes 3.6a (esq.),

3.6b (centro) e 3.6c (dir.) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

xii

3.13 - Resultados das dilatações do conjunto B pelos estruturantes 3.6a (esq.),

3.6b (centro) e 3.6c (dir.) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

3.14 - Abrindo o conjunto A com a máscara 3.6a. Uma das translações do

elemento estruturante que atende à regra da etapa de dilatação está

marcada pelo contorno em azul (com o "pixel" central em roxo) . . . . . . . 21

3.15 - Resultados das aberturas do conjunto A pelos estruturantes 3.6a (esq.),

3.6b (centro) e 3.6c (dir.) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

3.16 - Resultados das aberturas do conjunto B pelos estruturantes 3.6a (esq.),

3.6b (centro) e 3.6c (dir.) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

3.17 - Fechando o conjunto A com a máscara 3.6a. Uma das translações do

elemento estruturante que atende à regra da etapa de erosão está

marcada pelo contorno em azul (com o "pixel" central em roxo) . . . . . . . 23

3.18 - Resultados de fechamentos do conjunto A pelos estruturantes 3.6a

(esq.), 3.6b (centro) e 3.6c (dir.) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

3.19 - Resultados de fechamentos do conjunto B pelos estruturantes 3.6a

(esq.), 3.6b (centro) e 3.6c (dir.) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

3.20 - Comparação entre os resultados de erosões. . . . . . . . . . . . . . . . . . . . . . . . 25

3.21 - Comparação entre os resultados de dilatações. . . . . . . . . . . . . . . . . . . . . . 25

3.22 - (a) Imagem binária original; (b) Cena degradada com ruídos do tipo

"sal" e "pimenta"; (c) Cena erodida; (d) Cena dilatada; (e) Cena aberta

morfologicamente; (f) Cena fechada morfologicamente. . . . . . . . . . . . . . 27

4.1 - (a) Imagem de citoplasmas em níveis de cinza. . . . . . . . . . . . . . . . . . . . . 29

4.2 - Superfície gerada a partir da cena em tons de cinza da gravura anterior. . 30

4.3 - Comparação entre as vistas superiores de um sinal estruturante plano (à

esq.) e um não plano (à dir.). Trata-se de um disco plano e uma

semiesfera, ambos com raio de 15 "pixels". . . . . . . . . . . . . . . . . . . . . . . . 30

4.4 – Comparação entre as superfícies geradas pelos sinais estruturantes

exemplificados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

4.5 - Erosão da superfície 4.2 pelo disco plano da gravura 4.3, com vista

superior no detalhe. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

4.6 - Erosão da superfície 4.2 pela semiesfera da gravura 4.3, com vista

superior no detalhe. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

4.7 - Exibição simultânea da superfície original (em vermelho) e da sua

versão erodida. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

4.8 - Exibição simultânea da superfície original e da sua versão dilatada (em

azul) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

4.9 - Exibição simultânea da superfície original (em magenta) e da sua versão

aberta morfologicamente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

4.10 - Exibição simultânea da superfície original e da sua versão fechada

morfologicamente (em ciano) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

4.11 - Superfície original (à esq.) e seu complemento de cinza (à dir.), com

vistas superiores nos detalhes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

xiii

4.12 - Da esquerda para a direita e de cima para baixo, é retratada a evolução

da transformada "watershed", gerando as fronteiras vistas (em magenta)

na última gravura. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

4.13 - Da esquerda para a direita, os variados padrões de níveis geográficos

dos métodos "euclidean", "cityblock", "quase-euclidean" e "chessboard"

da transformada distância. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

4.14 - Complementos em cinza das superfícies geradas pela transformada

distância (à esq.) e pela imposição de mínimos (à dir.) . . . . . . . . . . . . . . . 39

4.15 - Comparação entre a quantidade de mínimos locais no complemento de

cinza da imagem original (à esq.), no da versão operada pela

transformada distância (ao centro) e no da superfície que sofreu

imposição de mínimos (à dir.) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

4.16 - Comparação entre as fronteiras de "watershed" obtidas pela abordagem

usando a transformada distância (à esq.) e a imposição de mínimos (à

dir.) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

5.1 - Diagrama da estrutura da interface gráfica da ferramenta. . . . . . . . . . . . . 42

5.2 - Recorte com uma mensagem de erro exibida ao usuário (acima) e tela

inicial do programa. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

5.3 - Janela principal da ferramenta após o carregamento da foto do campo

A1 da placa Grid 500. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

5.4 - (a) Polígono desenhado (vértices em azul); (b) Máscara; (c) Resultado

da multiplicação elemento a elemento; (d) Região de interesse recortada. 47

5.5 - (a) Imagem em tons de cinza dos núcleos; (b) Cena binarizada; (c) Cena

binarizada após passar pela abertura circular; (d) Resultado da

transformada distância (com mínimos em negro); (e) Fronteiras criadas

entre os núcleos destacadas em magenta. . . . . . . . . . . . . . . . . . . . . . . . . . 50

5.5 - Recorte feito sobre a janela principal para destacar a exposição da fusão

de imagens (com os núcleos identificados em magenta) . . . . . . . . . . . . . . 51

5.6 - Perímetros celulares bem delimitados (em verde) e mal definidos (em

vermelho) convivem no interior de uma mesma amostra. . . . . . . . . . . . . . 52

5.7 - (a) Imagem em tons de cinza dos citoplasmas; (b) Complemento de

cinza da cena dos citoplasmas; (c) Imposição de mínimos locais

utilizando os núcleos identificados como marcadores; (d) Fronteiras das

subdivisões obtidas destacadas em magenta; (e) Concatenação das cinco

primeiras sub-regiões binarizadas localmente; (f) Conclusão da

binarização adaptativa dos citoplasmas. . . . . . . . . . . . . . . . . . . . . . . . . . . 53

5.8 - Exemplo de valores médios e suas incertezas expandidas computados

para um quadrante típico. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

5.9 - Exemplo do gráfico com as curvas mencionadas e "zoom" já aplicado. . . 57

5.10 - Janela principal da interface gráfica com todos os recursos disponíveis já

explorados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

xiv

Lista de Tabelas

5.1 – Evidenciando a melhoria na segmentação dos núcleos conforme a evolução

das abordagens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

1

Capítulo 1

Introdução

1.1 – Tema

O tema do trabalho consiste no desenvolvimento de uma ferramenta de software

capaz de identificar células humanas presentes em imagens de experimentos reais de

culturas em placas de Petri. Assim, pretende-se empregar o método a ser desenvolvido

em metrologia biomédica, auxiliando pesquisadores do INMETRO (Instituto Nacional

de Metrologia, Qualidade e Tecnologia) a aprimorar procedimentos atualmente

realizados de forma manual, lenta e parcialmente subjetiva. Ao final do projeto, também

serão disponibilizados dados que possibilitem estimar as incertezas de medição

relacionadas às grandezas mensuradas.

1.2 – Delimitação

Os objetos de estudo são fotografias de culturas de células humanas mantidas e

fixadas em placas de Petri. A geração de tais imagens ocorreu em microscópios, através

do uso de marcadores biológicos capazes de reagir com proteínas específicas e

presentes em determinadas organelas celulares, evidenciando-as com maior contraste e

diferente coloração nas cenas retratadas. Elas foram gentilmente fornecidas pelo

INMETRO e serão consideradas como as amostras estudadas neste trabalho.

1.3 – Justificativa

A indústria de fármacos e os campos da biomedicina carecem de procedimentos

objetivos, automatizados e que sejam simples para acompanhar a reação de uma cultura

de células quando exposta a drogas em experimentação. Normalmente, laboratórios e

fábricas se veem obrigados a adquirir equipamentos caros de inspeção de imagens junto

a alguns poucos fabricantes para executar tais tarefas de contagem.

2

Dessa forma, este trabalho se insere no contexto explicado visando provar que é

possível elaborar um método alternativo, eficaz e aberto para solucionar problemas de

metrologia biológica.

1.4 – Objetivos

Os principais objetivos a serem alcançados neste trabalho são: (1) avaliar quais

são as ferramentas de morfologia matemática mais adequadas à construção de um

método de análise das amostras fornecidas; (2) criar um procedimento automatizado que

identifique e conte as células presentes nas fotos; (3) gerar um algoritmo para calcular a

área da imagem coberta pelos corpos celulares e (4) desenvolver mecanismos para obter

dados úteis à estimativa de incertezas das grandezas medidas.

1.5 – Metodologia

O trabalho aqui proposto empregará a morfologia matemática, uma teoria que

visa o estudo da forma e costuma servir como complemento às técnicas mais populares

de processamento de imagens. Ela consiste na transformação de uma figura através da

aplicação de um elemento estruturante previamente definido, resultando numa nova

gravura. As operações morfológicas se assemelham aos filtros digitais, mas elas foram

desenvolvidas para processar a informação contida no domínio espacial (ao contrário

das abordagens tradicionais, que são voltadas para o domínio da frequência). Elas se

baseiam do princípio de que uma cena é composta por estruturas, que podem ser

manipuladas via teoria de conjuntos.

O componente fundamental de todas as operações morfológicas básicas é o

elemento estruturante. Ele representa a definição de uma vizinhança de interesse a ser

investigada para cada “pixel” (aglutinação das palavras inglesas “picture” e

“elements”, significando “figura” e “elementos”, respectivamente) existente na imagem

original e o seu formato torna a operação morfológica mais sensível a determinados

arranjos geométricos, incidindo fortemente sobre os padrões detectados. Assim, o valor

do “pixel” gerado na figura resultante corresponde a uma combinação entre o “pixel”

3

analisado na cena original e os seus respectivos vizinhos. Uma vez determinadas quais

as operações morfológicas e os elementos estruturantes que mais impactam

positivamente sobre as amostras fornecidas, será possível encontrar meios adequados de

medir as grandezas alvo.

1.6 – Descrição

O capítulo 2 tem como meta expor o contexto no qual se insere o projeto aqui

descrito, para que o leitor se sinta mais familiarizado e confortável com o tema. No

capítulo 3 serão cobertos os principais tópicos relacionados às operações morfológicas

básicas, porque o seu entendimento através de demonstrações e exemplos há de

contribuir para a compreensão das técnicas avançadas utilizadas no algoritmo.

O capítulo 4 é voltado à apresentação de funções morfológicas de destaque no

pleno funcionamento do método de inspeção de imagens criado. Já o capítulo 5 se

dedica exclusivamente a expor os detalhes da implementação do software, esclarecendo,

simultaneamente, os pontos relacionados à interface gráfica e ao algoritmo de

verificação. Por fim, a última sessão do texto trará luz aos resultados numéricos obtidos,

informando as conclusões mais relevantes feitas por este autor e abrindo espaço para

questionamentos e novas discussões.

4

Capítulo 2

Contextualização

2.1 – Motivação

Células são tidas como a menor parte “viva” de um organismo, sendo objeto de

estudo de uma grande gama de campos da ciência, que abrange áreas como a

biomedicina, a farmácia, a biologia molecular, a genética e a citologia. A metrologia

(que é a ciência da medição e suas aplicações, englobando todos os seus aspectos

teóricos e práticos) voltada para células biológicas é fundamental para o

desenvolvimento de tecnologias de ponta nesses setores, tal como visto na medicina

regenerativa, que se vale da manipulação de células-tronco para a criação de tecidos e

novos órgãos em laboratório.

Assim sendo, o desenvolvimento de um mecanismo habilitado a acompanhar o

comportamento de uma cultura de células permitirá a detecção de mensurandos [1] que

indicarão a proliferação ou redução na população celular, quando exposta a toxinas em

experimentação. Hoje, o processamento digital de imagens é uma ferramenta

amplamente utilizada na confecção de relatórios sobre culturas de células, impactando

fortemente na criação de novos medicamentos e em estudos relacionados a sistemas

biológicos [2].

2.2 – Projeto

Consideradas como a unidade básica de sistemas biológicos, as células são o

ponto central de investigação nos campos científicos da citologia, bioquímica, biologia

molecular e genética. Elas são empregadas em metodologias científicas para a criação

de novas tecnologias, costumeiramente submetidas a procedimentos de medição.

Contudo, a metrologia para avaliação celular é complexa e, segundo estudos recentes do

Bureau Internacional de Pesos e Medidas (“BIPM”, ou originalmente em francês

“Bureau International des Poids et Mesures” [3]), o setor industrial demanda melhorias

de confiabilidade e comparabilidade de resultados, bem como reduções nos custos, no

5

número de testes e no “time to market” (tempo decorrido entre a descoberta e a

comercialização) de novos fármacos [4].

É comum que a análise de cultivos celulares em substratos sólidos careça de

confiança metrológica quando realizada via inspeção de imagens, porque há

indefinições em relação aos mensurandos, baixa rastreabilidade e pouca atenção é dada

às incertezas de medição. Assim sendo, o Instituto Nacional de Metrologia, Qualidade e

Tecnologia (ou “INMETRO” [5]) busca desenvolver, em parceria com o Laboratório de

Sinais, Multimídia e Telecomunicações (ou “SMT-UFRJ” [6]) da Universidade Federal

do Rio de Janeiro, um método automático de verificação de fotos de amostras celulares

que informe mensurandos alvos da indústria farmacológica e que possibilite a

estimativa de suas incertezas associadas.

A densidade superficial de células existentes sobre o substrato e a área ocupada

pelas mesmas numa dada amostra são exemplos de métricas muito úteis em testes

bioquímicos, onde é avaliado se uma droga em experimentação provocou o

crescimento, a redução ou algum outro efeito biológico na população celular em cultura.

Com isso é possível checar a toxicidade de produtos e a eficácia de terapias celulares,

auxiliando a engenharia de tecidos, a realização de diagnósticos e até a regulamentação

na esfera da medicina e da biotecnologia.

Dado que há escasso material de referência para metrologia biológica

direcionada a células e tecidos, os institutos nacionais de metrologia reuniram esforços

para definir o que seria um “mensurando celular rastreável” ao quantificar células. Isso

implicou no levantamento de abordagens que auxiliam na identificação desses

mensurandos, de modo que técnicas de microscopia de fluorescência, espectroscopias,

inspeção de nano e microestruturas, citometria de fluxo e métodos calorimétricos

passam a se destacar. A abordagem escolhida pelo INMETRO se vale do emprego de

células pulmonares fixadas em placas de Petri submetidas a reagentes químicos que

evidenciam determinadas organelas celulares, que são fotografadas com a ajuda de um

microscópio.

As células alvo desse estudo são do epitélio basal de alvéolos humanos e suas

imagens foram cedidas pelo INMETRO ao SMT-UFRJ para o desenvolvimento de um

algoritmo automático de inspeção. Elas pertencem à linhagem celular denominada A-

549 (figura 2.1), originalmente descoberta no começo dos anos 70 após a cultura de

tecido pulmonar canceroso removido de uma mulher enferma [7]. Em pulmões

saudáveis, tais células possuem a função de difundir eletrólitos, água e outras

6

substâncias pela superfície dos alvéolos, que, por sua vez, são responsáveis por executar

as trocas gasosas entre o ar dentro dos pulmões e a corrente sanguínea. Essa linhagem é

realmente popular na comunidade científica para a realização de ensaios de toxicidade

em condições controladas de culturas celulares (um exemplo de artigo que lança mão

disso pode ser encontrado em [8]), sendo, inclusive, recomendada pela norma ISO

10993-5 do ano de 2009 para a elaboração de testes in vitro para citotoxicidade [9] (ou

seja, o quão nociva uma substância é para uma população celular).

Figura 2.1 - Fotos da linhagem celular A-549.

Fonte: Website do fornecedor de insumos para pesquisas [10].

As amostras da linhagem A-549 do INMETRO foram aderidas quimicamente a

placas de Petri que possuem gravações que formam um padrão quadriculado de

tamanho conhecido e aferido, justamente para que seja possível extrair informações

com relação às dimensões das culturas celulares. Foi utilizado o modelo Grid 500, que é

um produto da empresa alemã Ibidi® [11] e segue ilustrado no diagrama da figura 2.2

(existente no próprio site da companhia). É possível ver que há quatro quadrantes

gravados ao centro da placa e cada um é decomposto em 100 quadrados iguais,

formando colunas nomeadas de “A” a “K” e linhas numeradas de um a dez (no caso do

quadrante superior esquerdo). Os quatro quadrantes formam um padrão gravado de 1

cm² ou, ainda, 400 subdivisões quadradas de 0,25 mm² cada.

7

Figura 2.2 - Diagrama do fabricante detalhando as marcações existentes na placa Grid 500.

Fonte: Website do fabricante [12].

A cultura celular é afixada com paraformaldeído na superfície da placa Grid 500

e exposta a dois marcadores biológicos criados para serem absorvidos e concentrados

por organelas celulares distintas. O primeiro se chama DAPI (do fabricante Invitrogen

[13], modelo D1306) e reage apenas com as proteínas da cadeia de DNA, demarcando

fortemente o núcleo da célula. Já o segundo é denominado Texas Red-C2-Maleimide

(provido pela mesma empresa, mas de modelo T6008) e é absorvido por proteínas

totais, evidenciando o citoplasma e, consequentemente, todo o perímetro celular.

Dessa forma, graças a técnicas de microscopia óptica de contraste de fase e de

fluorescência, os colaboradores do INMETRO puderam gerar uma série de imagens que

servirão de sinais de entrada para o sistema descrito pelo algoritmo desenvolvido neste

trabalho. Hoje, o INMETRO utiliza um método especificado em edital internacional

para a inspeção de tais imagens, que são verificadas pelos operadores dos seus

laboratórios. Eles realizam seguidas contagens manuais das células com a ajuda do

software livre ImageJ (desenvolvido no National Institutes of Health do governo norte-

americano [14]), onde é selecionada uma região de interesse (denominada R.O.I., do

inglês “region of interest”) ao se desenhar um polígono sobre a imagem analisada.

Contudo, este método é lento, dado que é preciso contar manualmente os

núcleos dentro da R.O.I. desenhada e também operar várias ferramentas e janelas do

ImageJ, além de ter de ser repetido ao menos três vezes por diferentes indivíduos para

cada amostra, de forma que uma estimativa de incerteza de medição seja inferida. O

algoritmo proposto por este trabalho minimiza a necessidade de interação usuário-

máquina através da automatização do procedimento de segmentação e contagem das

8

células, a partir do fornecimento das imagens das amostras, bem como acelera a entrega

de resultados e de estimativas de incertezas.

Para a realização desse trabalho, foi necessária a escolha de uma ferramenta

computacional capaz de lidar com vários tipos de operações matemáticas, realizar a

leitura e a escrita de arquivos e também apta à manipulação de imagens digitais. Nesse

caso, a opção adotada foi o MATLAB®, que é um produto registrado pela companhia

MathWorks e consiste num ambiente de desenvolvimento interativo para modelagem e

simulação de sistemas [15].

Também podendo ser visto como uma linguagem de programação de alto-nível,

o MATLAB® é capaz de realizar intensos cálculos com matrizes de forma otimizada e

rápida, sendo amplamente utilizado pela comunidade global de engenheiros e cientistas

e dispõe de vasta oferta de bibliotecas e funções para solucionar problemas em muitos

campos de pesquisa aplicada. Tal descrição se encaixa no perfil exigido para este

estudo, uma vez que as fotos das amostras biológicas serão processadas como matrizes

e há livros e artigos ricos em exemplos de processamento digital de imagens usando a

plataforma MATLAB®. Além disso, os pesquisadores e alunos de iniciação científica,

mestrado e doutorado do SMT-UFRJ empregam o MATLAB® em muitas de suas

atividades, sendo natural a construção deste estudo em tal linguagem justamente para

favorecer o surgimento de trabalhos futuros do laboratório que visem dar continuidade à

solução dos problemas relacionados às medições com células humanas no INMETRO.

Uma imagem é aqui entendida como uma matriz bidimensional onde cada um de

seus elementos possui um valor numérico, definido de acordo com uma escala a

representar o nível de iluminação do ponto observado na cena real. Alguns tipos

comuns de imagens são: binárias, cuja gama de valores possíveis para os elementos

corresponde apenas a 0 ou 1; em tons de cinza, cujos níveis de iluminação são

traduzidos na faixa de 0 a 255; e coloridas, onde é geralmente empregado um trio de

valores (também compreendidos entre 0 e 255 cada) que indica a intensidade das

componentes de cores primárias para cada ponto da figura. Este trabalho lida

unicamente com os dois primeiros tipos e seguem exemplos dos mesmos nas figuras 2.3

e 2.4.

9

Figura 2.3 - Explicitando os valores numéricos dos 63 elementos de uma imagem binária de 7 linhas e 9 colunas.

Figura 2.4 - Evidenciando os valores contidos em uma imagem em tons de cinza.

Dentro desse contexto, o numeral 0 é costumeiramente associado à falta de luz,

indicando, portanto, um ponto negro (ou de preto absoluto) na cena. Já o valores 1 ou

255 explicitam um ponto repleto de luz (ou de branco absoluto) nas imagens binárias ou

em tons de cinza, respectivamente. Como é possível observar na imagem em tom de

cinza da figura 2.4, elementos com valores intermediários terão intensidade de brilho

diretamente proporcional à faixa total de 0 a 255 (diferentemente das imagens binárias

onde só há pontos totalmente negros ou completamente brancos).

É válido comentar que esses dois tipos de imagens são implementados de formas

diferentes na ferramenta computacional MATLAB®. As imagens em tons de cinza são

matrizes de números inteiros e sem sinal, comumente representados por 8 “bits”

(nomeado “uint8”) e, assim, limitados a 256 valores possíveis (que é justamente a faixa

de 0 a 255 já mencionada). Apesar de pouco usual, também é possível utilizar 16 “bits”

10

para essa representação (“uint16”, por sua vez), permitindo até 65.536 variados níveis

de cinza, onde se torna muito mais sutil a distinção entre tons com valores numéricos

próximos e o branco absoluto é representado por 65.535, tal como é visto na

comparação da figura 2.5.

Figura 2.5 - Representação das escalas de tons de cinza em 8 “bits” (à esquerda) e em 16 “bits” (à direita).

Contudo, para fins de cálculos e processamento digital, é necessário converter

tais números inteiros para o tipo de dupla precisão (conhecido como “double”), dado

que as operações aritméticas não estão definidas em MATLAB® para matrizes de

inteiros sem sinal. Dessa maneira, utilizam-se 64 “bits” (ao invés de 8) na

representação de cada elemento da matriz que guarda a cena analisada, resultando numa

faixa numérica compreendida entre 0,0 e 1,0 em ponto flutuante para cada elemento

matricial.

Figura 2.6 - Imagem concebida após a conversão da figura 2.4 para o tipo de dupla precisão.

11

Os arquivos fornecidos pelo INMETRO com imagens de experimentos reais de

culturas de células fixadas se encontram no formato “TIFF” (“Tagged Image File

Format”, significando “formato de arquivo de imagens etiquetadas”). Este formato é

popular nas indústrias de publicação e fotografia digital, pois possibilita compressões

com ou sem perdas, emprega 8 ou 16 “bits” por canal de cor e consegue reunir imagens

com múltiplas camadas (“layers”) em um só arquivo [16]. Atualmente sob o controle

da Adobe Systems Inc., o formato “TIFF” se tornou um sólido padrão para

armazenamento de dados em dispositivos de captura de imagens, tais como “scanners”,

máquinas fotográficas e microscópios [17], o que explica o uso de arquivos “TIFF”

neste estudo.

Conforme explicado anteriormente, foram geradas três categorias diferentes de

imagens, de acordo com a técnica de microscopia ótica empregada e o marcador

biológico focalizado. A primeira delas diz respeito à observação por contraste de fase,

que permite aos colaboradores do INMETRO enxergar as subdivisões e marcações da

placa Grid 500 e também todas as células fixadas. Já a segunda categoria se vale da

microscopia por fluorescência direcionada ao marcador biológico DAPI, possibilitando

o registro das regiões onde há a presença de material genético celular e evidenciando

apenas os núcleos na cena. Semelhantemente, a terceira lança mão da mesma técnica de

visualização, mas voltada ao Texas Red-C2-Maleimide, que demarca todo o citoplasma

celular. É possível conferir exemplos e detalhes de uma amostra fotografada por essas

três abordagens nas seis gravuras em tons de cinza que seguem (com todas apresentando

uma resolução de por “pixel”).

Figura 2.7 - (a) Imagem de contraste de fase com células e gravações da placa Grid 500; (b) Recorte de 200 x 300

“pixels” do canto superior esquerdo.

12

Figura 2.8 - (a) Imagem da microscopia por fluorescência do marcador DAPI; (b) Recorte de 200 x 300 “pixels” do

canto superior esquerdo.

Figura 2.9 - (a) Imagem da microscopia por fluorescência do marcador Texas Red-C2-Maleimide; (b) Recorte de 200

x 300 “pixels” do canto superior esquerdo.

Neste momento, o leitor já se encontra familiarizado com o tema e compreende

a importância do problema (a ser solucionado pelo presente estudo) perante as

necessidades dos campos de biotecnologia e foi introduzido aos procedimentos e

instrumentos envolvidos tanto na elaboração das amostras biológicas quanto em sua

verificação. Nos capítulos 3 e 4, serão abordados os tópicos que tratam do principal

conceito empregado nesta pesquisa, que é a morfologia matemática. Por sua vez, no

capítulo 5 serão efetivamente descritos os detalhes do algoritmo de automatização

criado, incluindo explicações sobre as decisões de projeto e dificuldades encontradas ao

longo do seu desenvolvimento.

13

Capítulo 3

Morfologia Matemática aplicada a

Imagens Binárias

3.1 – Conceitos

A necessidade de discriminar e contabilizar elementos presentes numa cena é

um problema recorrente em processamento de imagens. Extrair informações relevantes

a partir de uma cena não é uma tarefa simples, havendo diversas abordagens plausíveis

para obter a solução, sendo a segmentação de imagens uma delas. Tal processo consiste

em particionar a imagem em grupos de “pixels” que têm propriedades em comum,

rotulando categorias que ajudam a distinguir os objetos retratados [18].

Para realizar essa separação, pode-se empregar a morfologia matemática, que é

uma teoria que visa o estudo da forma e costuma servir como complemento às técnicas

mais comuns de processamento de imagens. Ela consiste na transformação de uma

imagem através da aplicação de um elemento estruturante previamente definido,

resultando numa nova gravura. A morfologia matemática vem ganhando destaque no

campo de processamento digital de imagens e viu sua popularidade crescer na última

década, passando a ser incluída nas bibliotecas de funções de programas de análise de

figuras.

As operações morfológicas se assemelham aos filtros digitais e foram

desenvolvidas para processar a informação contida no domínio espacial (ao contrário

das abordagens tradicionais, que são projetadas no domínio da frequência). Elas se

baseiam no princípio de que uma cena é composta por estruturas, que podem ser

manipuladas via teoria de conjuntos [19]. No caso de imagens binárias, conjuntos são

compreendidos como grupos de “pixels” que atendem a uma mesma condição. Para

uma maior ambientação do leitor, a seguir são expostos os conceitos primários de teoria

de conjuntos já aplicados ao referido tipo de imagem.

14

Figura 3.1 - Imagem binária possuindo dois conjuntos finitos, formados por grupos de “pixels” de valor igual a 1.

Figura 3.2 - Elementos individuais e subconjuntos assinalados.

Observando a figura 3.2, identificando o “pixel” verde como “ ” e o amarelo

como “ ” e nomeando o conjunto da esquerda como conjunto “ ” e o da direita como

“ ”, diz-se que “ é um elemento de ” (o que é expresso pela notação ) e “ é

um elemento de ” ( ). Analogamente, os subconjuntos assinalados em vermelho

e em roxo estão contidos, respectivamente, em e em (sendo e ).

15

Figura 3.3 - Resultado da superposição dos dois conjuntos do exemplo anterior.

Já na figura 3.3b, nota-se que a superposição dos pontos centrais dos conjuntos

e gerou uma união entre esses eles ( ), formando um novo conjunto ao qual

pertencem todos os “pixels” brancos da cena. Em verdade, vale esclarecer que o grupo

de sete “pixels” azuis não se trata rigorosamente do conjunto anterior, mas apenas de

um terceiro conjunto, pois, ainda que disponha do mesmo formato e número de

elementos de , ele está localizado em posição diferente do conjunto original

(assumindo-se que o conjunto da figura 3.3b é o mesmo, imutável desde a figura 3.1).

Os “pixels” hachurados indicam a região onde há a intersecção dos dois conjuntos

( ) que, por si só, constitui um subconjunto da união de e (o que é descrito por

).

Sejam e os conjuntos formados, nessa ordem, por todos os “pixels” de valor

igual a 1 e de valor igual a 0 presentes na figura 3.3b, é dito que complementa (isto

é, ) e complementa (logo, ). Aqui é definido como o plano

principal onde está contida a informação relevante da imagem binária analisada, a ser

chamado de “foreground”, e é tido apenas como um plano de fundo sobre o qual

estão os objetos em verificação, doravante tachado de “background”. Logo, essa

relação implica no fato de que toda operação realizada sobre também acarreta

mudanças em , de modo que a alteração do valor binário de um “pixel” branco só

pode gerar um “pixel” preto e vice-versa.

Um aspecto importante a ser destacado é o conceito de conectividade ao lidar

com regiões de “pixels”, porque ele influencia diretamente o entendimento de formação

de conjuntos em imagens binárias, por exemplo. A ideia central é a de que há duas

topologias distintas para descrever quando “pixels” próximos podem ser considerados

como conectados e pertencentes a um mesmo conjunto. Seja um “pixel” localizado na

16

vizinhança de um “pixel” , eles são considerados tetraconexos (neologismo criado por

este autor para a expressão inglesa “4-connected” do livro [20]) se forem adjacentes na

direção vertical ou horizontal. Caso ocupe qualquer lugar no entorno de , tanto na

vertical, como na horizontal, quanto nas direções diagonais; o par de “pixels” será

octaconexo (palavra concebida para traduzir o termo original “8-connected”).

Figura 3.4 - Máscaras que demarcam as tetraconexões (esq.) e octaconexões (dir.) para um dado “pixel”.

Todo “pixel” de valor unitário gerado nas posições em amarelo será tetraconexo

ao “pixel” branco da figura 3.4a. O mesmo vale para as posições em roxo da figura

3.4b, que ilustram onde estariam os “pixels” octaconexos ao “pixel” branco. Por

definição, um elemento do conjunto não pode ser tetra ou octaconexo a elementos do

conjunto (e a recíproca é verdadeira), dado que possuem valores numéricos distintos.

Visualmente, é notório que todo par tetraconexo também será octaconexo, pois a

máscara roxa contém a amarela quando da superposição dos seus pontos centrais.

Analogamente, uma região é dita como tetraconexa se, para todo par de “pixels”

e pertencentes a ela e a , houver uma sequência finita de “pixels” que sejam

tetraconexos ao seu antecessor na referida sequência (que começa em e termina em

). Enunciado similar define as regiões octaconexas. As mesmas regras podem ser

aplicadas ao conjunto , mas isso é pouco relevante porque ele representa apenas o

“background” das cenas vistas neste estudo.

Uma imagem binária pode ser encarada como uma união de regiões conectadas.

A cena é composta por objetos, retratados como componentes tetra ou octaconexos. Um

componente é formado quando uma região se mostra maximamente conexa, sem

permitir que haja subconjuntos conexos dentro de si. A imagem binária da figura 3.5a

possui dois objetos (um em vermelho e outro em roxo), que são componentes

octaconexos gerados por duas regiões maximamente conectadas. Já na figura 3.5b, a

17

perspectiva muda, uma vez que a cena agora é vista como a união de oito regiões

maximamente conectadas a formar componentes tetraconexos, resultando em não dois,

mas oito objetos no cenário.

Figura 3.5 - Analisando a imagem binária quanto à octaconectividade (acima) e à tetraconectividade (abaixo).

Perceba que estas descrições de conectividade são sutilmente diferentes da

definição euclidiana para conjuntos conexos, onde dois conjuntos são conexos se, para

todo par de elementos e pertencentes aos conjuntos há um caminho contínuo

(geralmente uma função contínua) que começa em e termina em sem nunca deixar

o interior dos conjuntos. Em todo o caso, a octaconectividade foi adotada neste texto

como o padrão para a interpretação dos objetos retratados nas imagens binárias.

Em morfologia matemática, usam-se as mais variadas máscaras para descobrir

se cada “pixel” da cena atende a uma determinada regra, tal como feito na análise de

conectividade. Essas máscaras funcionam como conjuntos de teste tais como os

expostos na figura 3.6, sendo úteis para investigar o formato dos objetos existentes nas

imagens em verificação. Tendo em mente os dois objetos presentes na figura 3.5a (isto

é, os já apresentados conjuntos e ), pode haver translações dos conjuntos de teste

(referenciadas aos “pixels” centrais, que estão assinalados em roxo na figura 3.6) que

18

permitam checar se eles estarão ou não contidos em ou em . E essa conclusão

dependerá exclusivamente das formas, tanto das máscaras, quanto dos objetos da cena.

Figura 3.6 - Exemplos de conjuntos de teste simples.

A essas máscaras dá-se o nome de elementos estruturantes. Eles têm a sua

localização (sobre a cena analisada) descrita pelo “pixel” central e podem ser ditos

como assimétricos (como em 3.6a e 3.6b) ou simétricos (vide 3.6c) em relação ao seu

centro. Uma vez definido um elemento estruturante, não é permitido que seu formato,

tamanho ou orientação sejam alterados durante os cálculos de morfologia matemática.

A operação morfológica fundamental é a erosão, que translada o “pixel” central

de um elemento estruturante informado até todas as posições ocupadas pelos “pixels”

dos objetos da cena, checando, caso a caso, se o elemento estruturante inteiro estaria

contido nesses objetos ou não. O resultado da erosão de uma imagem é uma nova

imagem, onde restarão no “foreground” apenas os “pixels” dos objetos originais onde

“coube” a versão transladada do elemento estruturante.

Na figura 3.7, há um detalhamento em verde indicando onde residem as

translações válidas do conjunto de teste exibido em 3.6a quando aplicado sobre o

conjunto visto em 3.5a. Por sua vez, os “pixels” tingidos de vermelho mostram as

posições onde a translação da máscara usada não atende à regra da erosão.

Figura 3.7 - Erodindo o conjunto com a máscara . Uma das translações do elemento estruturante que não

atende à regra está representada pelo contorno em azul (com o “pixel” central em roxo).

19

Ao erodir o conjunto usando os estruturantes da figura 3.6, percebe-se na

figura 3.8 que os “pixels” originais da cena que falharam ao “abrigar” a máscara de

erosão foram excluídos da imagem final. O mesmo valerá para a erosão do conjunto

por tais estruturantes. Mas, dessa vez, nenhum elemento do conjunto conseguirá

atender ao critério, acarretando no completo desaparecimento do objeto original na cena

final. Essa é uma característica interessante da erosão morfológica que é explorada em

técnicas de redução de ruído, pois agrupamentos de “pixels” que tenham dimensões

próximas às do elemento estruturante utilizado estarão fadadas a serem removidas da

imagem.

Figura 3.8 - Resultados das erosões do conjunto pelos estruturantes 3.6a (esq.), 3.6b (centro) e 3.6c (dir.).

Figura 3.9 - Resultados das erosões do conjunto pelos estruturantes 3.6a (esq.), 3.6b (centro) e 3.6c (dir.).

A operação complementar à erosão chama-se dilatação, que pode ser definida

como o complemento da erosão aplicada a todos os “pixels” do “background” (que

formam o conjunto complementar aos objetos da cena) utilizando uma versão refletida

(aplicando uma rotação de 180°) do estruturante em questão. Seja a notação matemática

para a erosão de um conjunto por um elemento estruturante dada por , a

operação de dilatação desse objeto pelo mesmo estruturante será denotada por:

20

Figura 3.10 - Versões refletidas dos estruturantes da figura 3.6 (giro de 180° em torno do “pixel” central).

Uma segunda maneira de se imaginar a operação de dilatação é pensar em

transladar a versão refletida do elemento estruturante sobre todas as posições dos

“pixels” do “background”, checando, caso a caso, se há ao menos um “pixel” da

máscara acima de algum “pixel” do “foreground”. Abaixo consta o exemplo de

dilatação do conjunto pela máscara 3.6a. Semelhantemente à situação da erosão, está

delimitado em verde o grupo de posições das translações válidas do estruturante,

caracterizando um acréscimo de perímetro no objeto dilatado. Na sequência, são

expostas as versões dilatadas dos conjuntos e utilizando os elementos estruturantes

da figura 3.6.

Figura 3.11 - Dilatando o conjunto com a máscara 3.6a. Uma das translações do elemento estruturante refletido que

não atende à regra está representada pelo contorno em azul (com o “pixel” central em roxo).

Figura 3.12 - Resultados das dilatações do conjunto pelos estruturantes 3.6a (esq.), 3.6b (centro) e 3.6c (dir.).

21

Figura 3.13 - Resultados das dilatações do conjunto pelos estruturantes 3.6a (esq.), 3.6b (centro) e 3.6c (dir.).

Quando uma imagem é submetida a uma erosão e, depois, a uma dilatação pelo

mesmo elemento estruturante, é dito que foi realizada uma operação de abertura,

explicitada na equação abaixo. Alternativamente e partindo da versão já erodida da

imagem original, o resultado da abertura pode ser pensado como a união de todas as

translações (sobre os “pixels” restantes após a erosão) da mesma máscara que estejam

contidas no “foreground” da imagem original. A figura 3.14 resgata o conjunto e

demonstra como seria a aplicação de uma abertura pelo estruturante 3.6a, retratando a

operação no momento da etapa de dilatação. Já nas figuras 3.15 e 3.16, há uma

comparação entre as aberturas dos conjuntos e obtidas com diferentes elementos

estruturantes.

Figura 3.14 - Abrindo o conjunto com a máscara 3.6a. Uma das translações do elemento estruturante que atende à

regra da etapa de dilatação está marcada pelo contorno em azul (com o “pixel” central em roxo).

22

Dado o conhecido conjunto , estão representados em branco na figura 3.14 os

“pixels” resultantes da sua erosão pelo estruturante 3.6a; em azul foi demarcada uma

translação válida do elemento estruturante da dilatação imposta aos “pixels” brancos; já

os pintados de verde indicam as posições que atendem à regra dessa dilatação. Por fim,

em vermelho se encontram os “pixels” que não atendem a essa regra e serão eliminados

do “foreground” após a abertura. A imagem aberta será constituída pela união dos

“pixels” brancos com os verdes e é vista na figura 3.15.

Repare que não há mais “pixels” de “foreground” nos resultados da abertura do

conjunto , pois todos os “pixels” brancos foram eliminados já na etapa de erosão

existente no começo da operação de abertura. Geralmente, aplicar a abertura

morfológica sobre uma imagem leva à exclusão de “pixels” do “foreground” presentes

em vértices, bordas e istmos (ou apêndices) dos objetos retratados. Ainda que menos

“destrutiva” que uma erosão, a abertura tende a remover os componentes da imagem

original cujo formato não se assemelhe ao do elemento estruturante usado e isso fica

nítido nos resultados exibidos a seguir (note como as aberturas pelos dois primeiros

estruturantes eliminaram o “pixel” mais ao sul do conjunto e no terceiro caso o

mesmo não ocorreu, uma vez que o elemento estruturante 3.6c também possui um

formato com um “pixel” único na sua linha inferior).

Figura 3.15 - Resultados das aberturas do conjunto pelos estruturantes 3.6a (esq.), 3.6b (centro) e 3.6c (dir.).

Figura 3.16 - Resultados das aberturas do conjunto pelos estruturantes 3.6a (esq.), 3.6b (centro) e 3.6c (dir.).

23

Assim como a erosão, a abertura morfológica também conta com uma função

dual, conhecida como operação de fechamento, que é definida ao se dilatar uma imagem

e, em seguida, erodir o resultado utilizando elementos estruturantes iguais. A expressão

que descreve esse processo e alguns exemplos podem ser conferidos logo abaixo.

Figura 3.17 - Fechando o conjunto com a máscara 3.6a. Uma das translações do elemento estruturante que atende à

regra da etapa de erosão está marcada pelo contorno em azul (com o “pixel” central em roxo).

Retornando ao conjunto e ao uso do estruturante 3.6a, percebe-se que a

dilatação no início do processo resulta na união dos “pixels” assinalados em verde,

amarelo e vermelho. Tal conjunto é submetido à etapa de erosão, de forma que suas

posições são testadas, checando se a translação do elemento estruturante da erosão

estaria totalmente contida no conjunto ou não. Os locais indicados pela cor vermelha

denunciam onde o atendimento à regra da erosão falha e as cores verde e amarela

mostram as posições das translações válidas. Em especial, a região em amarelo traduz o

ganho de perímetro comumente observado nos objetos da cena ao se valer da operação

morfológica de fechamento.

Isso acontece porque o fechamento tende a eliminar do “background” os

conjuntos que não possuírem formato semelhante ao do elemento estruturante usado,

implicando em incrementos no “foreground”. O “pixel” amarelo na figura 3.17

evidencia essa questão, pois ele pertence ao “background” da cena e tem um formato

de “pixel” único do qual o estruturante 3.6a não partilha, sendo removido (ou seja, ele

passa do “background” para o “foreground”). Na imagem obtida após o fechamento do

famigerado conjunto pela estrutura 3.6c também fica clara essa ideia (vide a figura

24

3.18), dado que a máscara dispõe de um “pixel” solitário na sua parte inferior e acaba

não removendo do “background” aquele “pixel” (da posição em amarelo).

Outra observação relevante é que, independentemente do elemento estruturante

escolhido, o fechamento morfológico teve pouco impacto sobre o conjunto (o que é

facilmente constatado nas fotos em 3.19), graças à inexistência de reentrâncias

(entenda-se curvas ou ângulos) na sua envoltória e/ou de buracos em seu interior (pois o

conjunto é um simples segmento de reta). Estas duas situações costumam ser alvos

fáceis para a operação de fechamento, que visa suavizar as fendas presentes nas bordas

dos objetos e preencher os orifícios (de dimensões menores que as do estruturante)

dentro dos componentes conexos do “foreground”.

Figura 3.18 - Resultados de fechamentos do conjunto pelos estruturantes 3.6a (esq.), 3.6b (centro) e 3.6c (dir.).

Figura 3.19 - Resultados de fechamentos do conjunto pelos estruturantes 3.6a (esq.), 3.6b (centro) e 3.6c (dir.).

Agora que as operações morfológicas básicas foram apresentadas ao leitor, é

factível uma discussão sobre as suas propriedades algébricas e quais as suas

contribuições para a construção de técnicas de filtragem de imagens.

Uma diferença interessante em termos de propriedades é que a dilatação é

comutativa e a erosão não. A comutatividade nesse caso é compreendida como a

possibilidade de executar uma operação com papéis invertidos, onde o elemento

estruturante passa a ser encarado como o objeto principal e os componentes conexos da

25

cena são tidos como os estruturantes. Devido à própria natureza do problema de

processamento de imagens, é usual que os elementos estruturantes sejam menores que

os objetos presentes na cena analisada. Logo, fica fácil perceber porque a erosão não é

comutativa; dado que ao tentar erodir um elemento estruturante usando um componente

conexo maior que ele, o resultado será um “foreground” completamente nulo e isso é

diferente do que restará na imagem erodida no caso tradicional.

Esse pensamento foi ilustrado na figura 3.20, que ressalta a diferença entre os

resultados obtidos para o conjunto erodido pelo estruturante 3.6a e para o estruturante

3.6a erodido pelo conjunto . Perceba na gravura 3.21 que a comutação entre objeto

alvo e elemento estruturante na dilatação de fato entrega resultados iguais, validando a

propriedade de comutatividade da dilatação, ou seja:

Figura 3.20 - Comparação entre os resultados de (esq.) e de (dir.), sendo “ ” o estruturante 3.6a.

Figura 3.21 - Comparação entre os resultados de (esq.) e de (dir.), sendo “ ” o estruturante 3.6a.

A dilatação também exibe a propriedade da associatividade, de forma que uma

imagem pode ser dilatada seguidamente por elementos estruturantes diferentes e,

independentemente da ordem em que forem utilizados os estruturantes, a cena final será

sempre a mesma, tal como expresso por:

26

Tanto a erosão, quanto a dilatação são invariantes à translação dos objetos, no

sentido de que transladar o “foreground” da imagem por certa quantidade e submetê-

lo à operação morfológica gera uma cena idêntica a aplicar a operação e, em seguida,

transladar o novo “foreground” pelo mesmo montante. Graças à sua comutatividade, a

dilatação usufrui ainda da invariância à translação do elemento estruturante, implicando

em:

Ambas as operações são tidas como monotonicamente crescentes, haja vista que

se um grupo de componentes conexos é um subconjunto da cena, as suas versões

erodidas ou dilatadas continuarão a estar contidas na cena totalmente erodida ou

dilatada, respectivamente.

Por último, enquanto a dilatação é tida como extensiva, porque o objeto original

constituirá um subconjunto de sua versão dilatada, a erosão é classificada como

antiextensiva, pois o componente originalmente erodido englobará o resultado da

operação, a ver:

As outras duas operações morfológicas básicas demonstram algumas dessas

propriedades algébricas. A abertura satisfaz a invariância à translação, é

monotonicamente crescente e anti-extensiva; já o fechamento atende à invariância à

translação, é monotonicamente crescente e extensiva. Mas a característica mais

marcante de abertura e fechamento morfológicos é a idempotência, que dá nome à

capacidade de aplicar certos operadores matemáticos repetidamente sobre uma variável

sem permitir que o resultado obtido mude depois da primeira execução. Ou seja:

( )

27

Essas propriedades implicarão em diferenças consideráveis no comportamento

de cada uma das quatro operações morfológicas básicas quando do seu uso em filtros de

imagens. Para encerrar este segundo capítulo, o leitor é convidado a conferir a

comparação a seguir, no qual são relatados os efeitos provocados pela erosão, dilatação,

abertura e fechamento sobre uma cena propositalmente contaminada com ruídos do tipo

“pepper noise” (pontos negros dentro dos objetos brancos) e “salt noise” (pontos

brancos sobre o fundo negro), ambos muito comuns em imagens necessitando de

restauração.

Figura 3.22 - (a) Imagem binária original; (b) Cena degradada com ruídos do tipo “sal” e “pimenta”; (c) Cena

erodida; (d) Cena dilatada; (e) Cena aberta morfologicamente; (f) Cena fechada morfologicamente.

28

Para todos os casos, foi empregado um estruturante com formato de losango

com 3 “pixels” de aresta e 13 “pixels” totais. De uma maneira geral, a erosão é

responsável pela eliminação dos conjuntos de “foreground” que tenham dimensões

menores ou próximas às do elemento estruturante usado, praticamente liquidando com o

“salt noise”. Ao mesmo tempo em que ela tende a reduzir as protuberâncias do

contorno dos componentes conexos, a erosão se fez presente no interior deles,

ampliando os furos criados pela adição de “pepper noise”.

Em contrapartida, a dilatação acarreta no aumento da área ocupada por “pixels”

brancos, o que auxilia o preenchimento dos furos do interior dos objetos da cena, porém

potencializa o problema causado pelo ruído de “sal”. Repare que os buracos

pertencentes à cena original também reduziram de tamanho, do mesmo modo em que

houve o estreitamento de fendas, prejudicando o processo de restauração.

Para a imagem aberta morfologicamente, é visível que a supressão do “salt

noise” foi tão boa quanto à efetuada pela erosão, mas contando com maior rejeição ao

“pepper noise”. Analogamente, fechar morfologicamente a gravura erradicou o ruído

de “pimenta”, tal como observado no caso da dilatação, e não piorou tanto a

contaminação por ruído de “sal” como se enxerga na versão dilatada. O contraponto é

que, ainda que as bordas dos componentes conexos sejam melhor preservadas quando se

opta pela restauração através da abertura ou do fechamento morfológico, deve-se ter em

mente que apêndices verdadeiros se perderam ou istmos falsos se formaram após abrir

ou fechar morfologicamente a cena, respectivamente.

Com esse último exemplo, o autor espera ter despertado a atenção do leitor para

a utilidade das operações morfológicas mais simples perante os algoritmos de

processamento digital de imagens, além do reconhecimento do valor que elas possuem

enquanto ferramentas.

29

Capítulo 4

Operações sobre Imagens em Tons de

Cinza

4.1 – Conceitos

Conforme mencionado, este quarto capítulo foi escrito para elucidar o

funcionamento de operações morfológicas quando aplicadas diretamente às cenas em

níveis de cinza. Como o leitor já se encontra ambientado com as bases da teoria de

morfologia matemática, o autor conduzirá os próximos tópicos de maneira mais direta.

Diferentemente do que ocorre em imagens binárias, nas figuras em tons de cinza

se atribui para cada “pixel” um valor numérico dentro de uma faixa que traduz a

luminosidade daquele ponto, variando gradativamente do preto ao branco. Logo, cada

elemento presente na gravura é totalmente descrito por um trio de valores, composto

pelos índices da coluna e da linha que ocupa e pelo nível de cinza representado. Isso

possibilita visualizar a imagem como uma superfície, o que é exemplificado a seguir.

Figura 4.1 - (a) Imagem de citoplasmas em níveis de cinza.

30

Figura 4.2 – Superfície gerada a partir da cena em tons de cinza da gravura anterior.

Prontamente nota-se que as regiões mais claras produzem relevos mais

elevados, uma vez que a altura é determinada pelo valor numérico de luminosidade de

cada ponto. Se antes uma foto era vista como um sinal em duas dimensões, agora ela

passa a ser considerada também como um sinal tridimensional.

Um sinal tridimensional é dito como matematicamente “debaixo” de uma

superfície se o domínio de for um subconjunto do domínio de (ou seja, todo ponto

pertencente ao domínio também está contido em ) e o valor numérico

em todos os pontos de é menor ou igual a (que é a altura da superfície em

todos os pontos ).

Analogamente ao caso das imagens binárias, pode-se definir um sinal

estruturante como uma superfície cujo domínio é geralmente simétrico e referenciado

em seu centro. Porém, há dois grupos de sinais estruturantes: o daqueles com relevo

plano e o dos com relevo não plano. O primeiro é aquele constituído por sinais cujos

pontos em seu domínio sempre apresentam altura unitária; já o segundo grupo exibe

variações de altura ao longo do seu perfil.

Figura 4.3 – Comparação entre as vistas superiores de um sinal estruturante plano (à esq.) e um não plano (à dir.).

Trata-se de um disco plano e uma semiesfera, ambos com raio de 15 “pixels”.

31

Figura 4.4 – Comparação entre as superfícies geradas pelos sinais estruturantes exemplificados.

Reparando com atenção, vê-se que os sinais estruturantes planos remetem muito

ao formato dos elementos estruturantes binários (cobertos no capítulo 3). Por

conseguinte, o seu emprego em operações morfológicas é costumeiramente abordado tal

como se fossem máscaras binárias. Através de translações válidas, utiliza-se o domínio

do sinal estruturante plano para inspecionar as alturas da superfície da imagem de cinza

posicionada sobre ele, realizando uma transformação cujo resultado será salvo (na

imagem de saída) na posição correspondente ao centro do domínio do estruturante.

As regras a dizer quais são as translações válidas do sinal estruturante e a

transformação efetuada variarão de acordo com a operação morfológica em questão. A

título de exemplo, a erosão em escala de cinza define as translações válidas para um

sinal estruturante plano como aquelas em que o centro do domínio dele ocupa todo e

qualquer lugar dentro do domínio da superfície de cinza. Então, para cada translação

válida, busca-se qual é o menor tom de cinza da superfície sobre o domínio do

estruturante, transformando a cena original em sua versão erodida.

Figura 4.5 – Erosão da superfície 4.2 pelo disco plano da gravura 4.3, com vista superior no detalhe.

32

Evidentemente, ao se transladar o centro do domínio dos sinais estruturantes

pelo plano cartesiano , a sua superfície também será transportada junto. E é assim

que se inicia a compreensão da aplicação de sinais estruturantes não planos às imagens

de tons de cinza; porque só ocorrerá uma translação válida quando a superfície do sinal

estruturante não plano estiver matematicamente “debaixo” da superfície de cinza

verificada. Nos locais das translações válidas, a superfície do estruturante será

“elevada” (entenda-se “será acrescentado um offset à sua curva”) até que algum dos

seus pontos toque a superfície da imagem analisada. A quantidade de elevação aplicada

(ou seja, o valor do offset acrescentado) será o tom de cinza na gravura de saída no

ponto referente ao centro do domínio do estruturante. Para facilitar, visualize a

superfície do estruturante sendo “rolada” por baixo de toda a superfície alvo; as alturas

alcançadas pelo centro do estruturante ditarão até onde irá a erosão, que será diferente

daquela obtida com um estruturante plano.

Figura 4.6 – Erosão da superfície 4.2 pela semiesfera da gravura 4.3, com vista superior no detalhe.

Perceba como a erosão de uma imagem em tons de cinza através de um sinal

estruturante não plano pode ser bem menos acentuada do que aquela causada por um

análogo plano. Isso aconteceu porque a superfície do estruturante não plano se adequou

melhor às nuances da superfície de cinza analisada. Para encerrar este tópico, segue uma

cena expondo a grande diferença entre o relevo original da superfície de cinza da

gravura 4.2 e o da sua versão erodida pelo sinal estruturante plano.

33

Figura 4.7 – Exibição simultânea da superfície original (em vermelho) e da sua versão erodida.

Esses conceitos e constatações são fundamentais para o estudo das operações

morfológicas em níveis de cinza e se estendem diretamente para a dilatação, a abertura e

o fechamento. No caso da dilatação, a ideia é muito próxima à da erosão, bastando

trocar o sinal estruturante por sua versão refletida em relação ao seu centro e realizar a

busca pelo valor de cinza máximo presente na superfície ao tentar “acomodar” o

estruturante refletido “por cima” da superfície original.

Para a abertura ou o fechamento, é só imaginar o que aconteceria à superfície de

cinza ao se aplicar a erosão seguida da dilatação ou a dilatação sucedida pela erosão. E

as conclusões serão as mesmas do caso binário: a erosão remove todas as ondulações da

superfície da imagem que tiverem volume próximo ao do sinal estruturante; a dilatação

promove ganho de volume e o surgimento de saliências indesejadas; a abertura preserva

o relevo, mas tende a desconectar regiões onduladas próximas; e o fechamento também

conserva o perfil, mas é propenso a unir formações salientes vizinhas. Abaixo estão as

representações de tais operações morfológicas para o exemplar estudado na erosão.

Figura 4.8 – Exibição simultânea da superfície original e da sua versão dilatada (em azul).

34

Figura 4.9 – Exibição simultânea da superfície original (em magenta) e da sua versão aberta morfologicamente.

Figura 4.10 – Exibição simultânea da superfície original e da sua versão fechada morfologicamente (em ciano).

Em aplicações onde ruídos visuais não representam um ponto crítico dentro do

problema a ser solucionado (como no caso das amostras usadas neste projeto), é

possível obter imagens binárias a partir de versões limiarizadas das cenas em tons de

cinza originais. Existem várias formas de binarizar uma imagem, por meio da inspeção

do histograma dos níveis de cinza, por exemplo, mas aqui será discutido apenas o

método de Otsu, que é de grande utilidade para o funcionamento do algoritmo

desenvolvido neste projeto.

O método de Otsu se responsabiliza por investigar os tons de cinza presentes na

cena que se deseja converter para uma imagem binária e por sugerir um limiar

(“threshold”) para a binarização, segregando eficientemente os valores de cinza que

possivelmente representam informação útil (e que deverão estar no “foreground”)

daqueles que têm pouco a oferecer (e serão alocados no “background”).

35

Ele faz isso escolhendo o limiar que maximiza a variância interclasse do grupo

de “pixels” branco e do conjunto de “pixels” negros. Em seu artigo [23], o inventor

desse método explica que, idealmente, o histograma dos tons de cinza de uma imagem

apresentaria um vale entre dois blocos: um englobando os elementos mais claros e outro

fazendo o mesmo para os escuros. Ele propõe o cálculo da probabilidade de cada nível

de cinza a partir do levantamento do histograma da imagem e descobre qual seria a

probabilidade de ocorrência e o nível de cinza médio de duas classes: a que abrigará os

tons de cinza abaixo do limiar a ser encontrado (ou seja, o futuro “background”) e a

que reunirá os valores acima disso (o futuro “foreground”).

Assim, ele dispõe dos momentos cumulativos de ordens zero (probabilidade da

classe) e um (nível médio de cinza da classe) para o grupo que ficar abaixo da escolha

do limiar. Lançando mão das variâncias de cada classe, ele obtém as equações para as

variâncias intraclasse (que representa o quão internamente heterogêneas são cada uma

das duas classes), interclasse (que traduz o quão diferentes são as classes entre si, em

termos dos níveis médios de cinza apresentados por cada uma) e para a variância total

de níveis de cinza da amostra.

Como a variância total de níveis de cinza da cena é igual à soma das variâncias

intraclasse e interclasse; e, além disso, é independente de qualquer que seja o limiar

escolhido, basta checar qual das duas outras variâncias é a mais simples de ser

resolvida, uma vez que as duas são funções do limiar a ser selecionado.

Se, por um lado, a variância intraclasse exige o cálculo de momentos cumulados

de segunda ordem (que são a variância da classe abaixo do limiar e a variância da classe

acima do limiar), por outro, a variância interclasse só requer o cômputo de momentos de

primeira ordem (que são os níveis médios de cinza para cada classe, o que, inclusive, já

se sabe da investigação do histograma da cena). Dessa forma, a escolha automática de

limiar é reduzida a um problema de otimização, onde é necessário saber qual será o

limiar a maximizar a variância de interclasse; e isso é alcançado simplesmente, via

busca sequencial.

A próxima ferramenta para o processamento de imagens em tons de cinza a ser

explorada aqui é a transformada “watershed”. O MATLAB® atualmente utiliza o

algoritmo de Meyer, F. [24] para implementar essa transformada desenvolvida por

Meyer e seu grupo de pesquisa na década de 70. Como se vê em [25], a explicação

sobre o como é calculada a transformada “watershed” é longa, complexa e exige

36

conhecimento muito profundo sobre morfologia matemática, o que foge do escopo deste

trabalho.

Contudo, não é difícil compreender como funciona a sua versão mais difundida

na comunidade científica, baseada no uso de marcadores. Sabendo-se que uma

superfície de cinza apresenta máximos e mínimos locais, imagine que todos os mínimos

sejam “escavados” até atingirem a profundidade igual à do mínimo absoluto da cena (ou

seja, o nível mais baixo da superfície).

Depois visualize um líquido emergindo pelas perfurações a uma taxa constante

para toda a cena, de tal modo que ele alcance a superfície e comece a preencher os seus

vales. No momento em que o líquido preencher completamente um vale, transbordar e

se encontrar com o excesso de líquido originado a partir de outra região, se estabelece

uma fronteira de “watershed”.

Assim, quando todas as “bacias hidrográficas” transbordarem, as linhas

fronteiriças estarão totalmente formadas, dividindo o domínio da cena em regiões

distintas que abrigam uma bacia cada no complemento da imagem. Portanto, uma

estratégia inteligente é atrelar uma bacia a cada objeto que se deseja segmentar.

Como geralmente os objetos da cena são representados por regiões claras (com

pontos de elevada altura na superfície de cinza), é necessário complementar os seus

valores de cinza (atribuindo o resultado de a todos os pontos da superfície,

onde “ ” representa o tom de cinza original da cena em cada ponto) antes de iniciar a

“watershed”. Nas gravuras subsequentes, o leitor poderá conferir a evolução do

processo de “inundação” realizado pela transformada “watershed” e as linhas

fronteiriças computadas por ela.

Figura 4.11 – Superfície original (à esq.) e seu complemento de cinza (à dir.), com vistas superiores nos detalhes.

37

Figura 4.12 – Da esquerda para a direita e de cima para baixo, é retratada a evolução da transformada “watershed”,

gerando as fronteiras vistas (em magenta) na última gravura.

Note que os cumes da superfície original foram mapeados nos vales da cena

complementada em cinza (fig. 4.11). Atente, ainda, para o fato de como vão se

expandindo as regiões negras (representando o “líquido”) nas vistas superiores, de

acordo com o avanço da transformação. Entre a terceira, a quarta e a quinta etapas

retratadas, é nítido o preenchimento das bacias hidrográficas (tornando-as cada vez mais

rasas) e a ocorrência de encontros de bacias vizinhas que “transbordaram”.

A última gravura em 4.12 mostra as fronteiras obtidas pelo método exposto. A

princípio, ele parece não ter funcionado corretamente, dado que há uma quantidade

assustadora de regiões representando nada e os objetos a serem segmentados acabaram

fazendo parte de mais de uma bacia. Tal fenômeno recebe o nome de

38

sobressegmentação, é causado pela existência de centenas (ou milhares) de mínimos

locais espalhados por toda a superfície de cinza original e evidencia o maior ponto fraco

da transformada “watershed”.

Esse problema pode ser combatido de muitas maneiras e a principal delas é se

valendo de marcadores, cujo papel principal é concentrar os mínimos locais em

determinadas áreas. Isso reduzirá o número de mínimos locais e, consequentemente, a

quantidade de sub-regiões delimitadas pela transformada “watershed”. Para tal, no

presente estudo, foram usados dois meios de criação de marcadores em oportunidades

distintas: um que binariza a imagem de cinza e depois a submete à transformada

distância, antes de complementá-la e entregá-la à “watershed”; e outro que emprega

uma função de imposição de mínimos sobre a cena complementada em cinza.

Para cada “pixel” presente no “foreground” de uma figura binária, a

transformada distância calcula o quanto aquele ponto dista do elemento de

“background” mais próximo, salvando a resposta como a nova altura do referido

“pixel”. No MATLAB® estão implementadas quatro diferentes formas de se computar

a menor distância entre um elemento branco e o fundo negro da cena. A comparação a

seguir demonstra a heterogeneidade entre os padrões de varredura das implementações

da transformada distância no produto da MathWorks.

Figura 4.13 – Da esquerda para a direita, os variados padrões de níveis geográficos dos métodos “euclidean”,

“cityblock”, “quase-euclidean” e “chessboard” da transformada distância.

A diferença nos padrões de varredura da transformada distância implicará em

perfis com relevos de cinza distintos, onde uns apresentam melhor definição do cume da

superfície de cinza do que outros. Isso é bom, pois acarretará em vales com mínimos

mais precisos ao se aplicar o complemento de cinza e menor sobressegmentação nas

fronteiras da “watershed”.

39

Anteriormente, foi dito que também há a possibilidade de melhorar o

desempenho da segmentação “watershed” através da imposição de mínimos. Se o

pesquisador dispuser de marcadores confiáveis para estimar a posição central dos

objetos que deseja segmentar, ele pode, simplesmente, se valer da função de imposição

de mínimos.

Inicialmente, ela remove da superfície já complementada aqueles pontos cujo

domínio pertencer ao “foreground” da imagem dos marcadores (que age como uma

máscara binária). Então, a função de imposição realiza uma inspeção na vizinhança do

domínio dos marcadores, checando se as alturas nesse lugar são maiores que zero.

Assim a operação prossegue (de forma monótona não-decrescente), não

permitindo que um “pixel” apresente tom de cinza mais escuro que os “pixels”

checados imediatamente antes dele. Intuitivamente, é como dizer que se “estendesse um

lençol” sobre a superfície complementada em cinza (escondendo e suavizando as suas

imperfeições, criadoras dos mínimos locais espúrios) e se “apoiasse objetos pesados”

sobre ele, justamente nas posições dos marcadores confiáveis. Exemplos ilustrando a

presença dos mínimos locais espúrios nas superfícies complementadas em cinza, a

forma dessas superfícies e as fronteiras obtidas com a transformada “watershed” para

essas duas abordagens podem ser conferidos abaixo.

Figura 4.14 – Complementos em cinza das superfícies geradas pela transformada distância (à esq.) e pela imposição

de mínimos (à dir.).

40

Figura 4.15 – Comparação entre a quantidade de mínimos locais no complemento de cinza da imagem original (à

esq.), no da versão operada pela transformada distância (ao centro) e no da superfície que sofreu imposição de

mínimos (à dir.).

Figura 4.16 – Comparação entre as fronteiras de “watershed” obtidas pela abordagem usando a transformada

distância (à esq.) e a imposição de mínimos (à dir.).

Então, fica visível a melhora de desempenho na segmentação de imagens em

tons de cinza via transformada “watershed”, quando acompanhada de algum

procedimento que impeça a manifestação da sobressegmentação.

Neste capítulo quatro, o autor buscou apresentar as principais operações

morfológicas em tons de cinza usadas pelo software construído, de modo que o leitor

esteja pronto para compreender o funcionamento da ferramenta de inspeção automática

de células, detalhada no capítulo a seguir.

41

Capítulo 5

A Ferramenta Desenvolvida e o seu

Algoritmo

5.1 – Conceitos

A lógica da ferramenta de software para análise de células desenvolvida neste

trabalho consiste em duas esferas: a de execução da interface gráfica e a de cálculo do

algoritmo de inspeção das amostras. Como os comandos responsáveis por gerenciar

essas duas vertentes se encontram mesclados nas linhas do código MATLAB® e são

acionados sequencialmente conforme ele é interpretado, o autor julga que a melhor

forma de explicar os passos seguidos pelo programa é expondo-os na ordem em que são

acionados pela máquina.

Naturalmente, a interface gráfica do software foi construída de acordo com os

pedidos e necessidade do cliente, aqui representado pelo INMETRO e seus

pesquisadores. Até o momento de fechamento do presente texto, não foi possível colher

a opinião dos operadores do instituto de metrologia que possivelmente usarão esta

ferramenta no seu dia-a-dia. Contudo, a última versão da mesma foi apresentada aos

profissionais do INMETRO que estabeleceram a parceria com o SMT-UFRJ para este

projeto e ela recebeu plena aprovação quanto à sua aparência e usabilidade.

O diagrama na figura 5.1 expõe o “esqueleto” da interface visto no ambiente de

programação de GUI (“Graphical User Interface”) do MATLAB® e enumera os seus

componentes. Tal estrutura será preenchida com o conteúdo assimilado pelo algoritmo a

partir das amostras. Nela se encontram cinco botões, sendo três do tipo “push button”

(indicados por “a”, “b” e “e”) e dois “toggle button” (“c” e “d”); três telas com pares

de eixos coordenados (“f”, “g” e “h”) e muitos campos de texto estático (incluindo os

assinalados como “i”, “j” e “k”).

O objetivo do botão “a” é carregar a imagem de uma amostra para dentro da

ferramenta, possibilitando que o usuário escolha o arquivo com a foto de contraste de

fase correspondente à amostra a ser analisada. O do botão “b” é disparar a rotina de

42

cômputo dos resultados e o de “e” se volta à geração de gráficos com curvas de

calibração para quando o operador julgar necessário consultá-las. Os dois “toggle

buttons” trabalham em conjunto e possuem duas posições permitidas (“pressionado” e

“não pressionado”) cada, retendo a informação de qual foi a sua última condição. Eles

são usados como indicadores de estados e servem para configurar as opções de

filtragem habilitadas no algoritmo, que são: utilizar a amostra inteira ou somente uma

de suas regiões e preservar os núcleos que tocam as bordas da amostra ou removê-los da

contagem.

Figura 5.1 - Diagrama da estrutura da interface gráfica da ferramenta.

Os pares de eixos coordenados “f” e “g” atuarão como visores, sendo que o

primeiro sempre estará exibindo a imagem de contraste de fase da amostra carregada

(ou apenas uma região dela, de acordo com a seleção do operador – traduzida pelo

estado do “toggle button” “c”) e o segundo apresentará uma sequência de fusões de

imagens, explicitando o avanço dos cálculos de identificação dos núcleos e dos

citoplasmas (e dando ao usuário uma resposta visual sobre o processo de análise das

células). Já o par de eixos coordenados “h” foi reservado para abrigar as curvas de

calibração criadas após o pressionamento do botão “e”.

Os campos de texto estático em azul e em vermelho (componentes “k” e “j” da

interface gráfica) servem como barras de “status” e exibirão mensagens de apoio,

informando em qual etapa de operação o software se encontra e instruindo o usuário ao

longo das verificações. E, por fim, será o agrupamento de textos estáticos “i” onde

43

ficarão escritos os valores numéricos obtidos para cada grandeza de interesse do cliente.

Todos os outros campos de texto presentes no “layout” da ferramenta foram

empregados exclusivamente como títulos para os componentes gráficos próximos a eles.

As propriedades dos componentes gráficos (como, por exemplo, a posição, a

visibilidade, as dimensões, as cores e fontes dos textos e os estados iniciais dos “toggle

buttons”) foram alinhadas num trabalho de construção feito em meio propício a isso,

antes de escrever qualquer trecho de código voltado à resolução do problema principal

de contagem de células. E esse lugar é o ambiente interativo de desenvolvimento de

interfaces gráficas do MATLAB®, conhecido como GUIDE (“Graphical User

Interface Design Environment”), que automaticamente gera uma função com nome e

cabeçalho para cada elemento gráfico (tal como um botão ou um campo de texto

editável) inserido pelo desenvolvedor no “esqueleto” da interface.

Desse modo, assim que o usuário interage com um objeto (clicando sobre o

botão ou alterando o texto editável), a máquina chama a função comportamental dele,

que descreve quais serão as reações desencadeadas no programa após o registro da

interação ou evento. O GUIDE se encarrega de criar as funções de acordo com a sintaxe

da linguagem MATLAB® e com conteúdo em branco, deixando que o programador

decida as ações operadas após o acionamento dos componentes gráficos. Esse assistente

ainda se responsabiliza pela construção dos métodos que inicializam, abrem e encerram

a interface gráfica, bem como já inclui os botões para minimizar, maximizar e fechar a

janela da ferramenta na tela do computador.

Explicada a composição da interface gráfica, é chegada a hora de tratar da sua

funcionalidade. Primeiramente, todos os componentes da interface se encontram

invisíveis para o usuário, à exceção do botão “a”, que apresentará o título “Carregar

amostra”. Como não há qualquer outro componente à vista do usuário, ele estará

inclinado a pressionar o botão, iniciando a atividade da ferramenta através da execução

da função “pushbutton1_Callback” dele.

No começo dessa função, há a definição de variáveis globais (dentre as quais se

destacam as nomeadas como “imFase”, “imNucleos” e “imCito”, cuja importância

será detalhada em breve) e um procedimento de abertura de arquivos utilizando o

comando “imgetfile()” do MATLAB®. Esse comando aciona a rotina padrão de

abertura de arquivos do sistema operacional, permitindo que o usuário navegue até o

diretório no seu computador onde estarão os arquivos com todos os tipos de imagens

das amostras. Vale ressaltar que o programa espera que o usuário selecione apenas a

44

imagem de contraste de fase da amostra a ser examinada e que este arquivo possua em

seu nome o termo “ph” (ex.: “exemplo_ph.tiff” ou “phAmostra_01.tiff”). Isso é

necessário para encontrar as fotos geradas pelo uso dos marcadores DAPI e Texas Red-

C2-Maleimide, uma vez que o software irá consultar o mesmo diretório em busca de

arquivos cujo nome se assemelhe ao da imagem de contraste de fase, mas com os

termos “dapi” (para a foto dos núcleos) ou “texas” (para a cena retratando os

citoplasmas) escritos no lugar de “ph” (ex.: ele tentará abrir os arquivos

“exemplo_dapi.tiff e exemplo_texas.tiff” ou “dapiAmostra_01.tiff e

texasAmostra_01.tiff”).

Essa rotina não permitirá a abertura de múltiplas amostras; também é testado se

os dados escolhidos foram abertos corretamente ou se o usuário cancelou o

procedimento, bem como se as imagens de contraste de fase, dos núcleos e dos

citoplasmas possuem nomes no formato esperado. Caso alguma dessas verificações

falhe, o usuário será informado do problema através de uma mensagem de erro (tal

como visto na figura a seguir) e o procedimento “pushbutton1_Callback” retorna a

atividade para a operação inicial de monitoramento, em que a interface gráfica exibirá

apenas o botão “a”, esperando por uma ação do usuário. Se o mesmo veio a carregar as

figuras do espécime errado, ele pode simplesmente clicar sobre “Carregar outra

amostra” (título a ser recebido pelo botão “a” quando o seu procedimento terminar) e

repetir essa etapa.

A ferramenta foi condicionada a procurar primeiro pela foto de contraste de fase

porque esta é tida como a referência dos pesquisadores do INMETRO na hora de

delimitar regiões de interesse (ex.: algum dos quadrantes existentes na placa Grid 500).

Já a característica da ferramenta de abrir automaticamente as imagens dos núcleos e dos

citoplasmas (buscando-as no mesmo diretório informado pelo usuário e através dos

padrões de nomes explicados) foi implementada para minimizar a interação homem-

máquina, reduzindo enganos (como se, por ventura, o usuário abrisse a foto de contraste

de fase de uma amostra e as dos marcadores biológicos pertencentes à outra) e

agilizando a operação de análise, sobretudo quando os operadores precisarem checar um

grupo grande de mostras (pois, assim, basta procurar um arquivo por amostra, ao invés

de um trio de arquivos para cada exemplar).

45

Figura 5.2 - Recorte com uma mensagem de erro exibida ao usuário (acima) e tela inicial do programa.

Uma vez confirmado o sucesso na abertura dos arquivos, as imagens de

contraste de fase e dos marcadores biológicos DAPI e Texas Red-C2-Maleimide serão

copiadas para as variáveis globais “imFase”, “imNucleos” e “imCito”,

respectivamente. Essas variáveis têm papel-chave no funcionamento do software,

porque sempre abrigarão a última modificação realizada pela máquina sobre as referidas

fotos e serão constantemente consultadas pelos métodos comportamentais dos

componentes gráficos da interface.

Momentos antes de encerrar a sua execução, a função “pushbutton1_Callback”

trata de tonar visíveis os outros elementos da janela principal da ferramenta (exceto pelo

par de eixos coordenados “h” e seu título e pelo agrupamento de textos estáticos “i”,

haja vista que esses componentes dizem respeito apenas a resultados de cálculos, que

ainda não foram realizados). Isso incluirá os visores “f” e “g”, que passarão mostrar a

cena de contraste de fase (em duplicata, como na gravura 5.3).

Figura 5.3 - Janela principal da ferramenta após o carregamento da foto do campo A1 da placa Grid 500.

46

Agora, o fluxo seguido pelo programa dependerá das decisões do usuário. Caso

ele deseje efetuar a contagem de núcleos e extrair todas as demais informações

existentes na cena carregada considerando todo o seu perímetro (ou seja, estudando uma

área de 2.572 x 1.924 “pixels”), só é preciso clicar sobre o botão no canto inferior

esquerdo, denominado “Calcular resultados”. Entretanto, o operador pode optar por

modificar as configurações de filtragem que o algoritmo fará, alterando os estados dos

“toggle buttons” “c” e “d”, e então pressionar o botão “b”. O “toggle button” “d” diz

respeito à adoção ou não da exclusão de núcleos que tocam as bordas da área

selecionada (quer seja uma imagem inteira ou uma região de interesse), mas seu

procedimento comportamental “togglebutton2_Callback” se restringe a atualizar as

mensagens de “status” com instruções para o interlocutor e mudar sinais de controle

internos ao software (ou seja, “flags”).

Já o método que especifica a atuação do “toggle button” “c” é mais elaborado e

se destina à delimitação de uma região de interesse dentro da amostra carregada

anteriormente. Ao pressionar “Excluir” (título inicial do “toggle button” “c”), o

operador será convidado a desenhar um polígono sobre a imagem de contraste de fase

explicitada no visor mais à esquerda, pontuando os seus vértices com cliques do mouse

graças ao comando “impoly” do MATLAB®. O polígono feito pelo usuário definirá

uma máscara binária, que possui valor unitário para todos os “pixels” internos ao

desenho e é nula em elementos externos a ele.

Ao se multiplicar cada elemento da máscara binária pelo elemento de mesma

posição na imagem de contraste de fase, se obtém uma figura em que somente as

informações da imagem de contraste que se superpuserem ao interior da máscara serão

preservadas (isto é, ). Os extremos dos pares de

coordenadas dos vértices pontuados são utilizados para circunscrever um retângulo ao

polígono desenhado, permitindo a efetuação de um recorte na imagem original, onde se

descarta tudo que não pertencer ao quadrilátero. As imagens dos núcleos e dos

citoplasmas passam por tratamento igual, ilustrado no quadro a seguir.

47

Figura 5.4 - (a) Polígono desenhado (vértices em azul); (b) Máscara; (c) Resultado da multiplicação elemento a

elemento; (d) Região de interesse recortada.

Assim que os recortes das cenas carregadas no software são concluídos, as

variáveis globais “imFase”, “imNucleos” e “imCito” recebem as respectivas cópias

deles; de modo que os métodos de outros componentes gráficos que vierem a consulta-

las realizarão seus cálculos com base nos cortes, processando resultados derivados

apenas da região de interesse assinalada. Durante a sua atividade, a função

“togglebutton1_Callback” também lida com a alteração de “flags”, agindo sobre

alguns parâmetros internos à lógica da ferramenta, e com atualização de mensagens de

“status” e de orientação do operador.

Findada a manipulação das opções de filtragem permitidas pela ferramenta, as

atenções se voltam para o método “calcularAlgoritmo”, chamado no instante em que o

botão intitulado “Calcular resultados” é acionado. É dentro dele que estão as rotinas de

identificação dos núcleos, delimitação dos citoplasmas e de cálculo de incertezas,

providenciando a maior parte dos valores numéricos obtidos neste estudo. E ele começa

pela definição de duas constantes de destaque: uma a dizer qual o tamanho mínimo

esperado para os núcleos das células A-549, configurado como igual a 30 “pixels”, e

outra a traduzir para micrômetros quadrados o valor da área ocupada por um “pixel”

48

das imagens das amostras, valendo . Ambas as constantes foram

indicadas pelo INMETRO.

Todas as imagens fornecidas das amostras se encontram em tons de cinza e são

ricas em detalhes. No entanto, para a tarefa de contagem de células isso se torna um

problema, uma vez que gera excesso de informação na análise, dificultando a separação

entre o que é útil à conclusão da tarefa e o que não o é. Foi por isso que se recorreu à

binarização de tais cenas, de modo que o “foreground” da imagem binária possa

representar satisfatoriamente a quantidade e a posição dos objetos estudados, ou seja, as

células. A tarefa de binarizar uma gravura não é, por si só, complicada; afinal, dado um

limiar de referência, todos os “pixels” que tiverem valor de cinza abaixo do limiar

passarão a ser nulos, enquanto aqueles cujo nível de cinza estiver acima da referência

virão a possuir valor unitário.

A grande questão é como determinar qual é o limiar de referência que implicará

numa binarização correta, capaz de estar próxima de refletir adequadamente quais

regiões de “pixels” representam informação relevante sobre as células. Uma maneira de

estimar um limiar de binarização sem recorrer à inspeção manual ou abordagens

subjetivas baseadas nas experiências de observação do operador é lançar mão do

método de Otsu. O comando “graythresh()” do MATLAB® usa justamente isso para a

sugestão de um limiar, servindo como ponto de partida para a segmentação dos núcleos.

De posse do patamar de cinza indicado pelo comando “graythresh()”, é

processada a binarização da última modificação da imagem de núcleos (guardada na

variável “imNucleos”). A sua versão binarizada é submetida a uma sequência de

transformações, instituída após a realização de testes comparando diferentes abordagens

criadas por este autor para alcançar uma segmentação de núcleos bem sucedida. Para

não comprometer a clareza e a objetividade deste texto, todos aqueles métodos que

foram preteridos ao adotado na versão final do algoritmo foram omitidos do presente

documento, inclusive por não demonstrarem um desempenho sólido. O procedimento

escolhido consiste em empregar uma abertura circular, seguida da aplicação da

transformada distância do tipo “chessboard” e combinada com a transformada

“watershed”.

A escolha do método “chessboard” para a transformada distância ocorreu após

a observação de que esta variação de tal transformada é intrinsicamente melhor do que a

do tipo “euclidiana” (que inicialmente fora adotada) para delimitar um único máximo

local próximo ao centro dos componentes conexos estudados. Isso se dá pelo fato de

49

que as “camadas em dégradé” (ou níveis geográficos) computadas pela transformada

distância seguem um padrão quadrangular, que tem a exata forma do “grid” matricial

das imagens, possibilitando menores áreas centrais devido a essa grande adequação.

Contudo, mesmo reduzindo em muito o problema da sobressegmentação do qual

sofre a transformada “watershed”, ainda era possível ocorrer o surgimento de mais de

um máximo local no interior de um mesmo objeto (leia-se “núcleo”), bastando haver

uma leve concavidade no seu contorno. Logo, foi constatado que arredondar os

componentes da imagem reduz a chance de que falsos máximos locais sejam gerados,

porque os elementos se adequarão melhor ao padrão quadrangular da transformada

distância “chessboard”, facilitando a existência de um único máximo local dentro do

núcleo.

Para proceder com o arredondamento dos componentes conexos da cena,

utilizou-se a operação de abertura morfológica binária combinada com um elemento

estruturante circular (à que se deu o nome de “abertura circular”). A operação de

dilatação também poderia ter sido adotada para deixar os componentes da figura mais

redondos, por exemplo; mas isso produz muitos artefatos de dilatação que poderiam

implicar no aparecimento de falsos positivos vindos de pontos de “salt noise”. A etapa

de erosão precedente à dilatação executada no começo da abertura morfológica é capaz

de eliminar essa parcela de ruído e diminui a fartura de artefatos de dilatação.

A fim de interferir o menos possível na estrutura da imagem, adotou-se o menor

elemento estruturante circular à disposição para o arredondamento dos componentes:

um círculo de raio igual a quatro “pixels”. Porém, esse elemento estruturante conta com

37 “pixels”, sendo da ordem de grandeza de alguns dos núcleos binarizados e, após a

aplicação da “abertura circular”, esses objetos com menos de 37 “pixels” acabaram

sendo erroneamente eliminados da cena. Esse percalço foi solucionado substituindo o

estruturante em formato de disco por um em forma de diamante e com raio igual a dois

“pixels”, constituindo uma aproximação diminuta para um círculo e totalizando apenas

13 “pixels” de área. O quadro a seguir ilustra o avanço do processamento digital da

imagem dos núcleos segundo a abordagem adotada na versão final do algoritmo.

50

Figura 5.5 - (a) Imagem em tons de cinza dos núcleos; (b) Cena binarizada; (c) Cena binarizada após passar pela

abertura circular; (d) Resultado da transformada distância (com mínimos em negro); (e) Fronteiras criadas entre os

núcleos destacadas em magenta.

A transformada “watershed” foi invocada para estipular barreiras entre os

componentes da cena e isso é especialmente valioso para segregar núcleos aglomerados.

Tal aglomeração pode ocorrer ao longo da binarização da imagem do marcador

biológico DAPI, haja vista que núcleos muito próximos um do outro e com tonalidades

parecidas podem terminar unidos em virtude da aplicação do limiar de binarização.

Nesse caso, os núcleos vizinhos seriam contabilizados como um só componente conexo,

distanciando a contagem do resultado real almejado.

Portanto, toda ajuda à transformada “watershed” é bem-vinda, porque, ainda

que ela seja uma ferramenta poderosa em segmentação de imagens, ela tende a expor

dificuldades quanto à sobressegmentação. A tabela 5.1 resume os resultados de

identificação de núcleos para uma imagem de amostra inteira sob três diferentes

abordagens, destacando a discrepância na contagem causada pelas sensibilidades da

“watershed”.

51

Tabela 5.1 – Evidenciando a melhoria na segmentação dos núcleos conforme a evolução das abordagens.

Retornando ao desenrolar da execução do procedimento “calcularAlgoritmo” e

ainda tratando da contabilização dos núcleos, é preciso mencionar que é efetuada a

eliminação de todos os componentes conexos da imagem binarizada e transformada que

não possuírem a quantidade mínima de “pixels” para se considerar um núcleo como

válido. Além disso, caso o usuário tenha optado pela exclusão de núcleos que tocam as

bordas da área selecionada, será usada a função do MATLAB® chamada

“imclearborder()”; porque ela emprega a técnica de crescimento geodésico e

octaconectividade para suprimir os núcleos que estiverem em tal situação e promove a

limpeza esperada. Assim, os objetos restantes na cena são contados e a imagem binária

resultante da sua identificação é superposta à cena de contraste de fase correspondente,

através de uma fusão de imagens a ser exibida no visor “g” da interface gráfica, para

que o operador siga acompanhando o processo.

Figura 5.5 - Recorte feito sobre a janela principal para destacar a exposição da fusão de imagens (com os núcleos

identificados em magenta).

O próximo passo é iniciar a segmentação dos citoplasmas, que, num primeiro

pensamento, pode soar como o mesmíssimo desafio: procurar onde estão posicionados e

52

segregar os pontos que contém informação útil à conclusão da tarefa. Contudo, no caso

da identificação dos núcleos havia interesse apenas na sua quantidade total, não

importando se a aparência do núcleo seria fielmente representada por um grupo conexo

de “pixels” na imagem binarizada ou um único ponto branco, desde que fosse

contabilizada como uma unidade nuclear pelo programa. Já o foco aqui é saber

delimitar corretamente até onde se estende o perímetro dos citoplasmas na esmaecida

foto do marcador biológico Texas Red-C2-Maleimide, na qual algumas células estão

retratadas com bordas bem definidas e outras com entorno mais difuso (como

exemplificado na figura 5.6), trazendo complicações para a resolução do problema.

Figura 5.6 – Perímetros celulares bem delimitados (em verde) e mal definidos (em vermelho) convivem no interior de

uma mesma amostra.

É claro que a binarização da cena dos citoplasmas poderia ser feita similarmente

à dos núcleos, partindo do nível de cinza sugerido como limiar pelo método de Otsu.

Entretanto, foi constatado que algumas células serão melhor identificadas do que outras

porque, independentemente do patamar de cinza adotado, elas já apresentam condições

de contraste e brilho bem diferentes umas das outras.

Foi por esse motivo que o autor deste trabalho optou por trocar a aplicação do

método de Otsu à cena inteira dos citoplasmas pela busca localizada de um limiar de

binarização próprio para cada perímetro celular retratado. Isso minimizará perdas de

áreas esmaecidas (que seriam eliminadas durante a binarização, por serem mais escuras

que o limiar escolhido) em imagens que demonstrarem grande quantidade de

53

citoplasmas com brilho mais intenso e cuja sugestão de limiar de cinza teria valor mais

elevado. Essa abordagem será referida como “binarização adaptativa” doravante.

Assim sendo, é preciso subdividir toda a cena original dos citoplasmas em

regiões que provavelmente abrigam uma célula e executar a função “graythresh()” para

cada uma delas, fornecendo à rotina uma imagem auxiliar contendo unicamente a cópia

da região inspecionada (todos os elementos externos à essa região terão seu tom de

cinza reduzido a zero). Uma vez sugerido o limiar localizado e acabada a binarização

daquela região especificada, a sua versão binarizada será concatenada às binarizações

das demais áreas, construindo pouco a pouco a segmentação da imagem total dos

citoplasmas (como se fosse um mosaico).

O maior obstáculo seria justamente como implementar as subdivisões a conter

uma célula cada, mas isso foi superado após o vislumbre da utilização da versão

binarizada e transformada da cena dos núcleos como uma espécie de rótulo para a

imposição de mínimos locais sobre o complemento dos tons de cinza dos citoplasmas;

de modo que isso servisse de base para o crescimento das fronteiras da transformada

“watershed” e dividisse a amostra nas sub-regiões esperadas. A sequência desses

cálculos e a concatenação do mosaico de sub-regiões binarizadas podem ser conferidas

no diagrama que segue.

Figura 5.7 – (a) Imagem em tons de cinza dos citoplasmas; (b) Complemento de cinza da cena dos citoplasmas; (c)

Imposição de mínimos locais utilizando os núcleos identificados como marcadores; (d) Fronteiras das subdivisões

obtidas destacadas em magenta; (e) Concatenação das cinco primeiras sub-regiões binarizadas localmente; (f)

Conclusão da binarização adaptativa dos citoplasmas.

54

Agora que os núcleos foram quantificados e os citoplasmas estão delimitados, o

algoritmo pode finalmente obter os valores numéricos das grandezas de interesse do

INMETRO. A primeira delas é a área (em ) da seleção analisada, facilmente

apurada pela multiplicação entre o número de “pixels” pertencentes à essa região e a

constante que traduz a área de um único “pixel” em micrômetros quadrados

( ) dividida por . A segunda é a quantidade de núcleos identificados

propriamente dita, disponível após contar quantos componentes conexos há na imagem

binarizada e transformada do marcador biológico DAPI.

A terceira se trata da divisão da quantidade de núcleos encontrados pela área

(em ) selecionada. A quarta diz respeito à razão de confluência, entendida como o

percentual da área selecionada que é ocupado pelo citoplasma das células da amostra e

calculada dividindo-se a área (em ) coberta por citoplasma pela área (em ) da

seleção inspecionada. Por último, também foi requisitado pelo instituto de metrologia

que a ferramenta aqui desenvolvida informasse qual a área média das células da amostra

examinada, o que se consegue dividindo a área coberta por citoplasma pela quantidade

de núcleos contabilizados.

(

)

(

)

Um detalhe propositalmente omitido do leitor até o presente momento é o

processo de estimação das incertezas associadas aos resultados numéricos fornecidos

pelo software. O INMETRO convencionou o uso de incertezas de medição expandidas,

que podem ser encaradas como o parâmetro associado ao resultado de uma mensuração

que descreve o espalhamento estatístico dos valores razoavelmente atribuídos a um

mensurando. No caso, as incertezas expandidas advêm do produto entre o desvio-padrão

da amostra (por exemplo) e um termo dependente do tipo de distribuição de

probabilidade assumido para caracterizar o processo estocástico relacionado aos valores

55

obtidos durante as medições feitas. Esse termo é conhecido como “fator de

abrangência” ou “fator K”.

No algoritmo implementado neste trabalho, adotou-se um fator de abrangência

igual a dois, porque foi assumida uma distribuição normal para a probabilidade atrelada

às flutuações nos resultados numéricos, provocadas pelo desenho (de autoria do

usuário) de uma região de interesse sobre a imagem da cultura de células examinada e

pela escolha automática de limiar de binarização dos núcleos via método de Otsu. Tal

como visto em [21], utilizar significa considerar que aproximadamente 95% das

medições realizadas para uma grandeza distarão dois desvios-padrões ou menos da

média aritmética de tais medidas. Como as seleções da região de interesse da amostra a

ser verificada e do limiar de binarização sugerido são as principais variáveis de entrada

do algoritmo e todas as transformações e operações matemáticas computadas por ele

são determinísticas, é correto afirmar que ambas são responsáveis pela maior parte das

incertezas nas medições proporcionadas pelo sistema.

Portanto, durante a execução da função comportamental

“togglebutton1_Callback” (acionada quando o usuário deseja delimitar uma região de

interesse na cena da amostra carregada no programa), o interlocutor é convidado a

demarcar um polígono sobre a imagem de contraste de fase e a repetir essa ação outras

quatro vezes. Além disso, o programa descobre qual é o limiar sugerido para a

binarização dos núcleos e monta um vetor contendo tal valor, mais os cinco limiares

imediatamente inferiores a ele e também os cinco níveis de cinza imediatamente

superiores a ele.

Isso totalizará uma batelada com cinco regiões de interesse (muito

provavelmente e ligeiramente) distintas a tentar delimitar um mesmo quadrante da placa

Grid 500 em análise. Dessa maneira, haverá cinco recortes para cada tipo de cena

(salvos nas variáveis “imFase”, “imNucleos” e “imCito”) e também uma faixa com 11

candidatos a limiar de binarização. O desdobramento disso é que serão calculados 55

valores de forma independente para cada uma das cinco grandezas de saída medidas. De

posse desse grupo de valores, é simples descobrir as médias aritméticas e as incertezas

expandidas de medição (com base em desvios-padrões de um conjunto finito de mostras

de um espaço amostral infinito) para cada grandeza inspecionada pelo programa:

56

√∑ ( )

Onde:

Incluir essa rotina no algoritmo é muito mais prático do que abrir a ferramenta e

carregar as imagens de uma mesma amostra seguidas vezes, ou mesmo tentar variar

manualmente o limiar de binarização, só para que os operadores possam anotar todos os

resultados fornecidos e estimar as incertezas expandidas por conta própria. Um segundo

ponto interessante é que as incertezas indicadas podem ser combinadas com outras

externas ao programa, mas inerentes ao experimento como um todo, tal como as

incertezas relacionadas aos ajustes de foco do microscópio e à experiência e julgamento

do operador. A seguir, consta um recorte do canto inferior direito da janela principal da

ferramenta, onde são lidos os valores médios e as incertezas expandidas de cada

grandeza medida.

Figura 5.8 – Exemplo de valores médios e suas incertezas expandidas computados para um quadrante típico.

Com o fim da explicação do procedimento “calcularAlgoritmo”, resta apenas

mais um método comportamental a ser coberto neste texto. Por último, mas não menos

importante, é disponibilizado na interface gráfica o botão “e”, portando o título

“Calcular curvas”. Caso seja pressionado pelo operador, ele se responsabilizará por

chamar a função “pushbutton3_Callback”, que imprimirá no par de eixos coordenados

“h” um gráfico com duas curvas.

A primeira (tingida de azul) indica qual é o número de núcleos identificados

pelo algoritmo (seguindo o mesmo desenvolvimento e obedecendo às opções de

filtragem empregadas previamente na execução do método “calcularAlgoritmo”) caso o

57

limiar de binarização adotado varie por toda a faixa de tons de cinza (ou seja, indo de 0

a 255). A segunda curva (plotada em vermelho) aponta qual é a razão de confluência

obtida num novo cenário, em que a imagem dos citoplasmas é inteiramente binarizada

com um único limiar (que também variará de 0 a 255), ao invés de recorrer à

binarização adaptativa. Além disso, são marcados o número de núcleos identificados

(ponto com um “X” azul) e a razão de confluência (ponto com um “X” vermelho)

computados pelo método “calcularAlgoritmo”. Também são impressos retângulos ao

redor dos pontos com “X”, onde a largura dos quadriláteros corresponde ao intervalo de

11 tons de cinza que participaram da estimativa de incertezas associadas às medições, a

altura do retângulo azul representa a faixa de incerteza de medição no número de

núcleos identificados e a do vermelho corresponde à incerteza calculada para a razão de

confluência. Assim que o gráfico é concluído, ele é exposto tanto no par de eixos

coordenados “h” quanto numa janela secundária, onde o MATLAB® disponibiliza um

menu com opções comuns para a inspeção de curvas, incluindo a possibilidade do

usuário salvar o gráfico como uma figura no diretório de sua preferência.

O intuito por trás disso é tentar munir os pesquisadores do INMETRO com uma

ferramenta que não se limite a prover resultados numéricos e incertezas alcançados

através de uma única abordagem, mas que ofereça meios alternativos de checar a

validade dos números apresentados. Encerrando este quarto capítulo, são exibidas duas

gravuras: uma com o gráfico referente ao mesmo exemplo da figura 5.8 e outra

ilustrando como fica a interface gráfica com todos os seus recursos visíveis e já tendo

sido completamente explorada.

Figura 5.9 – Exemplo do gráfico com as curvas mencionadas e “zoom” já aplicado.

58

Figura 5.10 – Janela principal da interface gráfica com todos os recursos disponíveis já explorados.

59

Capítulo 6

Resultados e Conclusões

6.1 – Constatações

Nesse trabalho fez-se um estudo para elencar quais seriam as ferramentas de

morfologia matemática mais adequadas à solução do problema proposto, sendo

resumidas pelos conteúdos discutidos nos capítulos três e quatro deste texto. A partir

disso, construiu-se um software capaz de identificar e contar células presentes em fotos

de amostras laboratoriais automaticamente, sendo operado através de uma interface

gráfica moldada de acordo com as necessidades do proponente do projeto, o

INMETRO.

Também é válido ressaltar a criação do método de binarização adaptativa para o

cálculo da área da amostra coberta por citoplasma celular, bem como destaca-se que

houve real preocupação com a estimativa das incertezas associadas às grandezas

informadas pelo algoritmo concebido. Inclusive, as curvas desenhadas no gráfico

gerado pelo programa ajudam o usuário a checar, ainda que de forma simples, se os

resultados obtidos para um exemplar fazem parte dos valores que podem ser

razoavelmente considerados como corretos dentro da gama total de limiares possíveis.

Cumpriram-se, portanto, todos os quatro objetivos inicialmente propostos no capítulo

um deste documento.

Ao longo dos testes da ferramenta, percebeu-se que os resultados para o método

que se vale da exclusão de núcleos que tocam as bordas da região de interesse

(selecionada pelo operador) estão mais próximos às referências do INMETRO do que

aqueles obtidos mantendo-se os núcleos localizados no contorno de tal região. Essa

observação reflete algo que já era aguardado, uma vez que os pesquisadores do

INMETRO eliminam de suas contagens os núcleos em contato com as arestas da região

de interesse.

Além disso, em 89% das nove amostras cedidas pelo INMETRO houve sucesso

ao se calcular um valor médio para a quantidade de células que é condizente com a

grandeza aferida pelo INMETRO; uma vez que a leitura feita pelo programa se mostrou

60

dentro das margens de incerteza divulgadas pelo instituto para as medições dessa

grandeza.

Em geral, as incertezas expandidas indicadas pelo instituto de metrologia

possuem magnitude bastante pequena, representando 3,56% do valor mensurado para a

quantidade de núcleos celulares presentes numa amostra (incerteza percentual média).

Essas são margens de erro rigorosas e difíceis de serem atendidas, porque se tratam de

medições com incertezas percentuais menores que 5%. Comparativamente, o algoritmo

criado demonstrou resultados com incerteza percentual média igual a 6,36% (pouco

menos que o dobro da obtida pelo INMETRO) para a quantidade de núcleos

identificados, mas que distam (em média) apenas 4,70% do mensurado pelas referências

do INMETRO (erro relativo médio). Ou seja, para as medições da grandeza referente à

quantidade de células existentes em uma amostra, o algoritmo aqui defendido exibiu

boa precisão (pois sua incerteza percentual média esteve abaixo de 10%) e ótima

acurácia (dado que o erro relativo médio ficou abaixo de 5% e 89% das medições para

essa grandeza obtiveram sucesso).

Contudo, em todos os nove casos analisados, a razão de confluência estimada

pelo algoritmo distou mais de 25% das referências do INMETRO, computando um erro

relativo médio de 40,33% em relação a elas. Já a incerteza percentual média para essa

grandeza vale 8,52% nas medições do instituto de metrologia e 19,39% nas divulgadas

pelo software, que é mais que o dobro da referência. Como o cálculo da razão de

confluência é simples (área de "citoplasma na região selecionada" dividida pela área da

"região selecionada"), tamanha disparidade vem do cômputo da área dos citoplasmas.

O procedimento de cálculo dos citoplasmas não funcionou tão bem para o

conjunto de amostras atuais, porque estas estão com as áreas de citoplasmas com baixa

definição e fraco contraste com o fundo negro. Em suma, o método do INMETRO é,

provavelmente, mais correto; porém, é bastante subjetivo (pois a escolha do limiar

único que binarizará a imagem com os citoplasmas é totalmente embasada na

observação feita pelo operador da ferramenta); já o método de binarização adaptativa

apresentado neste trabalho é completamente objetivo, mas carece de acurácia (pois não

entrega o valor verdadeiro esperado pelo INMETRO) e poderia receber melhorias.

Agora, graças à concepção do software aqui discutido, uma região de interesse

da amostra é totalmente inspecionada e tem seus resultados calculados pelo algoritmo

em 5 minutos, aproximadamente (incluindo a criação do gráfico de calibração)! Para

61

efeitos de comparação, no procedimento manual realizado pelo INMETRO é necessária

mais de 1 hora para a conclusão da verificação de uma única amostra.

Como características adicionais, o programa gerado pelo autor permite salvar

uma figura com as curvas de núcleos e área celular para toda a faixa de limiares

possíveis. Dessa maneira, se observa a repetição de um caso típico, em que há o

surgimento de um platô na curva de núcleos e de uma forma exponencial decrescente na

curva de razão de confluência. Os pontos assinalados nos gráficos (anexados no

apêndice A desse texto) com "X" azul demonstram que o limiar escolhido pelo

algoritmo resulta numa quantidade de núcleos identificados que pertence ao platô,

indicando que o uso do método de Otsu é válido.

Essa afirmação pôde ser feita porque numa curva típica de núcleos identificados

se observam três regiões: um pico muito elevado posicionado em limiares de cinza

menores que cinco, um platô geralmente verificado entre os limiares cinco e 50 e uma

extensa região onde a curva decai a zero após o limiar de cinza igual a 50. Isso ocorre

porque limiares de valor muito baixo irão incluir no “foreground” da versão binarizada

da imagem dos núcleos todos os pontos que sejam ligeiramente mais claros que o fundo

negro da cena, implicando num grande pico na contagem de núcleos.

Similarmente, conforme o limiar se aproxima de tons mais claros (ou seja, dos

valores de cinza altos), quase nenhum “pixel” da cena original estará acima do limiar

usado na binarização, acarretando na completa eliminação da informação útil sobre os

núcleos. Logo, a região na qual está o platô abriga todos os candidatos razoáveis e bons

para uma escolha de limiar, inclusive porque a curva de núcleos identificados tende a se

estabilizar.

O ponto com "X" vermelho demarca a razão de confluência calculada pelo

algoritmo usando binarização localizada para cada citoplasma, ficando bastante abaixo

da curva vermelha originada pela binarização dos citoplasmas com uma única escolha

de limiar, tal como feito pelo INMETRO. A identificação das áreas de citoplasmas com

um limiar único torna o resultado muito mais sensível à escolha de limiar; isso fica

evidente pela grande inclinação negativa da curva vermelha e explica porque há

tamanha disparidade entre a razão de confluência calculada pelo INMETRO e pelo

algoritmo aqui exposto (que, na opinião do autor, apresenta um método de identificação

dos citoplasmas diferente, válido e menos sensível às variações de escolha de limiar).

As demais grandezas computadas pelo software ou não possuem referências

informadas pelo INMETRO para a comparação de valores (ex.: “limiar de cinza

62

escolhido para binarização dos núcleos” e “área média das células da amostra”), ou a

comparação é pouco interessante para a validação do método de inspeção de células

(ex.: “área medida para o quadrante”). A grandeza de quantidade de núcleos

identificados por unidade de área de substrato é fruto da medição do número de núcleos

existentes na cena e goza da mesma confiança que o mensurando do qual se origina.

Por fim, encerrando esse documento, são sugeridas como melhorias futuras:

A correção de pequenos “bugs” relacionados exclusivamente com o

procedimento de redesenho da interface gráfica ao longo da execução do

software;

A realização de testes de usabilidade da interface gráfica e da ferramenta

como um todo, junto ao grupo de colaboradores e pesquisadores do

INMETRO;

A incorporação de um método capaz de identificar automaticamente a

faixa de limiares de cinza pertencentes ao domínio do platô da curva de

quantidade de núcleos identificados;

A inclusão de um procedimento de inspeção da imagem dos núcleos que

consiga detectar a presença de conglomerados de células (ou seja,

núcleos que se encontram unidos ou superpostos já na cena original em

tons de cinza do marcador DAPI). Isso seria interessante para checar se

há flagrantes de células em processo de mitose na amostra retratada e

para o aprimoramento dos cálculos de incertezas de medição;

O estudo de outros métodos que possam agregar melhorias de

desempenho tanto no procedimento de contagem de núcleos, quanto (e

principalmente) na delimitação das áreas cobertas por citoplasma

(possivelmente permitindo que o usuário inspecione a imagem dos

citoplasmas e defina um limiar de binarização empírico “em tempo

real”);

O desenvolvimento de um procedimento baseado em esqueletonização

(operação morfológica) que habilite o software a medir a resolução de

uma régua fotografada em microscópio e recalcular, a cada amostra

carregada, a constante que converte a área de um “pixel” em ;

A extensão dos métodos aqui desenvolvidos para aplicações voltadas à

inspeção de vídeos com células em movimento.

63

Bibliografia

[1] INMETRO, Vocabulário Internacional de Metrologia – Conceitos fundamentais e

gerais e termos associados (VIM 2012). Rio de Janeiro – RJ, Edição Luso-

Brasileira, 2012.

[2] BICKLE, M., “The beautiful cell: high-content screening in drug discovery”,

Journal of Analytical and Bioanalytical Chemistry, pp. 219-226, 2010.

[3] “Bureau International des Poids et Mesures”, http://www.bipm.org/fr/about-us/,

2015 (Acesso em 27/02/2015).

[4] “Bureau International des Poids et Mesures – Biostudy Report”,

http://www.bipm.org/en/bipm/chemistry/organic-analysis/biostudy-report.html, 2015

(Acesso em 27/02/2015).

[5] “INMETRO”, http://www.inmetro.gov.br/, 2015 (Acesso em 27/02/2015).

[6] “SMT-UFRJ”, http://www.smt.ufrj.br/index.php/pt/, 2015 (Acesso em 27/02/2015).

[7] “A549 Cell Line General Information and Resources”, http://www.a549.com/, 2015

(Acesso em 27/02/2015).

[8] KENDALL, M., HODGES N.J., WHITWELL, H., TYRREL, J., CANGUL, H.,

“Nanoparticle growth and surface chemistry changes in cell-conditioned culture

medium”, http://www.ncbi.nlm.nih.gov/pubmed/25533102, 2015 (Acesso em

27/02/2015).

[9] “ISO 10993-5:2009(en) - Biological evaluation of medical devices — Part 5: Tests

for in vitro cytotoxicity”, https://www.iso.org/obp/ui/#iso:std:iso:10993:-5:ed-

3:v1:en, 2009 (Acesso em 27/02/2015).

[10] “A549 (ATCC® CCL-185™) – Homo sapiens lung Carcinoma”,

http://www.atcc.org/Products/All/CCL-185.aspx#characteristics, 2014 (Acesso em

27/02/2015).

[11] “Company Overview :: ibidi”, http://ibidi.com/about-ibidi/profile/company-

overview/, 2015 (Acesso em 27/02/2015).

[12] “D_8XXXX_Dish_35mm_grid500_image1.jpg”,

http://ibidi.com/fileadmin/products/labware/open_standard/D_8XXXX_Dish35mm

_Grid500/D_8XXXX_Dish_35mm_grid500_image1.jpg, 2015 (Acesso em

27/02/2015).

[13] “Invitrogen™ | Life technologies”,

http://www.lifetechnologies.com/br/en/home/brands/invitrogen.html, 2015 (Acesso em

27/02/2015).

64

[14] NIH, “ImageJ – Image Processing and Analysis in Java”,

http://imagej.nih.gov/ij/index.html, 2015 (Acesso em 27/02/2015).

[15] THE MATHWORKS INC., “MATLAB – The Language of Technical

Computing”, http://www.mathworks.com/products/matlab/, 2015 (Acesso em

27/02/2015).

[16] CAMBRIDGE IN COLOUR, “Image Types: JPEG & TIFF File Formats”,

http://www.cambridgeincolour.com/tutorials/imagetypes.htm, 2015 (Acesso em

27/02/2015).

[17] ADOBE SYSTEMS INC., “TIFF™ - Revision 6.0 Final”,

http://partners.adobe.com/public/developer/en/tiff/TIFF6.pdf, 1992 (Acesso em

27/02/2015).

[18] WIKIPEDIA, “Image segmentation – Wikipedia, the free encyclopedia”,

http://en.wikipedia.org/wiki/Image_segmentation, 2015 (Acesso em 27/02/2015).

[19] “Biomathematics & Statistics Scotland”,

http://www.bioss.ac.uk/people/chris/ch5.pdf, 2015 (Acesso em 27/02/2015).

[20] DOUGHERTY, E.R., LOTUFO, R.A., Hands-on Morphological Image

Processing. Bellingham, WA-USA, SPIE Press, 2003.

[21] CABRAL, P., Erros e Incertezas nas Medições, Porto, Portugal, IEP e ISEP, 2004.

[22] GLEB, V.T., “Morphological Image Processing: Gray-scale morphology”,

http://www.ee.lamar.edu/gleb/dip/10-3%20-

%20Morphological%20Image%20Processing.pdf, 2010 (Acesso em 27/02/2015).

[23] OTSU, N., “A Threshold Selection Method from Gray-Level Histograms”, IEEE

Transactions on Systems, Man, and Cybernetics, v. 9, pp.62-66, 1979.

[24] MEYER, F., "Topographic Distance and Watershed Lines", Signal Processing, v.

38, pp. 113-125, 1994.

[25] MEYER, F., “The watershed concept and its use in segmentation: a brief history”,

pp. 1-11, 2012.

65

Apêndice A

Demonstração de Resultados

Este apêndice foi reservado para a compilação dos resultados obtidos pelo

software criado, incluindo: as grandezas calculadas e suas incertezas expandidas, os

valores de referência informados pelo INMETRO, a imagem segmentada final

assinalando as células encontradas e o gráfico com as curvas de calibração para cada

uma das nove amostras aferidas pelo instituto de metrologia para a realização de testes

de validação do método construído. A título de informação, um valor calculado é

considerado como correto se o seu valor médio acrescido da sua faixa de incerteza

expandida se encontra dentro do intervalo de valores gerado pela medição do

INMETRO acrescida de sua incerteza expandida associada.

AMOSTRA G10

Limiar de cinza utilizado

Valor médio u (expandida) Correto?

SOFTWARE 21,00 6,38

INMETRO Não

Área do quadrante (mm^2)

Valor médio u (expandida) Correto?

SOFTWARE 0,228081 0,002607

INMETRO 0,234638 0,000766 Não

66

Núcleos/quadrante

Valor médio u (expandida) Correto?

SOFTWARE 66,33 4,82

INMETRO 69,40 0,73 Sim

Núcleos/mm^2

Valor médio u (expandida) Correto?

SOFTWARE 290,81 21,14

INMETRO 295,77 2,97 Sim

Confluência (em %)

Valor médio u (expandida) Correto?

SOFTWARE 13,56 0,37

INMETRO 18,39 2,27 Não

Área média das células (um^2)

Valor médio u (expandida) Correto?

SOFTWARE 467,10 41,74

INMETRO

Não

AMOSTRA K15

67

Limiar de cinza utilizado

Valor médio u (expandida) Correto?

SOFTWARE 22,00 6,38

INMETRO Não

Área do quadrante (mm^2)

Valor médio u (expandida) Correto?

SOFTWARE 0,229918 0,003337

INMETRO 0,234952 0,000830 Não

Núcleos/quadrante

Valor médio u (expandida) Correto?

SOFTWARE 82,82 5,43

INMETRO 85,00 5,06 Sim

Núcleos/mm^2

Valor médio u (expandida) Correto?

SOFTWARE 360,22 23,65

INMETRO 361,78 21,53 Sim

Confluência (em %)

Valor médio u (expandida) Correto?

SOFTWARE 18,02 0,60

INMETRO 24,06 1,69 Não

Área média das células (um^2)

Valor médio u (expandida) Correto?

SOFTWARE 500,89 45,24

INMETRO

Não

68

AMOSTRA Q11

Limiar de cinza utilizado

Valor médio u (expandida) Correto?

SOFTWARE 20,00 6,38

INMETRO Não

Área do quadrante (mm^2)

Valor médio u (expandida) Correto?

SOFTWARE 0,229001 0,005857

INMETRO 0,236644 0,000914 Não

Núcleos/quadrante

Valor médio u (expandida) Correto?

SOFTWARE 112,31 7,37

INMETRO 102,40 4,66 Sim

Núcleos/mm^2

Valor médio u (expandida) Correto?

SOFTWARE 490,50 33,95

INMETRO 432,72 19,67 Não

Confluência (em %)

Valor médio u (expandida) Correto?

SOFTWARE 23,35 1,03

INMETRO 32,91 4,32 Não

Área média das células (um^2)

Valor médio u (expandida) Correto?

SOFTWARE 476,53 29,48

INMETRO Não

69

AMOSTRA U05

Limiar de cinza utilizado

Valor médio u (expandida) Correto?

SOFTWARE 18,00 6,38

INMETRO Não

Área do quadrante (mm^2)

Valor médio u (expandida) Correto?

SOFTWARE 0,238643 0,004081

INMETRO 0,237414 0,000942 Sim

Núcleos/quadrante

Valor médio u (expandida) Correto?

SOFTWARE 69,07 4,58

INMETRO 59,90 3,15 Não

Núcleos/mm^2

Valor médio u (expandida) Correto?

SOFTWARE 289,46 19,82

INMETRO 252,30 13,26 Não

70

Confluência (em %)

Valor médio u (expandida) Correto?

SOFTWARE 13,09 0,57

INMETRO 20,29 0,94 Não

Área média das células (um^2)

Valor médio u (expandida) Correto?

SOFTWARE 452,77 39,74

INMETRO Não

AMOSTRA D15

Limiar de cinza utilizado

Valor médio u (expandida) Correto?

SOFTWARE 9,00 6,38

INMETRO Não

Área do quadrante (mm^2)

Valor médio u (expandida) Correto?

SOFTWARE 0,238380 0,005096

INMETRO 0,234903 0,000891 Sim

71

Núcleos/quadrante

Valor médio u (expandida) Correto?

SOFTWARE 143,93 8,87

INMETRO 144,90 2,58 Sim

Núcleos/mm^2

Valor médio u (expandida) Correto?

SOFTWARE 603,84 39,25

INMETRO 616,85 10,99 Sim

Confluência (em %)

Valor médio u (expandida) Correto?

SOFTWARE 22,94 7,53

INMETRO 48,07 4,76 Não

Área média das células (um^2)

Valor médio u (expandida) Correto?

SOFTWARE 380,95 137,52

INMETRO Não

AMOSTRA K10

72

Limiar de cinza utilizado

Valor médio u (expandida) Correto?

SOFTWARE 11,00 6,38

INMETRO Não

Área do quadrante (mm^2)

Valor médio u (expandida) Correto?

SOFTWARE 0,236090 0,004220

INMETRO 0,234444 0,000793 Sim

Núcleos/quadrante

Valor médio u (expandida) Correto?

SOFTWARE 215,35 5,45

INMETRO 219,70 6,90 Sim

Núcleos/mm^2

Valor médio u (expandida) Correto?

SOFTWARE 912,16 22,37

INMETRO 937,11 29,43 Sim

Confluência (em %)

Valor médio u (expandida) Correto?

SOFTWARE 36,50 12,08

INMETRO 70,58 5,95 Não

Área média das células (um^2)

Valor médio u (expandida) Correto?

SOFTWARE 400,54 138,47

INMETRO Não

73

AMOSTRA L19

Limiar de cinza utilizado

Valor médio u (expandida) Correto?

SOFTWARE 10,00 6,38

INMETRO Não

Área do quadrante (mm^2)

Valor médio u (expandida) Correto?

SOFTWARE 0,239478 0,002812

INMETRO 0,236389 0,000807 Sim

Núcleos/quadrante

Valor médio u (expandida) Correto?

SOFTWARE 175,64 6,92

INMETRO 175,40 4,75 Sim

Núcleos/mm^2

Valor médio u (expandida) Correto?

SOFTWARE 733,43 29,31

INMETRO 742,00 20,10 Sim

Confluência (em %)

Valor médio u (expandida) Correto?

SOFTWARE 26,74 6,39

INMETRO 62,24 4,80 Não

Área média das células (um^2)

Valor médio u (expandida) Correto?

SOFTWARE 365,04 94,04

INMETRO Não

74

AMOSTRA P08

Limiar de cinza utilizado

Valor médio u (expandida) Correto?

SOFTWARE 9,00 6,38

INMETRO Não

Área do quadrante (mm^2)

Valor médio u (expandida) Correto?

SOFTWARE 0,238717 0,008491

INMETRO 0,236237 0,000867 Sim

Núcleos/quadrante

Valor médio u (expandida) Correto?

SOFTWARE 91,53 10,43

INMETRO 89,30 3,03 Sim

Núcleos/mm^2

Valor médio u (expandida) Correto?

SOFTWARE 383,50 44,64

INMETRO 378,01 12,83 Sim

75

Confluência (em %)

Valor médio u (expandida) Correto?

SOFTWARE 15,64 4,84

INMETRO 37,24 3,52 Não

Área média das células (um^2)

Valor médio u (expandida) Correto?

SOFTWARE 412,13 171,97

INMETRO Não

AMOSTRA U20

Limiar de cinza utilizado

Valor médio u (expandida) Correto?

SOFTWARE 8,00 6,38

INMETRO Não

Área do quadrante (mm^2)

Valor médio u (expandida) Correto?

SOFTWARE 0,243327 0,002505

INMETRO 0,240539 0,001533 Sim

76

Núcleos/quadrante

Valor médio u (expandida) Correto?

SOFTWARE 273,49 16,90

INMETRO 288,10 12,16 Sim

Núcleos/mm^2

Valor médio u (expandida) Correto?

SOFTWARE 1123,98 69,39

INMETRO 1197,73 50,57 Sim

Confluência (em %)

Valor médio u (expandida) Correto?

SOFTWARE 64,12 24,93

INMETRO 93,58 3,86 Não

Área média das células (um^2)

Valor médio u (expandida) Correto?

SOFTWARE 570,86 226,66

INMETRO Não

77

Apêndice B

Código fonte

Abaixo se encontra o código fonte que compõe o software, com a extensão

“.m”. É nele onde estão escritas as funções comportamentais dos componentes gráficos

da interface e também a implementação do algoritmo desenvolvido neste trabalho para a

contagem automática de células.

Código: “InterfaceFinal_V_9_1.m”

function varargout = InterfaceFinal_V_9_1(varargin) % INTERFACEFINAL_V_9_1 MATLAB code for InterfaceFinal_V_9_1.fig % INTERFACEFINAL_V_9_1, by itself, creates a new

INTERFACEFINAL_V_9_1 or raises the existing % singleton*. % % H = INTERFACEFINAL_V_9_1 returns the handle to a new

INTERFACEFINAL_V_9_1 or the handle to % the existing singleton*. % % INTERFACEFINAL_V_9_1('CALLBACK',hObject,eventData,handles,...)

calls the local % function named CALLBACK in INTERFACEFINAL_V_9_1.M with the

given input arguments. % % INTERFACEFINAL_V_9_1('Property','Value',...) creates a new

INTERFACEFINAL_V_9_1 or raises the % existing singleton*. Starting from the left, property value

pairs are % applied to the GUI before InterfaceFinal_V_9_1_OpeningFcn gets

called. An % unrecognized property name or invalid value makes property

application % stop. All inputs are passed to InterfaceFinal_V_9_1_OpeningFcn

via varargin. % % *See GUI Options on GUIDE's Tools menu. Choose "GUI allows

only one % instance to run (singleton)". % % See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help

InterfaceFinal_V_9_1

% Last Modified by GUIDE v2.5 21-Feb-2015 15:35:34

% Begin initialization code - DO NOT EDIT gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ...

78

'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @InterfaceFinal_V_9_1_OpeningFcn,

... 'gui_OutputFcn', @InterfaceFinal_V_9_1_OutputFcn,

... 'gui_LayoutFcn', [] , ... 'gui_Callback', []); if nargin && ischar(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end

if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end % End initialization code - DO NOT EDIT

% --- Executes just before InterfaceFinal_V_9_1 is made visible. function InterfaceFinal_V_9_1_OpeningFcn(hObject, eventdata, handles,

varargin) % This function has no output args, see OutputFcn. % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) % varargin command line arguments to InterfaceFinal_V_9_1 (see

VARARGIN)

% Choose default command line output for InterfaceFinal_V_9_1 handles.output = hObject;

% Update handles structure guidata(hObject, handles);

% UIWAIT makes InterfaceFinal_V_9_1 wait for user response (see

UIRESUME) % uiwait(handles.figure1);

% --- Outputs from this function are returned to the command line. function varargout = InterfaceFinal_V_9_1_OutputFcn(hObject,

eventdata, handles) % varargout cell array for returning output args (see VARARGOUT); % hObject handle to figure % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure varargout{1} = handles.output;

% --- Executes on button press in pushbutton1. function pushbutton1_Callback(hObject, eventdata, handles) % hObject handle to pushbutton1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)

% DECLARAÇÃO DE VARIÁVEIS GLOBAIS global diretorio cancelar espera

79

global imFase imNucleos imCito flagROI numElemROI flagNoBorder %

Nomenclaturas genéricas global im01 im02 im03 % Imagens de fase, de núcleos e de

citoplasmas

% Definindo os segundos de espera para que a interface se

redesenhe espera = 1;

% Escondendo os componentes da interface gráfica set(handles.uipanel1,'Visible','off'); set(handles.uipanel2,'Visible','off'); set(handles.pushbutton4,'Visible','off'); set(handles.axes1,'Visible','off'); cla(handles.axes1); set(handles.axes5,'Visible','off'); cla(handles.axes5); set(handles.text9,'Visible','off'); set(handles.text10,'Visible','off'); set(handles.text12,'Visible','off'); set(handles.text20,'Visible','off'); set(handles.axes4,'Visible','off'); cla(handles.axes4); set(handles.text11,'Visible','off'); pause(espera);

% Abrindo o arquivo com a primeira amostra a ser verificada no

canvas 1 set(handles.text10,'Visible','on'); set(handles.text10,'String','Esperando o usuário carregar uma

amostra...'); [diretorio,cancelar]=imgetfile(); if cancelar % O arquivo não foi aberto. msgbox(sprintf('O usuário cancelou a abertura de

arquivo.'),'Error','Error'); set(handles.text10,'Visible','off'); return end

if (isempty(strfind(diretorio,'ph'))) % O nome do arquivo de contraste de fase não está no formato

esperado msgbox(sprintf('O nome do arquivo de contraste de fase não

está no formato esperado. Certifique-se de que a imagem de contraste

de fase da amostra selecionada possua a sigla "ph" em seu

nome.'),'Error','Error'); set(handles.text10,'Visible','off'); return end

if (exist(strrep(diretorio, 'ph', 'dapi'),'file') ~= 2) % O nome do arquivo com os núcleos não está no formato

esperado msgbox(sprintf('O nome do arquivo do marcador DAPI não está no

formato esperado. Certifique-se de que a imagem dos núcleos da amostra

selecionada possua "dapi" escrito no lugar da sigla "ph" do nome do

arquivo de contraste de fase correspondente.'),'Error','Error'); set(handles.text10,'Visible','off'); return

80

end

if (exist(strrep(diretorio, 'ph', 'texas'),'file') ~= 2) % O nome do arquivo com os citoplasmas não está no formato

esperado msgbox(sprintf('O nome do arquivo do marcador TEXAS RED não

está no formato esperado. Certifique-se de que a imagem dos

citoplasmas da amostra selecionada possua "texas" escrito no lugar da

sigla "ph" do nome do arquivo de contraste de fase

correspondente.'),'Error','Error'); set(handles.text10,'Visible','off'); return end

% Lendo também o arquivo com as imagems dos núcleos e dos

citoplasmas marcados im01 = imread(diretorio); im02 = imread(strrep(diretorio, 'ph', 'dapi')); im03 = imread(strrep(diretorio, 'ph', 'texas'));

% Alterando as variaveis genericas imFase = im01; imNucleos = im02; imCito = im03; flagROI = 0; numElemROI = 0; % Desnecessário, incluído apenas por segurança flagNoBorder = 0;

% Terminando de exibir os objetos da interface set(handles.axes1,'Visible','on'); set(handles.axes5,'Visible','on'); axes(handles.axes1), imshow(imFase); axes(handles.axes5), imshow(imFase); set(handles.text12,'Visible','on'); set(handles.text12,'String','Amostra fornecida'); set(handles.pushbutton4,'Visible','on'); set(handles.pushbutton4,'String','Calcular resultados'); set(handles.uipanel1,'Visible','on'); set(handles.text1,'String','Selecionar região da amostra?'); set(handles.togglebutton1,'String','Não'); set(handles.text2,'String','Excluir núcleos nas bordas?'); set(handles.togglebutton2,'String','Não excluir'); set(handles.text19,'String','Gerar curvas de calibração?'); set(handles.pushbutton3,'String','Calcular curvas'); set(handles.text10,'String',''); set(handles.pushbutton1,'String','Carregar outra amostra'); % Escondendo os objetos referentes à geração de curvas de

calibração set(handles.text19,'Visible','off'); set(handles.pushbutton3,'Visible','off'); pause(espera);

% --- Executes on button press in togglebutton1. function togglebutton1_Callback(hObject, eventdata, handles) % hObject handle to togglebutton1 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)

% DECLARAÇÃO DE VARIÁVEIS GLOBAIS

81

global linha coluna espera global imFase imNucleos imCito flagROI numElemROI % Nomenclaturas

genéricas global im01 im02 im03 % Imagens de fase, de núcleos e de

citoplasmas global poligono posicao X1 X2 Y1 Y2 coordenadasY coordenadasX

mascara im34 im35 im36 im37 global indice contador global repeticoes

% Definindo número de repetições do método para o cálculo de

incertezas repeticoes = 5;

% Hint: get(hObject,'Value') returns toggle state of togglebutton1 if (get(hObject, 'Value')) % O usuário optou por selecionar uma região da amostra set(hObject, 'String', 'Sim');

% Escondendo o botão para cálculo de resultados

momentaneamente set(handles.pushbutton4,'Visible','off'); % Escondendo os componentes de resultados da interface gráfica set(handles.uipanel2,'Visible','off'); set(handles.text9,'Visible','off'); set(handles.text10,'Visible','off'); set(handles.text12,'Visible','off'); set(handles.text20,'Visible','off'); set(handles.axes4,'Visible','off'); cla(handles.axes4); set(handles.text11,'Visible','off'); set(handles.axes1,'Visible','off'); cla(handles.axes1); set(handles.axes5,'Visible','off'); cla(handles.axes5); set(handles.text19,'Visible','off'); set(handles.pushbutton3,'Visible','off'); pause(espera);

indice = 1; contador = 1; mascara = cell(1,repeticoes); imFase = cell(1,repeticoes); imNucleos = cell(1,repeticoes); imCito = cell(1,repeticoes); numElemROI = cell(1,repeticoes); coordenadasY = cell(1,repeticoes); coordenadasX = cell(1,repeticoes);

for indice = 1:repeticoes % Instruindo usuário a desenhar um polígono na imagem de

fase set(handles.text10,'Visible','on'); set(handles.text10,'String','Clique sobre a imagem da

esquerda para delimitar uma região.'); set(handles.axes1,'Visible','on'); axes(handles.axes1),imshow(im01); set(handles.axes5,'Visible','on'); axes(handles.axes5),imshow(im01); pause(espera);

82

% Extraindo informações do polígono desenhado poligono = impoly; posicao = getPosition(poligono); X1 = round(min(posicao(:,1))); Y1 = round(min(posicao(:,2))); X2 = round(max(posicao(:,1))); Y2 = round(max(posicao(:,2))); coordenadasY{contador} = [Y1:Y2]; coordenadasX{contador} = [X1:X2]; mascaraAux = createMask(poligono); mascara{contador} = mascaraAux; [linha,coluna] = size(im01); im34 = zeros(linha,coluna); im34 = immultiply(mascara{contador},im01); im35 = im34(Y1:Y2, X1:X2); im34 = immultiply(mascara{contador},im02); im36 = im34(Y1:Y2, X1:X2); im34 = immultiply(mascara{contador},im03); im37 = im34(Y1:Y2, X1:X2);

% Alterando as variaveis genericas imFase{contador} = im35; imNucleos{contador} = im36; imCito{contador} = im37; flagROI = 1; numElemROI{contador} = sum(mascaraAux(:));

% Mostrando ao usuário qual foi a seleção feita set(handles.axes1,'Visible','on'); axes(handles.axes1),imshow(im35); set(handles.axes5,'Visible','on'); axes(handles.axes5),imshow(im35);

% Instruindo o usuário sobre quantas repetições ainda

faltam set(handles.text20,'Visible','on'); if (contador == (repeticoes - 1)) set(handles.text20,'String',['Ainda há

',num2str(repeticoes - contador),' medição a ser realizada...']); else set(handles.text20,'String',['Ainda há

',num2str(repeticoes - contador),' medições a serem realizadas...']); end pause(espera);

% Atualizando o contador contador = contador + 1;

end

% Instruindo o usuário a clicar sobre o botão de cálculo set(handles.text10,'Visible','on'); set(handles.text10,'String','Por favor, pressione o botão

"Calcular resultados".'); set(handles.text20,'Visible','on'); set(handles.text20,'String','Ou clique novamente sobre "Sim"

para cancelar as seleções de área feita.');

% Reexibindo o botão para cálculo de resultados

83

set(handles.pushbutton4,'Visible','on'); pause(espera);

else % O usuário optou por não selecionar uma região da amostra set(hObject, 'String', 'Não');

% Escondendo o botão para cálculo de resultados

momentaneamente set(handles.pushbutton4,'Visible','off'); % Escondendo os componentes de resultados da interface gráfica set(handles.uipanel2,'Visible','off'); set(handles.text9,'Visible','off'); set(handles.text10,'Visible','off'); set(handles.text12,'Visible','off'); set(handles.text20,'Visible','off'); set(handles.axes4,'Visible','off'); cla(handles.axes4); set(handles.text11,'Visible','off'); set(handles.axes1,'Visible','off'); cla(handles.axes1); set(handles.axes5,'Visible','off'); cla(handles.axes5); set(handles.text19,'Visible','off'); set(handles.pushbutton3,'Visible','off'); pause(espera);

% Alterando as variaveis genericas imFase = im01; imNucleos = im02; imCito = im03; flagROI = 0; numElemROI = 0;

% Restaurando a imagem inteira nos canvas set(handles.axes1,'Visible','on'); axes(handles.axes1),imshow(im01); set(handles.axes5,'Visible','on'); axes(handles.axes5),imshow(im01); pause(espera);

% Reexibindo o botão para cálculo de resultados set(handles.pushbutton4,'Visible','on'); pause(espera);

end

% --- Executes on button press in togglebutton2. function togglebutton2_Callback(hObject, eventdata, handles) % hObject handle to togglebutton2 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)

% DECLARAÇÃO DE VARIÁVEIS GLOBAIS global espera global flagNoBorder

% Hint: get(hObject,'Value') returns toggle state of togglebutton2 if (get(hObject, 'Value'))

84

% O usuário deseja excluir núcleos em contato com a borda

selecionada set(hObject, 'String', 'Excluir');

% Escondendo o botão para cálculo de resultados

momentaneamente set(handles.pushbutton4,'Visible','off'); % Escondendo os componentes de resultados da interface

gráfica, % exceto as imagens que já estavam nos canvas set(handles.uipanel2,'Visible','off'); set(handles.text10,'Visible','off'); set(handles.text20,'Visible','off'); set(handles.axes4,'Visible','off'); cla(handles.axes4); set(handles.text11,'Visible','off'); set(handles.text19,'Visible','off'); set(handles.pushbutton3,'Visible','off'); pause(espera);

% Instruindo usuário set(handles.text10,'String','Eliminando núcleos em contato com

as bordas da área selecionada...'); set(handles.text10,'Visible','on');

% Alterando as variaveis genericas flagNoBorder = 1;

% Instruindo o usuário a clicar sobre o botão de cálculo set(handles.text10,'Visible','on'); set(handles.text10,'String','Por favor, pressione o botão

"Calcular resultados".'); set(handles.text20,'Visible','on'); set(handles.text20,'String','Ou clique novamente sobre

"Excluir" para cancelar a limpeza de bordas.');

% Reexibindo o botão para cálculo de resultados set(handles.pushbutton4,'Visible','on'); pause(espera);

else % O usuário deseja manter os núcleos em contato com a borda

selecionada set(hObject, 'String', 'Não excluir');

% Escondendo o botão para cálculo de resultados

momentaneamente set(handles.pushbutton4,'Visible','off'); % Escondendo os componentes de resultados da interface gráfica set(handles.uipanel2,'Visible','off'); set(handles.text10,'Visible','off'); set(handles.text20,'Visible','off'); set(handles.axes4,'Visible','off'); cla(handles.axes4); set(handles.text11,'Visible','off'); set(handles.text19,'Visible','off'); set(handles.pushbutton3,'Visible','off'); pause(espera);

% Alterando as variaveis genericas

85

flagNoBorder = 0;

% Reexibindo o botão para cálculo de resultados set(handles.pushbutton4,'Visible','on'); pause(espera);

end

function calcularAlgoritmo()

% DECLARAÇÃO DE VARIÁVEIS GLOBAIS global indice fronteiras1 fronteiras2 rotulo1 linha coluna

nucleoMinimo espera global constante limiar area numDeNucleos percentual

areaCitoplasma global imFase imNucleos imCito flagROI numElemROI flagNoBorder %

Nomenclaturas genéricas global mascara coordenadasY coordenadasX global limiarMedio numDeNucleosMedio percentualMedio global incertezaLimiar incertezaNumNucleos incertezaPercentual global repeticoes

global im04 im05 im06 im07 % Imagens da contagem de núcleos global im08 im14 % Imagem com a fusão dos resultados global im09 im10 im11 im12 im13 % Imagens da identificação dos

citoplasmas

% Importando o namespace handles = guidata(gcf);

% Definindo o número mínimo de pixels que um núcleo celular deve

ter nucleoMinimo = 30;

% Definindo a constante que informa a área de 1 pixel em um^2 constante = 0.279223;

% Escondendo os componentes de resultados da interface gráfica set(handles.uipanel2,'Visible','off'); set(handles.text9,'Visible','off'); set(handles.text10,'Visible','off'); set(handles.text12,'Visible','off'); set(handles.text20,'Visible','off'); set(handles.axes4,'Visible','off'); cla(handles.axes4); set(handles.text11,'Visible','off'); set(handles.axes1,'Visible','off'); cla(handles.axes1); set(handles.axes5,'Visible','off'); cla(handles.axes5); pause(espera);

% Checando se é um caso de seleção de imagem inteira ou de R.O.I. if (flagROI == 0) % Trata-se da análise de uma imagem inteira % Atualizando o status para alertar o usuário sobre o que está

ocorrendo

86

set(handles.text10,'String','Identificando núcleos das

células... Por favor, aguarde...'); set(handles.text10,'Visible','on'); set(handles.axes1,'Visible','on'); axes(handles.axes1), imshow(imFase); set(handles.axes5,'Visible','on'); axes(handles.axes5), imshow(imFase); pause(espera);

% INÍCIO DO ALGORITMO % Binarização da imagem dos núcleos com limiar automático limiar = graythresh(imNucleos); im04 = im2bw(imNucleos, limiar); limiar = limiar*255;

% Segmentação dos núcleos im05 = imopen(im04, strel('diamond', 2)); fronteiras1 = watershed(-bwdist(~im05, 'chessboard')); im06 = im05; im06(fronteiras1 == 0) = 0; if (flagNoBorder == 0) % O usuário não requisitou limpeza de bordas em amostra

inteira im07 = bwareaopen(im06, nucleoMinimo);

elseif (flagNoBorder == 1) % O usuário requisitou limpeza de bordas em amostra

inteira im07 = bwareaopen(im06, nucleoMinimo); im07 = imclearborder(im07);

end

[rotulo1, numDeNucleos] = bwlabel(im07); im08 = imfuse(imFase, im07, 'falsecolor'); axes(handles.axes1), imshow(im08); set(handles.text9,'String','Núcleos identificados'); set(handles.text9,'Visible','on'); set(handles.text12,'String','Amostra fornecida'); set(handles.text12,'Visible','on');

% Segmentação dos citoplasmas set(handles.text10,'String','Identificando citoplasmas das

células... Aguarde...'); set(handles.text10,'Visible','on'); pause(espera); im09 = imimposemin(imcomplement(imCito),im07); fronteiras2 = watershed(im09); im10 = imCito; im10(im07 == 1) = 0; [linha,coluna] = size(imCito); im11 = zeros(linha,coluna); for indice = 1:max(max(fronteiras2)) im12 = im2bw(imCito, graythresh(im10(fronteiras2 ==

indice))); im11(fronteiras2 == indice) = im12(fronteiras2 == indice); end im13 = bwareaopen(im11, nucleoMinimo); im14 = imfuse(im08, im13, 'falsecolor'); axes(handles.axes1), imshow(im14);

87

set(handles.text9,'String','Núcleos e citoplasmas

identificados'); set(handles.text9,'Visible','on');

% Calculando a área da seleção area = (numel(im13)*constante)/1000000;

% Calculando o percentual da seleção ocupado pelas células

(confluência) percentual = (sum(im13(:))/numel(im13))*100;

% Calculando a área de citoplasma identificado na seleção areaCitoplasma = (sum(im13(:))*constante)/1000000;

% Atualizando textos e estados dos componentes da interface set(handles.text19,'Visible','on'); set(handles.pushbutton3,'Visible','on'); set(handles.uipanel2,'Visible','on'); set(handles.text13,'String','Limiar de nível de cinza

escolhido para identificar os núcleos:'); set(handles.text14,'String',sprintf('%.2f',limiar)); set(handles.text3,'String','Área selecionada (mm^2):'); set(handles.text6,'String',sprintf('%.6f',area)); set(handles.text4,'String','Número de núcleos identificados

(unid.):'); set(handles.text7,'String',sprintf('%.2f',numDeNucleos)); set(handles.text5,'String','Número de núcleos identificados

por área selecionada (unid./mm^2):'); set(handles.text8,'String',sprintf('%.2f',numDeNucleos/area)); set(handles.text15,'String','Confluência - Percentual da área

selecionada ocupado pelas células identificadas (%):'); set(handles.text16,'String',strcat(sprintf('%.2f',percentual),

' %')); set(handles.text17,'String','Área média das células

identificadas ((um^2)/unid.):');

set(handles.text18,'String',sprintf('%.2f',(areaCitoplasma/numDeNucleo

s)*1000000));

elseif (flagROI == 1) % Trata-se da análise de uma série de regiões de interesse analises = 0; indice = 1; limiarSugerido = 0; limiarMax = 0; limiarMin = 0; gapLimiar = 5.0; limiar = 0; limiarVetor = cell(1,repeticoes*((gapLimiar*2) + 1)); numDeNucleos = 0; numDeNucleosVetor = cell(1,repeticoes*((gapLimiar*2) + 1)); area = 0; areaVetor = cell(1,repeticoes*((gapLimiar*2) + 1)); areaCitoplasma = 0; areaCitoplasmaVetor = cell(1,repeticoes*((gapLimiar*2) + 1)); percentual = 0; percentualVetor = cell(1,repeticoes*((gapLimiar*2) + 1)); limiarMedio = 0; numDeNucleosMedio = 0; areaMedia = 0;

88

areaCitoplasmaMedia = 0; percentualMedio = 0; nucleosIdentMedio = 0; tamanhoMedio = 0; incertezaLimiar = 0; incertezaNumNucleos = 0; incertezaArea = 0; incertezaAreaCito = 0; incertezaPercentual = 0; incertezaNucleosIdent = 0; incertezaTamanho = 0;

for indice = 1:repeticoes % INÍCIO DO ALGORITMO limiarSugerido = graythresh(imNucleos{indice}); limiarMax = limiarSugerido + (gapLimiar/255.0); limiarMin = limiarSugerido - (gapLimiar/255.0); if (limiarMax > 1) % Contornando erro caso o limiar limite esteja fora da % faixa de cinza que vai de 0 a 1. limiarMax = 1.0; end if (limiarMin < 0) % Contornando erro caso o limiar limite esteja fora da % faixa de cinza que vai de 0 a 1. limiarMax = 0.0; end

indice2 = 1; repeticoes2 = ((limiarMax - limiarMin)*255.0) + 1;

for indice2 = 1:repeticoes2 if (indice2 == (gapLimiar + 1)) % Necessário para

evitar que a tela pisque muito % Atualizando o status para alertar o usuário

sobre o que está ocorrendo set(handles.text10,'String',['Identificando

núcleos presentes na região selecionada número

',num2str(indice),'...']); set(handles.text10,'Visible','on'); axes(handles.axes1), imshow(imFase{indice}); set(handles.axes1,'Visible','on'); axes(handles.axes5), imshow(imFase{indice}); set(handles.axes5,'Visible','on'); pause(espera); end

% Binarização da imagem dos núcleos com limiar

automático if (indice2 == 1) limiar = limiarMin*255.0; else limiar = limiar + 1; end im04 = im2bw(imNucleos{indice}, (limiar/255.0));

% Segmentação dos núcleos im05 = imopen(im04, strel('diamond', 2)); fronteiras1 = watershed(-bwdist(~im05, 'chessboard')); im06 = im05;

89

im06(fronteiras1 == 0) = 0; if (flagNoBorder == 0) % O usuário não requisitou limpeza de bordas para

as R.O.I. im07 = bwareaopen(im06, nucleoMinimo);

elseif (flagNoBorder == 1) % O usuário requisitou limpeza de bordas para as

R.O.I. im07 = bwareaopen(im06, nucleoMinimo); mascaraAux = mascara{indice}; im07 = im07 + ~mascaraAux(coordenadasY{indice},

coordenadasX{indice}); im07 = imclearborder(im07);

end [rotulo1, numDeNucleos] = bwlabel(im07);

if (indice2 == (gapLimiar + 1)) % Necessário para

evitar que a tela pisque muito im08 = imfuse(imFase{indice}, im07, 'falsecolor'); axes(handles.axes1), imshow(im08); set(handles.text9,'String','Núcleos

identificados'); set(handles.text9,'Visible','on'); set(handles.text12,'String','Amostra fornecida'); set(handles.text12,'Visible','on'); pause(espera); end

% Segmentação dos citoplasmas if (indice2 == (gapLimiar + 1)) % Necessário para

evitar que a tela pisque muito set(handles.text10,'String',['Identificando áreas

de citoplasma na região selecionada número ',num2str(indice),'...']); set(handles.text10,'Visible','on'); end im09 = imimposemin(imcomplement(imCito{indice}),im07); fronteiras2 = watershed(im09); im10 = imCito{indice}; im10(im07 == 1) = 0; [linha,coluna] = size(imCito{indice}); im11 = zeros(linha,coluna); for indice3 = 1:max(max(fronteiras2)) im12 = im2bw(imCito{indice},

graythresh(im10(fronteiras2 == indice3))); im11(fronteiras2 == indice3) = im12(fronteiras2 ==

indice3); end im13 = bwareaopen(im11, nucleoMinimo); if (indice2 == (gapLimiar + 1)) % Necessário para

evitar que a tela pisque muito im14 = imfuse(im08, im13, 'falsecolor'); axes(handles.axes1), imshow(im14); set(handles.text9,'String','Núcleos e citoplasmas

identificados'); set(handles.text9,'Visible','on'); end

% Calculando a área da seleção

90

area = (numElemROI{indice}*constante)/1000000;

% Calculando o percentual da seleção ocupado pelas

células (confluência) percentual = (sum(im13(:))/numElemROI{indice})*100; %

Caso máscara preenchida com zeros

% Calculando a área de citoplasma identificado na

seleção areaCitoplasma = (sum(im13(:))*constante)/1000000; %

Caso máscara preenchida com zeros

% Atualizando textos e estados dos componentes da

interface if (indice2 == (gapLimiar + 1)) % Necessário para

evitar que a tela pisque muito set(handles.text19,'Visible','on'); set(handles.pushbutton3,'Visible','on'); set(handles.uipanel2,'Visible','on'); set(handles.text13,'String','Limiar de nível de

cinza escolhido para identificar os núcleos:');

set(handles.text14,'String',sprintf('%.2f',limiar)); set(handles.text3,'String','Área selecionada

(mm^2):'); set(handles.text6,'String',sprintf('%.6f',area)); set(handles.text4,'String','Número de núcleos

identificados (unid.):');

set(handles.text7,'String',sprintf('%.2f',numDeNucleos)); set(handles.text5,'String','Número de núcleos

identificados por área selecionada (unid./mm^2):');

set(handles.text8,'String',sprintf('%.2f',numDeNucleos/area)); set(handles.text15,'String','Confluência -

Percentual da área selecionada ocupado pelas células identificadas

(%):');

set(handles.text16,'String',strcat(sprintf('%.2f',percentual), ' %')); set(handles.text17,'String','Área média das

células identificadas ((um^2)/unid.):');

set(handles.text18,'String',sprintf('%.2f',(areaCitoplasma/numDeNucleo

s)*1000000)); pause(espera); end

% Atualizando o número total de análises feitas analises = analises + 1;

% Guardando os resultados limiarVetor{1,analises} = limiar; areaVetor{1,analises} = area; numDeNucleosVetor{1,analises} = numDeNucleos; percentualVetor{1,analises} = percentual; areaCitoplasmaVetor{1,analises} = areaCitoplasma;

end

end

91

% PROCEDIMENTO DE CÁLCULO DE INCERTEZAS EXPANDIDAS DE MEDIÇÃO indice = 1; for indice = 1:analises % Calculando valores médios para cada grandeza medida limiarMedio = limiarMedio +

(limiarVetor{indice}/analises); areaMedia = areaMedia + (areaVetor{indice}/analises); numDeNucleosMedio = numDeNucleosMedio +

(numDeNucleosVetor{indice}/analises); nucleosIdentMedio = nucleosIdentMedio +

((numDeNucleosVetor{indice}/areaVetor{indice})/analises); percentualMedio = percentualMedio +

(percentualVetor{indice}/analises); areaCitoplasmaMedia = areaCitoplasmaMedia +

(areaCitoplasmaVetor{indice}/analises); tamanhoMedio = tamanhoMedio +

(((areaCitoplasmaVetor{indice}/numDeNucleosVetor{indice})*1000000)/ana

lises); end

indice = 1; for indice = 1:analises % Loop criado exclusivamente para preparar o cálculo das

incertezas incertezaLimiar = incertezaLimiar + ((limiarVetor{indice}-

limiarMedio)^2); incertezaNumNucleos = incertezaNumNucleos +

((numDeNucleosVetor{indice}-numDeNucleosMedio)^2); incertezaArea = incertezaArea + ((areaVetor{indice}-

areaMedia)^2); incertezaAreaCito = incertezaAreaCito +

((areaCitoplasmaVetor{indice}-areaCitoplasmaMedia)^2); incertezaPercentual = incertezaPercentual +

((percentualVetor{indice}-percentualMedio)^2); incertezaNucleosIdent = incertezaNucleosIdent +

(((numDeNucleosVetor{indice}/areaVetor{indice})-nucleosIdentMedio)^2); incertezaTamanho = incertezaTamanho +

((((areaCitoplasmaVetor{indice}/numDeNucleosVetor{indice})*1000000)-

tamanhoMedio)^2); end

fatorK = 2; incertezaLimiar = fatorK*sqrt(incertezaLimiar/(analises - 1)); incertezaNumNucleos =

fatorK*sqrt(incertezaNumNucleos/(analises - 1)); incertezaArea = fatorK*sqrt(incertezaArea/(analises - 1)); incertezaAreaCito = fatorK*sqrt(incertezaAreaCito/(analises -

1)); incertezaPercentual =

fatorK*sqrt(incertezaPercentual/(analises - 1)); incertezaNucleosIdent =

fatorK*sqrt(incertezaNucleosIdent/(analises - 1)); incertezaTamanho = fatorK*sqrt(incertezaTamanho/(analises -

1));

% Atualizando textos e estados dos componentes da interface set(handles.text19,'Visible','on'); set(handles.pushbutton3,'Visible','on'); set(handles.uipanel2,'Visible','on');

92

set(handles.text13,'String','Limiar de nível de cinza

escolhido para identificar os núcleos:'); set(handles.text14,'String',[sprintf('%.2f',limiarMedio),' +-

',sprintf('%.2f',incertezaLimiar)]); set(handles.text3,'String','Área selecionada (mm^2):'); set(handles.text6,'String',[sprintf('%.6f',areaMedia),' +-

',sprintf('%.6f',incertezaArea)]); set(handles.text4,'String','Número de núcleos identificados

(unid.):');

set(handles.text7,'String',[sprintf('%.2f',numDeNucleosMedio),' +-

',sprintf('%.2f',incertezaNumNucleos)]); set(handles.text5,'String','Número de núcleos identificados

por área selecionada (unid./mm^2):');

set(handles.text8,'String',[sprintf('%.2f',nucleosIdentMedio),' +-

',sprintf('%.2f',incertezaNucleosIdent)]); set(handles.text15,'String','Confluência - Percentual da área

selecionada ocupado pelas células identificadas (%):'); set(handles.text16,'String',[sprintf('%.2f',percentualMedio),'

% +- ',sprintf('%.2f',incertezaPercentual),' %']); set(handles.text17,'String','Área média das células

identificadas ((um^2)/unid.):'); set(handles.text18,'String',[sprintf('%.2f',tamanhoMedio),' +-

',sprintf('%.2f',incertezaTamanho)]);

end

% Apagando a mensagem de status set(handles.text10,'String',''); set(handles.text10,'Visible','off'); pause(espera);

% --- Executes on button press in pushbutton3. function pushbutton3_Callback(hObject, eventdata, handles) % hObject handle to pushbutton3 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)

% DECLARAÇÃO DE VARIÁVEIS GLOBAIS global contador indice fronteiras3 rotulo2 curvaNucleos

curvaPercentuais nucleoMinimo espera global numDeNucleos limiar percentual global imNucleos imCito numElemROI flagROI flagNoBorder %

Nomenclaturas genéricas global mascara coordenadasY coordenadasX global im24 im25 im26 im27 % Imagens para a geração do gráfico dos

núcleos global im44 im45 global numDeNucleosAux global limiarMedio numDeNucleosMedio percentualMedio global incertezaLimiar incertezaNumNucleos incertezaPercentual

% O usuário optou por gerar a curva de calibração % Iniciando o cálculo do gráfico set(handles.text10,'String','Gerando gráfico referente à última

região selecionada... Aguarde...'); set(handles.text10,'Visible','on');

93

pause(espera);

% Contornando a situação de ter diversas R.O.I. para analisar if (flagROI == 1) imNucleos = imNucleos{1}; mascaraAux = mascara{1}; coordenadasY = coordenadasY{1}; coordenadasX = coordenadasX{1}; imCito = imCito{1}; numElemROI = numElemROI{1}; end

contador = 1; indice = 1; for indice = 0:255 % Trecho para calcular a curva de núcleos im24 = im2bw(imNucleos, indice/255); im25 = imopen(im24, strel('diamond', 2)); fronteiras3 = watershed(-bwdist(~im25, 'chessboard')); im26 = im25; im26(fronteiras3 == 0) = 0;

if (flagNoBorder == 0) % O usuário não requisitou limpeza de bordas im27 = bwareaopen(im26, nucleoMinimo);

elseif (flagNoBorder == 1) % O usuário requisitou limpeza de bordas % Verificando se é um caso de amostra inteira ou região

selecionada if (flagROI == 0) % Trata-se de uma limpeza de borda em amostra inteira im27 = bwareaopen(im26, nucleoMinimo); im27 = imclearborder(im27);

elseif (flagROI == 1) % Trata-se de uma limpeza de borda em região

selecionada im27 = bwareaopen(im26, nucleoMinimo); im27 = im27 + ~mascaraAux(coordenadasY, coordenadasX); im27 = imclearborder(im27);

end

end [rotulo2, numDeNucleosAux] = bwlabel(im27); curvaNucleos(contador) = numDeNucleosAux;

% Trecho para calcular a curva de percentuais de confluência im44 = im2bw(imCito, indice/255); im45 = bwareaopen(im44, nucleoMinimo); % Calculando o percentual da seleção ocupado pelas células

(confluência) if (flagROI == 0) curvaPercentuais(contador) =

(sum(im45(:))/numel(im45))*100; elseif (flagROI == 1) curvaPercentuais(contador) =

(sum(im45(:))/numElemROI)*100; end

94

% Atualizando o contador que ajuda a preencher os vetores contador = contador + 1; end

% Exibindo os gráficos gerados eixoHorizontal = [0:1:255]; set(handles.axes4,'Visible','on'); set(handles.text11,'Visible','on'); set(handles.text11,'String','Curvas calculadas para cada escolha

de limiar possível'); set(handles.text10,'Visible','off'); set(handles.text19,'Visible','off'); set(handles.pushbutton3,'Visible','off'); [ax,p1,p2] =

plotyy(handles.axes4,eixoHorizontal,curvaNucleos,eixoHorizontal,curvaP

ercentuais); set(p1,'Color', 'blue'); set(p2,'Color', 'red'); set(ax(1),'YColor', 'blue'); set(ax(2),'YColor', 'red'); ylabel(ax(1),'Nº de núcleos identificados (em

unid.)','Color','blue','FontSize',12); ylabel(ax(2),'Confluência (em %)','Color','red','FontSize',12); grid(ax(1),'on'); hold('on'); if (flagROI == 0) line(limiar, numDeNucleos, 'LineStyle', 'none','Marker',

'x','MarkerSize',12,'Color','blue', 'Parent', ax(1)); line(limiar, percentual, 'LineStyle', 'none','Marker',

'x','MarkerSize',12,'Color','red', 'Parent', ax(2)); elseif(flagROI == 1) limiteSup = limiarMedio + incertezaLimiar; limiteInf = limiarMedio - incertezaLimiar;

if (limiteSup > 255) limiteSup = 255; end if (limiteInf < 0) limiteInf = 0; end

line(limiarMedio, numDeNucleosMedio, 'LineStyle',

'none','Marker', 'x','MarkerSize',12,'Color','blue', 'Parent', ax(1)); rectangle('Position',[limiteInf, numDeNucleosMedio -

incertezaNumNucleos, limiteSup - limiteInf, incertezaNumNucleos *

2],'EdgeColor','blue','Parent', ax(1)); line(limiarMedio, percentualMedio, 'LineStyle',

'none','Marker', 'x','MarkerSize',12,'Color','red', 'Parent', ax(2)); rectangle('Position',[limiteInf, percentualMedio -

incertezaPercentual, limiteSup - limiteInf, incertezaPercentual *

2],'EdgeColor','red','Parent', ax(2)); end hold('off');

% Imprimindo gráfico numa janela a parte, para possibilitar salvá-

lo figure;

95

[ax,p1,p2] =

plotyy(gca,eixoHorizontal,curvaNucleos,eixoHorizontal,curvaPercentuais

); title('Curvas calculadas para cada escolha de limiar

possível','FontSize',12); set(p1,'Color', 'blue'); set(p2,'Color', 'red'); set(ax(1),'YColor', 'blue'); set(ax(2),'YColor', 'red'); ylabel(ax(1),'Nº de núcleos identificados (em

unid.)','Color','blue','FontSize',12); ylabel(ax(2),'Confluência (em %)','Color','red','FontSize',12); grid(ax(1),'on'); hold('on'); if (flagROI == 0) line(limiar, numDeNucleos, 'LineStyle', 'none','Marker',

'x','MarkerSize',12,'Color','blue', 'Parent', ax(1)); line(limiar, percentual, 'LineStyle', 'none','Marker',

'x','MarkerSize',12,'Color','red', 'Parent', ax(2)); elseif(flagROI == 1) line(limiarMedio, numDeNucleosMedio, 'LineStyle',

'none','Marker', 'x','MarkerSize',12,'Color','blue', 'Parent', ax(1)); rectangle('Position',[limiteInf, numDeNucleosMedio -

incertezaNumNucleos, limiteSup - limiteInf, incertezaNumNucleos *

2],'EdgeColor','blue','Parent', ax(1)); line(limiarMedio, percentualMedio, 'LineStyle',

'none','Marker', 'x','MarkerSize',12,'Color','red', 'Parent', ax(2)); rectangle('Position',[limiteInf, percentualMedio -

incertezaPercentual, limiteSup - limiteInf, incertezaPercentual *

2],'EdgeColor','red','Parent', ax(2)); end hold('off'); pause(espera);

% --- Executes on button press in pushbutton4. function pushbutton4_Callback(hObject, eventdata, handles) % hObject handle to pushbutton4 (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)

% Chamando rotina de calculo, que já atualiza todos os resultados calcularAlgoritmo();