Baixe Processamento digital e outras Manuais, Projetos, Pesquisas em PDF para Programação em Python, somente na Docsity!
TT902L-Introdução ao Trabalho de Conclusão de Curso
Tema: Processamento de Imagens Médicas
Relatório 2
Autor: Gabriel Alves Baltazar RA: 234628
Orientador: Prof. Rangel
Limeira
07 de Março de 2023
1 Introdução
Aplicação de processamentos morfológicos de imagens, erosão, dilatação, abertura, fecha-
mento, top-hat e watershad, utilizando Python e a biblioteca OpenCV (cv2).
O processamento morfológico de imagens é uma técnica utilizada para extrair informa-
ções sobre a forma, estrutura e geometria de objetos em imagens digitais. É uma técnica
fundamental no campo do processamento de imagens que permite analisar e manipular a
forma e estrutura dos objetos em uma imagem.
O processamento morfológico de imagens é baseado na teoria matemática da morfologia
matemática, que é um conjunto de operações matemáticas que envolvem a transformação
de formas geométricas em uma imagem. Essas operações são aplicadas a uma imagem
para extrair informações sobre a sua estrutura, como bordas, áreas, formas e texturas.
As operações morfológicas básicas incluem a erosão e a dilatação, que são usadas para
remover ou preencher pequenos buracos, bem como para separar ou unir objetos na ima-
gem. Outras operações morfológicas incluem a abertura e o fechamento, que são usados
para suavizar os contornos dos objetos e para eliminar ruídos ou irregularidades.
O processamento morfológico de imagens é amplamente utilizado em áreas como visão
computacional, reconhecimento de padrões, análise de imagem médica, inspeção de qua-
lidade, entre outras. É uma técnica poderosa para a segmentação de imagens, extração
de características e detecção de objetos em imagens digitais.
Em resumo, o processamento morfológico de imagens é uma técnica essencial em proces-
samento de imagens que permite analisar e manipular a forma e estrutura dos objetos em
uma imagem.
2.2 Erosão
A operação de erosão é uma das operações morfológicas básicas no processamento de
imagens. Ela é usada para remover pequenos detalhes ou regiões da imagem que não
correspondem ao padrão denido por um elemento estruturante.
A operação de erosão é aplicada a cada pixel da imagem e é denida pelo elemento
estruturante, que é um conjunto de pixels com uma determinada forma geométrica e
tamanho. Para cada pixel da imagem, o valor do pixel é alterado para o valor mínimo da
região correspondente ao elemento estruturante.
A operação de erosão é usada para suavizar as bordas dos objetos e remover pequenos
detalhes indesejados da imagem. Ela pode ser utilizada isoladamente ou em conjunto com
outras operações morfológicas, como a dilatação e a abertura, para segmentar objetos e
extrair características relevantes da imagem.
A escolha do elemento estruturante na operação de erosão é fundamental para o sucesso da
operação. Um elemento estruturante muito grande pode remover detalhes importantes da
imagem, enquanto um elemento estruturante muito pequeno pode não remover detalhes
indesejados. Por isso, é importante selecionar um elemento estruturante adequado para
cada aplicação.
Em resumo, a operação de erosão é uma das operações morfológicas básicas no proces-
samento de imagens. Ela é usada para remover pequenos detalhes indesejados da imagem
e suavizar as bordas dos objetos. A escolha do elemento estruturante é crucial para o
sucesso da operação.
1 import cv 2 from matplotlib import pyplot as plt 3 4 5 img = cv2. imread ( ' imagens / j. png ' , cv2. IMREAD_GRAYSCALE ) 6 7 ele1 = cv2. getStructuringElement ( cv2. MORPH_CROSS ,(7 ,7) ) 8 ele2 = cv2. getStructuringElement ( cv2. MORPH_ELLIPSE ,(7 ,7) ) 9 ele3 = cv2. getStructuringElement ( cv2. MORPH_RECT ,(7 ,7) ) 10 11 erode1 = cv2. erode ( img , ele1 ) 12 erode2 = cv2. erode ( img , ele2 ) 13 erode3 = cv2. erode ( img , ele3 ) 14 15 plt. subplot (2 ,2 ,1) , plt. imshow ( img , ' gray ') , plt. title ( ' ORIGINAL ') 16 plt. subplot (2 ,2 ,2) , plt. imshow ( erode1 , ' gray ') , plt. title ( ' CROSS ') 17 plt. subplot (2 ,2 ,3) , plt. imshow ( erode2 , ' gray ') , plt. title ( ' ELLIPSE ') 18 plt. subplot (2 ,2 ,4) , plt. imshow ( erode3 , ' gray ') , plt. title ( ' RECT ') 19 20 plt. show () 21 22 23 cv2. waitKey ()
24 cv2. destroyAllWindows ()
Este é um trecho de código Python que usa as bibliotecas OpenCV e Matplotlib para
realizar operações morfológicas em uma imagem.
Primeiro, o código importa as bibliotecas necessárias, incluindo cv2 (OpenCV) e pyplot
de matplotlib.
Em seguida, uma imagem é carregada usando a função cv2.imread() e armazenada em
uma variável chamada img.
Em seguida, três elementos estruturantes são denidos usando a função cv2.getStructuringElement(),
com formas e tamanhos diferentes: uma cruz, uma elipse e um retângulo. Esses elementos
estruturantes serão utilizados na operação de erosão posteriormente.
A função cv2.erode() é usada para executar erosão na imagem de entrada usando cada
um dos elementos estruturantes. O resultado de cada operação de erosão é armazenado
em uma variável separada (erode1, erode2 e erode3).
Finalmente, a imagem original e as três imagens erodidas são exibidas usando as funções
pyplot.subplot() e pyplot.imshow(). Os títulos de cada subtrama também são denidos
usando a função pyplot.title(). O gráco resultante é mostrado usando a função py-
plot.show().
No geral, o código demonstra o uso de diferentes elementos estruturantes na operação de
erosão e como eles afetam a imagem de entrada.
Resultado
Figura 2: Erosão
1 import cv 2 from matplotlib import pyplot as plt 3 4 5 img = cv2. imread ( ' imagens / j. png ' , cv2. IMREAD_GRAYSCALE ) 6 7 ele1 = cv2. getStructuringElement ( cv2. MORPH_CROSS ,(7 ,7) ) 8 ele2 = cv2. getStructuringElement ( cv2. MORPH_ELLIPSE ,(7 ,7) ) 9 ele3 = cv2. getStructuringElement ( cv2. MORPH_RECT ,(7 ,7) ) 10 11 dilate1 = cv2. dilate ( img , ele1 ) 12 dilate2 = cv2. dilate ( img , ele2 ) 13 dilate3 = cv2. dilate ( img , ele3 ) 14 15 plt. subplot (2 ,2 ,1) , plt. imshow ( img , ' gray ') , plt. title ( ' ORIGINAL ') 16 plt. subplot (2 ,2 ,2) , plt. imshow ( dilate1 , ' gray ') , plt. title ( ' CROSS ') 17 plt. subplot (2 ,2 ,3) , plt. imshow ( dilate2 , ' gray ') , plt. title ( ' ELLIPSE ') 18 plt. subplot (2 ,2 ,4) , plt. imshow ( dilate3 , ' gray ') , plt. title ( ' RECT ') 19 20 plt. show ()
Resultado
Figura 3: dilatação
2.4 Abertura
A operação de abertura é uma das operações morfológicas mais comuns no
processamento de imagens. Ela consiste na aplicação da operação de erosão
seguida da operação de dilatação.
A operação de abertura é usada para remover pequenos objetos, preencher
buracos e suavizar as bordas dos objetos. Ela é especialmente útil para
remover ruídos e outras imperfeições da imagem.
A operação de abertura é aplicada a cada pixel da imagem e é denida pelo
elemento estruturante, que é um conjunto de pixels com uma determinada
forma geométrica e tamanho. A operação de erosão remove pequenos objetos
e suaviza as bordas dos objetos, enquanto a operação de dilatação preenche
os buracos deixados pela erosão e conecta os objetos próximos.
1 import cv 2 3 4 img = cv2. imread ( ' imagens / opening. png ' , cv2. IMREAD_GRAYSCALE ) 5 kernel = cv2. getStructuringElement ( cv2. MORPH_CROSS ,(7 ,7) ) 6 7 8 opening = cv2. morphologyEx ( img , cv2. MORPH_OPEN , kernel ) 9 10 cv2. imshow ( ' Original ' , img ) 11 cv2. imshow ( ' Opening ' , opening ) 12 13 cv2. waitKey () 14 cv2. destroyAllWindows ()
Resultado
(a) entrada (b) saída
Figura 4: Operação de abertura
2.6 Top-Hat
A operação de top-hat é uma operação morfológica que envolve a subtração
de uma imagem de entrada da sua abertura. Ela é frequentemente utilizada
para realçar características pequenas ou nas em uma imagem.
A abertura é uma operação morfológica que consiste em aplicar a operação
de erosão seguida da operação de dilatação em uma imagem. A subtração
da imagem de entrada pela abertura resulta em uma imagem que destaca
características nas, como bordas e linhas.
A operação de top-hat pode ser aplicada a uma imagem em escala de cinza
ou em uma imagem binária. Em uma imagem binária, a operação de top-hat
destaca os objetos que são menores do que o elemento estruturante usado na
abertura.
O tamanho e a forma do elemento estruturante usado na operação de
top-hat afetam o resultado da operação. Um elemento estruturante maior
destaca características maiores, enquanto um elemento estruturante menor
destaca características menores.
Em resumo, O ltro top-hat é usado para aprimorar objetos brilhantes de
interesse em um fundo escuro.
1 import cv 2 3 4 img = cv2. imread ( ' imagens / tophat. png ' , cv2. IMREAD_GRAYSCALE ) 5 kernel = cv2. getStructuringElement ( cv2. MORPH_CROSS ,(7 ,7) ) 6 7 8 opening = cv2. morphologyEx ( img , cv2. MORPH_OPEN , kernel ) 9 10 topHat = img - opening 11 12 cv2. imshow ( ' Original ' , img ) 13 cv2. imshow ( ' Opening ' , topHat ) 14 15 cv2. waitKey () 16 cv2. destroyAllWindows ()
Resultado
(a) entrada (b) saída
Figura 6: Operação de top-hat
2.7 Watershed
A operação de Watershed é uma técnica de segmentação de imagens que
tem como objetivo separar regiões distintas em uma imagem, como áreas de
objetos ou elementos, com base em seus gradientes e intensidades.
Essa técnica funciona transformando a imagem em um mapa de elevação,
onde cada pixel é um ponto em um terreno. A partir disso, a imagem é divi-
dida em regiões com base em locais de baixa elevação, denominados mínimos
locais, que são considerados como marcadores de sementes. Então, a técnica
de Watershed é aplicada para preencher a imagem com água, simulando um
processo de inundação. Os marcadores de sementes atuam como represas,
evitando que a água inunde certas áreas da imagem.
Por m, os bordos das áreas inundadas representam as fronteiras de seg-
mentação da imagem. A operação de Watershed é muito utilizada em aplica-
ções de segmentação de imagens, em particular, para segmentação de objetos
em imagens médicas e de microscopia.
No entanto, a aplicação da técnica de Watershed pode ser complexa e
sensível a ruídos, exigindo o ajuste de parâmetros e o pré-processamento
adequado da imagem. Além disso, a seleção adequada dos marcadores de
sementes é crucial para obter uma segmentação precisa da imagem.
Proximo passo:
Removendo pequenos ruídos, obtendo o plano de fundo, achando
o primeiro plano e a região desconhecida.
1 # noise removal 2 kernel = np. ones ((3 , 3) , np. uint8 ) 3 opening = cv. morphologyEx ( thresh , cv. MORPH_OPEN , kernel , iterations =2) 4 # sure background area 5 sure_bg = cv. dilate ( opening , kernel , iterations =3) 6 # Finding sure foreground area 7 dist_transform = cv. distanceTransform ( opening , cv. DIST_L2 , 5) 8 ret , sure_fg = cv. threshold ( dist_transform , 0.7 * dist_transform. max () , 255 , 0) 9 # Finding unknown region 10 sure_fg = np. uint8 ( sure_fg ) 11 unknown = cv. subtract ( sure_bg , sure_fg ) 12 13 14 # cv. imshow ( ' Remocao de ruido ' , opening ) 15 # cv. imshow ( ' Plano de Fundo ' , sure_bg ) 16 # cv. imshow ( ' Primeiro Plano ' , sure_fg ) 17 # cv. imshow ( ' Regiao Desconhecida ' , unknown ) 18 19 # cv. waitKey () 20 # cv. destroyAllWindows ()
(a) Abertura (b) Plano de fundo
(c) Primeiro plano (d) Região desconhecida
Figura 8: Processo de Segmentação
Finalizando: Aplicando watershed
1 markers = cv. watershed ( img , markers ) 2 img [ markers == -1] = [0 ,0 ,255] 3 4 cv. imshow ( ' Watershed ' , np. uint8 ( img ) ) 5 6 cv. waitKey () 7 cv. destroyAllWindows ()
Resultado
(a) Marcadores Segmentados (b) Watershed
Figura 10: Processo de Watershed