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();
Top Related