Índice:

Diagnóstico automatizado de retinopatia diabética via MATLAB: 33 etapas
Diagnóstico automatizado de retinopatia diabética via MATLAB: 33 etapas

Vídeo: Diagnóstico automatizado de retinopatia diabética via MATLAB: 33 etapas

Vídeo: Diagnóstico automatizado de retinopatia diabética via MATLAB: 33 etapas
Vídeo: Angiofluoresceinografia: o que vc precisa saber a respeito do exame? 2024, Novembro
Anonim
Diagnóstico automatizado de retinopatia diabética via MATLAB
Diagnóstico automatizado de retinopatia diabética via MATLAB
Diagnóstico automatizado de retinopatia diabética via MATLAB
Diagnóstico automatizado de retinopatia diabética via MATLAB

(Veja o esboço do código acima)

A retinopatia diabética é uma doença ocular relacionada ao diabetes, causada por níveis elevados de açúcar no sangue. Os altos níveis de açúcar no sangue fazem com que os vasos sanguíneos da retina inchem, o que leva ao aumento dos vasos sanguíneos e até mesmo a vazamentos dos vasos, o que leva a manchas escuras nas imagens da retina. Com este código, pretendemos usar o aparecimento de manchas de vazamento de vasos sanguíneos como um indicador de retinopatia diabética de fundo, embora outras técnicas de diagnóstico sejam necessárias no mundo real. O objetivo deste código é automatizar o processamento de imagens e o diagnóstico de imagens da retina para identificar sinais de retinopatia diabética mostrados por meio de manchas escuras nas imagens da retina.

10 imagens retinais normais e 10 imagens retinais diagnosticadas foram processadas por meio de um código que primeiro lê e filtra as imagens e, em seguida, quantifica os pontos escuros para determinar se os sintomas de retinopatia diabética estão presentes, com base em um determinado limiar. Os resultados são então impressos na janela de comando para interpretação do visualizador.

Etapa 1: Pré-requisitos

Pré-requisitos
Pré-requisitos

1. Certifique-se de ter baixado o programa MATLAB em seu computador.

2. Baixe o arquivo txt encontrado no link. (Pressione ‘ctrl + s’ para salvar no mesmo diretório do Código MATLAB)

Etapa 2: Pré-requisitos (continuação)

Pré-requisitos (continuação)
Pré-requisitos (continuação)
Pré-requisitos (continuação)
Pré-requisitos (continuação)

4. Abra o MATLAB e digite ‘uiimport’ na janela de comando.

5. Selecione o arquivo officialdiagnoses.txt e importe-o para o MATLAB como uma matriz celular.

6. Certifique-se de ver ‘diagnósticos oficiais’ como uma variável no espaço de trabalho.

Etapa 3: Pré-requisitos (continuação)

Pré-requisitos (continuação)
Pré-requisitos (continuação)

7. Baixe a função ModWald.m, que pode ser obtida do código acima ou baixe do Canvas.

(Código fornecido pelo Professor King e Professor Choi)

Etapa 4: Pré-requisitos (continuação)

Pré-requisitos (continuação)
Pré-requisitos (continuação)

8. Baixe as 400 imagens brutas da seção de dados do Projeto STARE.

Etapa 5: limpar o Matlab para se preparar para executar o código

Limpe o Matlab para se preparar para executar o código
Limpe o Matlab para se preparar para executar o código

Adicionar ao código:

1. fechar tudo (fecha todas as imagens abertas anteriormente)

2. clearvars - exceto diagnósticos oficiais (limpa todas as variáveis, exceto o arquivo txt de diagnósticos oficiais importado anteriormente)

3. cclc (limpa a janela de comando)

Etapa 6: selecione 10 imagens de olhos normais e 10 imagens com sintomas de retinopatia diabética

Selecione 10 imagens de olhos normais e 10 imagens com sintomas de retinopatia diabética
Selecione 10 imagens de olhos normais e 10 imagens com sintomas de retinopatia diabética
Selecione 10 imagens de olhos normais e 10 imagens com sintomas de retinopatia diabética
Selecione 10 imagens de olhos normais e 10 imagens com sintomas de retinopatia diabética

1. Pegue o arquivo de texto de diagnóstico e extraia os nomes das imagens. Esses nomes estão contidos na primeira coluna do arquivo de texto, então para extraí-los digite 'officialdiagnoses (:, 1)'. A matriz de nomes de imagem foi atribuída a uma variável, “all_image_numbers”

2. Converta a variável all_image_numbers de uma matriz de células para uma matriz de matriz usando a função cell2mat

Etapa 7: selecione 10 imagens de olhos normais e 10 imagens com sintomas de retinopatia diabética (continuação)

Selecione 10 imagens de olhos normais e 10 imagens com sintomas de retinopatia diabética (cont.)
Selecione 10 imagens de olhos normais e 10 imagens com sintomas de retinopatia diabética (cont.)
Selecione 10 imagens de olhos normais e 10 imagens com sintomas de retinopatia diabética (cont.)
Selecione 10 imagens de olhos normais e 10 imagens com sintomas de retinopatia diabética (cont.)

3. Selecione 10 imagens de olhos normais para executar o código. As imagens selecionadas neste caso foram 278, 199, 241, 235, 35, 77, 82, 164, 239, 170.

Coloque esses números em uma matriz e atribua-os a uma variável que será chamada ao carregar as imagens.

4. Repita a etapa 3 para imagens da retina que foram diagnosticadas com retinopatia diabética. As imagens selecionadas neste caso foram 139, 137, 136, 135, 133, 140, 141, 116, 157, 188.

Etapa 8: Crie 2 variáveis (normal e diagnosticada) e defina-as como iguais a 0

Crie 2 variáveis (normal e diagnosticada) e defina-as como iguais a 0
Crie 2 variáveis (normal e diagnosticada) e defina-as como iguais a 0

Crie essas variáveis antes do loop for para inicializar os números do loop.

Etapa 9: Crie um for Loop para carregar automaticamente imagens normais

Crie um for Loop para carregar automaticamente imagens normais
Crie um for Loop para carregar automaticamente imagens normais

1. Crie um loop for

2. Defina uma variável de contagem (i, neste caso) para uma matriz de valores 1-10. Esta variável de contagem será usada para chamar cada imagem individualmente

3. Pegue o elemento i na matriz de imagens para extrair e converter o nome da imagem de uma string em um número usando a função num2str.

Encontre o número de dígitos presentes no nome da imagem usando a função numel. Atribua esse valor a uma variável, digits_normal. Esse número deve ser 1 para números de um dígito, 2 para números de dois dígitos e 3 para números de três dígitos. Essas informações serão usadas para chamar imagens automaticamente.

Etapa 10: Crie um for Loop para fazer o upload automático de imagens normais (continuação)

Crie um for Loop para carregar automaticamente imagens normais (continuação)
Crie um for Loop para carregar automaticamente imagens normais (continuação)

3. Crie uma instrução if contendo todas as três possibilidades das etapas anteriores. Se o nome da imagem tiver 1 dígito, a imagem será chamada de “im000”, se tiver 2 dígitos, a imagem será chamada de “im00”, e se tiver 3 a imagem será chamada de “im0”.

4. Sob cada instrução if, atribua uma variável para imread “im” sob a instrução if correspondente com o número apropriado de zeros (conforme descrito acima), seguido por i.

Etapa 11: recorte as bordas da imagem

Corte as Fronteiras da Imagem
Corte as Fronteiras da Imagem

Pegue a imagem original e aplique um filtro imcrop para eliminar as bordas pretas e atribua a uma variável I_crop. O retângulo de corte é especificado usando uma matriz [95, 95, 500, 410].

Etapa 12: Criar uma imagem em escala de cinza

Crie uma imagem em escala de cinza
Crie uma imagem em escala de cinza

Pegue a imagem cortada e aplique o filtro rbg2gray para mudar a imagem para tons de cinza. Atribua esta imagem à variável I2.

Etapa 13: Criar uma imagem contrastada

Crie uma imagem contrastada
Crie uma imagem contrastada

Pegue a imagem I2 e use imadjust para redimensionar os valores de intensidade.

Pegue os valores que estão dentro do intervalo [0,2, 0,7] e redimensione-os para a [0, 1]. O gama é definido como 0,8 para tornar a imagem mais clara. Atribua a nova imagem a I_adjusted.

Etapa 14: Aumente a imagem de contraste

Aumente a imagem de contraste
Aumente a imagem de contraste

Pegue a imagem I_adjusted e use a função adapthisteq para aumentar o contraste.

A sintaxe Adapthisteq requer o nome da imagem, I_adjusted, ‘numTiles’, o tamanho de numTiles, ‘nBins’ e o número de bins. O tamanho de numTiles é definido como [8 8], dividindo a imagem em blocos de 8x8 e o número de caixas é definido como 28. Atribua a imagem a I_constrast.

Etapa 15: Crie um filtro de média

Crie um filtro de média
Crie um filtro de média

Crie uma variável chamada 'meanfilt' usando a função fspecial. Insira a 'função média' para criar o filtro de média e insira [90 90] para o tamanho da janela deslizante.

Etapa 16: Combine o filtro de média com a imagem contrastada

Combine o filtro de média com a imagem contrastada
Combine o filtro de média com a imagem contrastada

Crie uma nova variável chamada mask_mean e use a função imfilter para obter a imagem I_contrast e aplicar o filtro médio criado anteriormente.

Etapa 17: faça uma nova máscara média subtraindo pixels

Faça uma nova máscara média subtraindo pixels
Faça uma nova máscara média subtraindo pixels

Crie uma variável chamada mask_mean2 e use a função imsubtract para subtrair o valor de cada pixel em I_contrast do pixel correspondente em mask_mean.

Etapa 18: Criar uma imagem binária filtrada

Criar uma imagem binária filtrada
Criar uma imagem binária filtrada

Transforme imagens em tons de cinza em preto e branco usando imbinarizar. Input mask_mean2, ‘adaptive’, ‘ForegroundPolarity’, ‘dark’, ‘Sensitivity’, 0.6. Atribua esta nova imagem a mask_binarize.

Etapa 19: remover blobs menores encontrados nas imagens filtradas

Remover blobs menores encontrados nas imagens filtradas
Remover blobs menores encontrados nas imagens filtradas

Remova objetos com conectividade inferior a 100 pixels usando a função bwareaopen em mask_binarize e defina o valor limite para 100. Atribua a variável como bw.

Etapa 20: Criar um elemento de estruturação de disco

Crie um elemento de estruturação de disco
Crie um elemento de estruturação de disco

Crie um elemento de estruturação de disco (com um raio de 2) usando a função strel. Atribua-o a se.

Etapa 21: realizar operações morfológicas de fechamento

Realizar operações morfológicas de fechamento
Realizar operações morfológicas de fechamento

Pegue bw e aplique a função imclose ao elemento estrutural para realizar uma operação de fechamento morfológico no objeto.

Etapa 22: Encontre os objetos com conectividade de pelo menos 8

Encontre os objetos com conectividade de pelo menos 8
Encontre os objetos com conectividade de pelo menos 8

Pegue bw e use bwconncomp para encontrar os objetos com conectividade de pelo menos 8 na imagem. Atribua o número de saída a cc_1.

Etapa 23: Encontre o número máximo de pixels conectados

Encontre o número máximo de pixels conectados
Encontre o número máximo de pixels conectados
Encontre o número máximo de pixels conectados
Encontre o número máximo de pixels conectados

Use a função cellfun para executar a função “numel” em cada célula em CC. Isso encontra o número de elementos na célula PixelIdxList. Atribua valor a “numPixels”.

Encontre os valores máximos em numPIxels. Atribua o maior máximo a “maior” e o índice do valor máximo a “idx”.

Etapa 24: defina os valores máximos de pixels como 0 e encontre pixels com conectividade> = 26 pixels

Remover vasos sanguíneos na imagem
Remover vasos sanguíneos na imagem

= 26 conectividade de pixels "src =" https://content.instructables.com/ORIG/FXY/DTW3/JEOIIEL4/FXYDTW3JEOIIEL4-p.webp

Exibição de figura
Exibição de figura

= 26 conectividade de pixels "src =" https://content.instructables.com/ORIG/FXO/GBX1/JEOIIELB/FXOGBX1JEOIIELB-p.webp

Remova os vasos e conte gotas de sangue
Remova os vasos e conte gotas de sangue

= 26 Conectividade de Pixel "src =" {{file.large_url | add: 'auto = webp & frame = 1 & height = 300'%} ">

Diagnosticar a imagem retinal com base no número de coágulos sanguíneos identificados
Diagnosticar a imagem retinal com base no número de coágulos sanguíneos identificados

= 26 Conectividade de Pixel "src =" {{file.large_url | add: 'auto = webp & frame = 1 & height = 300'%} ">

Defina os pixels com os maiores valores na imagem “bw” para 0, tornando os pixels pretos.

Encontre os objetos com uma conectividade de pelo menos 26 pixels na imagem usando bwconncomp. Atribua à variável cc_1.

Etapa 25: Remova os vasos sanguíneos na imagem

Remova os vasos sanguíneos ainda presentes na imagem usando a função bwpropfilt com um intervalo de [0, 0,9].

[0,9, 1] é excluído porque valores próximos a 1 indicam uma linha. Atribua a “RemoveVessels”.

Etapa 26: exibição da figura

Exibir cada imagem filtrada em uma subtrama. Imshow. com entradas 'border' e 'tight', exibe cada imagem em uma estrutura de subplot. Adicione um título a cada imagem para distinguir qual filtro foi usado.

Etapa 27: remover vasos e contar gotas de sangue

1. Pegue “RemoveVessels” e aplique o recurso ‘Centroid’ em regionprops para identificar os centróides dos objetos na imagem. Esses objetos devem corresponder aos coágulos sanguíneos presentes na imagem.

2. Conte o número de coágulos sanguíneos identificados medindo o comprimento da matriz centróide.

Etapa 28: diagnosticar a imagem retinal com base no número de coágulos sanguíneos identificados

Use instruções if para diagnosticar a imagem com base no número de coágulos sanguíneos identificados.

Se o número de centróides identificados fosse menor ou igual a 5, a imagem era identificada como normal.

Se o número de centróides fosse maior que 5, a imagem era diagnosticada com retinopatia diabética.

O resultado é impresso na janela de comando usando fprintf.

Etapa 29: se houver mais de 5 blobs …

Se houver mais de 5 blobs …
Se houver mais de 5 blobs …

Repita as instruções acima para imagens diagnosticadas como uma instrução else. Esta parte será executada se o número de blobs for maior que 5.

Encerre a instrução if.

Etapa 30: Repita o processo de filtragem para imagens normais com valores de dígitos de imagem como 2 e 3

Repita o processo de filtragem para imagens normais com valores de dígitos de imagem como 2 e 3
Repita o processo de filtragem para imagens normais com valores de dígitos de imagem como 2 e 3
Repita o processo de filtragem para imagens normais com valores de dígitos de imagem como 2 e 3
Repita o processo de filtragem para imagens normais com valores de dígitos de imagem como 2 e 3

Repita o processo para o restante das instruções if originais quando numel (o número de dígitos no número da imagem) for igual a 2 e 3. Isso completa o loop for para as imagens normais.

Finalize o loop for.

Etapa 31: Repita todo o processo para as imagens diagnosticadas

Repita todo o processo para as imagens diagnosticadas
Repita todo o processo para as imagens diagnosticadas

Repita todo o processo usando as imagens diagnosticadas listadas pela matriz “numbers_to_extract_diagnosed”.

Certifique-se de passar por cada figura (i) e altere-a para a figura (i + 10) para que as figuras diagnosticadas apareçam como imagens 11 a 20.

Etapa 32: Análise Estatística

Análise Estatística
Análise Estatística

1. 'Actual_Diagnosis_Matrix' é usado para comparar os resultados com o diagnóstico oficial encontrado no arquivo txt. Os primeiros 10 zeros indicam que as primeiras 10 imagens devem ser normais. As últimas 10 indicam que as últimas 10 imagens devem ser classificadas como retinopatia diabética.

2. O sinal de igual duplo usado para criar 'number_correct' cria uma matriz lógica comparando o valor dos elementos correspondentes de 'Actual_Diagnosis_Matrix' com 'Diagnosis_Matrix' criado a partir do loop for.

Para cada elemento que corresponda ao diagnóstico será adicionado 1, significando que o código diagnosticou corretamente aquela imagem. Se estiver incorreto, adicionará um 0 à matriz.

Então, pegando a soma disso soma todos os outros. Em outras palavras, ele encontra a soma das imagens diagnosticadas corretamente.

3. 'Final_percentage_correct' é a porcentagem calculada de quão preciso o código diagnosticou retinopatia diabética. O número de imagens diagnosticadas corretamente é dividido por 20 (o número total de imagens) e multiplicado por 100 para encontrar a porcentagem de diagnósticos bem-sucedidos.

Etapa 33: Encontrando o intervalo de confiança

Encontrando o intervalo de confiança
Encontrando o intervalo de confiança

1. Certifique-se de ter baixado o ModWald.m para chamá-lo como uma função. Sem a função, você mesmo teria que calcular o intervalo de confiança usando o método de Wald modificado.

2. A função ModWald possui 2 entradas onde a primeira é o número de imagens corretamente identificadas e a segunda é a quantidade total de imagens.

3. A função ModWald produzirá os limites inferior e superior do intervalo de confiança das proporções para a precisão dos dados amostrados. Em outras palavras, você fornecerá um intervalo de porcentagens em que estará a verdadeira porcentagem de precisão do código.

4. Use fprintf abaixo para gerar as estatísticas e o intervalo de confiança na janela de comando.

> fprintf ('%. 0f por cento das imagens da retina foram diagnosticadas corretamente de acordo com o diagnóstico oficial. / n / n', Final_percentage_correct)

> fprintf ('A verdadeira porcentagem em que nosso código diagnosticará corretamente a retinopatia diabética / n cairá na faixa de [%.3f,%.3f], com base em 20 imagens de amostra / n', base_inferior, base_maior)

Recomendado: