Baixe o app para aproveitar ainda mais
Prévia do material em texto
CENTRO UNIVERSITÁRIO INTERNACIONAL UNINTER ESCOLA SUPERIOR POLITÉCNICA BACHARELADO EM ENGENHARIA DA COMPUTAÇÃO DISCIPLINA DE Processamento Digital de Imagens Atividade Prática professor: Charles Way Hun Fung Santos - SP 2020 SUMÁRIO RESUMO i 1 INTRODUCAO 1 1.1 OBJETIVOS 1 2 METODOLOGIA 1 3 resultados e discussões 1 6 REFERÊNCIAS BIBLIOGRÁFICAS 1 RESUMO Esta atividade consiste em reunir, através de quatro diferentes experimentos, procedimentos para processamento digital de imagens com o ambiente matemático SciLab. Serão abordados tópicos importantes da disciplina, tais como Histograma, Filtragem Espacial, Modelagem de cores e morfologia matemática. Palavras-chave: processamento digital, processamento de imagens, SciLab. Abstract: This experimental work is intended to gather different processes applying digital image processing topics and approaches. The main subjects in this practical work are Histogram, Space Filtering, colors modeling and mathematic morphology concepts. Keywords: digital processing, processing images, SciLab. i 14 1. INTRODUCAO Os procedimentos experimentais executados nesta atividade possuem imagens especificadas pelo roteiro desta atividade no portal AVA Univirtus. No desenvolvimento de cada atividade serão realizados processos característicos de cada tópico segregado. OBJETIVOS Utilizar o ambiente matemático SciLab para resolver os problemas de processamento de imagens. METODOLOGIA Conforme citado, cada processo implementado nos experimentos a seguir serão realizados no ambiente virtual SciLab. A resolução de cada item das atividades deve conter o código e, caso necessário, as imagens de resultado. Procedimentos Experimentais Histograma Para realizar esta atividade, fazemos a leitura das imagens fornecidas pelo roteiro house.tif, cameraman.tif e lena_color_256.tif usando o comando “imread”. Imagens utilizadas para atividade histograma. Observa-se que após a leitura das imagens designadas com a ferramenta SciLab, as imagens em escala de cinza possuem uma diferença nas dimensões em comparação com uma imagem colorida. Imagem do console SciLab para leitura das imagens. De acordo com o demonstrado a imagem colorida “imcol” possui três dimensões, enquanto as imagens em escala de cinza possuem duas dimensões. Descrição de tamanho da imagem colorida. Após convertermos a imagem colorida em níveis de cinza utilizando a função “rgb2gray”, possuímos uma matriz dimensional resultante com grau similar às matrizes das imagens que já estavam com estas características anteriormente, ou seja, bidimensionais. Imagem de conversão e rgb2gray. A imagem acima demonstra o código utilizado para converter a imagem colorida e apresenta o comando “subplot” que irá imprimir as imagens resultantes da conversão na tela. Janela resultante da função subplot. Para obtermos o histograma das imagens em níveis de cinza, precisamos utilizar a função “imhist” do ambiente. Abaixo está a relação dos comandos feitos para levantamento do histograma das imagens: Imagem de comandos para histograma. O histograma é um gráfico que representa a distribuição dos pixels em razão dos níveis de cinza. Observa-se abaixo o histograma da imagem cameraman.tif. Sabemos que quanto mais próximo do nível igual a 255, mais claro é o nível de cinza do pixel. Notamos, então, uma considerável concentração de pixels mais próximos do nível mais baixo de cinza, ou seja, mais escuros, devido à roupa do homem. Além de uma distância entres os pixels escuros e os níveis médio/claro, devido a imagem possuir uma paisagem clara ao fundo do homem: Histograma cameraman.tif. Abaixo a relação das imagens em níveis de cinza e seus respectivos histogramas, acrescida do código utilizado para essa impressão: Código para impressão do subplot. Imagem resultante do subplot com histograma. É possível também realizar a equalização do histograma, com o comando “imhistequal”. Vide os comandos utilizados para tal: --> imcameq = imhistequal(imcam); --> imhoueq = imhistequal(imhou); --> imgrayeq = imhistequal(imgray); --> [qtd1,niv1] = imhist(imcameq); --> [qtd2,niv2] = imhist(imhoueq); --> [qtd3,niv3] = imhist(imgrayeq); Esta função realiza uma distribuição mais ampla dos pixels através do eixo de nível de cinza. Isso define mais a imagem com tons mais claros ou mais escuros, dependendo da tendência original do pixel. Conforme abaixo, o histograma e as respectivas imagens após realização da equalização: Imagem com histogramas equalizados. Filtragem Espacial Para realizar esta atividade, faremos a leitura das imagens jetplane.tif e walkbridge.tif. Imagens utilizadas para a atividade. Na filtragem espacial, serão utilizados comandos do ambiente virtual juntamente com máscaras definidas pela atividade. Estas máscaras aplicarão filtros na imagem a fim de destacar determinadas características. Detecção de pontos Isolados Para realizarmos a filtragem com destaque de pontos isolados, será aplicada a convolução de uma matriz sobre as imagens. A matriz utilizada nesta atividade foi exemplificada na atividade prática 2 da disciplina, a qual é uma forma de representação matricial dos laplacianos. Imagem da matriz para pontos isolados. Após a leitura das imagens e criação da matriz a ser utilizada, aplicaremos a convolução nas imagens lidas utilizando o comando “conv2” do SciLab. Porém é necessário converter os pixels de valor inteiro para real antes de aplicar a convolução nas figuras. . Imagens da leitura das imagens, criação da matriz e conversão de pixels. Realizando os códigos de aplicação da matriz e em seguida o subplot, obtemos os seguintes resultados: Código para convolução e impressão do filtro de pontos isolados. Imagens resultado da aplicação do filtro. Percebemos que após a aplicação da matriz as imagens resultantes apresentam destaque aos pontos isolados. Dito isto e de acordo com as características das imagens originais, que possuem uma grande diversidade de elementos não uniformes, há poucos traços que podemos reconhecer nas imagens resultantes. Tais como as vigas da ponte e as linhas do corpo do avião. Isso ocorre porque este filtro destacou pontos que não podíamos ver, mas estavam lá. As imperfeições da neve e do rio são bons exemplos de pontos isolados que não eram vistos na forma original. Detecção de linha Os filtros de detecção de linha são filtros que podem ser usados nas imagens para enfatizar determinados traços em determinada direção. Isso depende da máscara de filtro utilizada para a convolução, pois as linhas possuem diversas direções. Matrizes para aplicação dos filtros de linha. Leitura e criação das máscaras no SciLab. Abaixo segue o código para aplicação da convolução e para impressão das imagens: --> res1H = conv2(imjetR,maskH); --> res1V = conv2(imjetR,maskV); --> res145P = conv2(imjetR,mask45P); --> res145N = conv2(imjetR,mask45N); --> res2H = conv2(imwalR,maskH); --> res2V = conv2(imwalR,maskV); --> res245P = conv2(imwalR,mask45P); --> res245N = conv2(imwalR,mask45N); --> subplot(251); --> imshow(imjet); --> subplot(252); --> imshow(res1H); --> subplot(253); --> imshow(res1V); --> subplot(254); --> imshow(res145P); --> subplot(255); --> imshow(res145N); Resultados dos filtros de linha para imagem jetplane.tif: Resultados do filtro de linhas na imagem walkbridge.tif: As imagens, conforme explicado anteriormente, possuem os destaques para as linhas da imagem original. Cada imagem na direção descrita pelas máscaras, respectivamente horizontal, vertical, 45 graus positivos e 45 graus negativos. Detecção de Borda Para fazer a detecção de borda iremos utilizar 4 modelos de filtros. Roberts, Prewitt, Sobel e Robinson. Máscara de detecção de borda de Robinson (1977). Máscaras de detecção de borda Roberts, Prewitt e Sobel. Aplicando filtro de borda de Roberts nas imagens: --> mask_rbts1 = [-1,0;0,1]; --> mask_rbts2 = [0,-1;1,0]; --> res_imjet1 = conv2(mask_rbts1,imjetR); --> res_imjet2 = conv2(mask_rbts2,imjetR); --> subplot(121); --> imshow(res_imjet1);--> subplot(122); --> imshow(res_imjet2); --> res_imwal1 = conv2(mask_rbts1,imwalR); --> res_imwal2 = conv2(mask_rbts2,imwalR); --> subplot(121); --> imshow(res_imwal1); --> subplot(122); --> imshow(res_imwal2); Filtro de bordas Roberts na imagem jetplane.tif. Filtro de bordas Roberts na imagem walkbridge.tif. Resultados de aplicação de filtros de borda de Prewitt: --> mask_pre1 = [-1,-1,-1;0,0,0;1,1,1]; --> mask_pre2 = [-1,0,1;-1,0,1;-1,0,1]; --> res_imjet1 = conv2(mask_pre1,imjetR); --> res_imjet2 = conv2(mask_pre2,imjetR); --> res_imwal1 = conv2(mask_pre1,imwalR); --> res_imwal2 = conv2(mask_pre2,imwalR); --> subplot(221); --> imshow(res_imjet1); --> subplot(222); --> imshow(res_imjet2); --> subplot(223); --> imshow(res_imwal1); --> subplot(224); --> imshow(res_imwal2); Resultados de aplicação do filtro de Prewitt. Resultados de aplicação de filtros de bordas de Sobel: --> mask_sob1 = [-1,-2,-1;0,0,0;1,2,1]; --> mask_sob2 = [-1,0,1;-2,0,2;-1,0,1]; --> res_imjet1 = conv2(mask_sob1,imjetR); --> res_imjet2 = conv2(mask_sob2,imjetR); --> res_imwal1 = conv2(mask_sob1,imwalR); --> res_imwal2 = conv2(mask_sob2,imwalR); --> subplot(221); --> imshow(res_imjet1); --> subplot(222); --> imshow(res_imjet2); --> subplot(223); --> imshow(res_imwal1); --> subplot(224); --> imshow(res_imwal2); Resultados de aplicação do filtro de Sobel. Resultados de aplicação dos filtros de Robinson: --> mask_rob1 = [1,0,-1;2,0,-2;1,0,-1]; --> mask_rob2 = [0,-1,-2;1,0,-1;2,1,0]; --> mask_rob3 = [-1,-2,-1;0,0,0;1,2,1]; --> mask_rob4 = [-2,-1,0;-1,0,1;0,1,2]; --> mask_rob5 = [-1,0,1;-2,0,2;-1,0,1]; --> mask_rob6 = [0,1,2;-1,0,1;-2,-1,0]; --> mask_rob7 = [1,2,1;0,0,0;-1,-2,-1]; --> mask_rob8 = [2,1,0;1,0,-1;0,-1,-2]; Repetindo a mesma parte do código abaixo para a imagem walkbridge.tif. através da variável “res_imwal”. --> res_imjet1 = conv2(mask_rob1,imjetR); --> res_imjet2 = conv2(mask_rob2,imjetR); --> res_imjet3 = conv2(mask_rob3,imjetR); --> res_imjet4 = conv2(mask_rob4,imjetR); --> res_imjet5 = conv2(mask_rob5,imjetR); --> res_imjet6 = conv2(mask_rob6,imjetR); --> res_imjet7 = conv2(mask_rob7,imjetR); --> res_imjet8 = conv2(mask_rob8,imjetR); --> subplot(241); --> imshow(res_imjet1); --> subplot(242); --> imshow(res_imjet2); --> subplot(243); --> imshow(res_imjet3); --> subplot(244); --> imshow(res_imjet4); --> subplot(245); --> imshow(res_imjet5); --> subplot(246); --> imshow(res_imjet6); --> subplot(247); --> imshow(res_imjet7); --> subplot(248); --> imshow(res_imjet8); Filtros de borda de Robinson na imagem jetplane.tif. Filtros de borda de Robinson na imagem walkbridge.tif. Conforme vimos nestes experimentos com filtros de bordas, notamos que estes atores fazem com que as imagens resultantes da convolução destaquem as bordas das figuras inclusas na imagem, de forma gradiente. Abaixo modelos destas bordas gradientes: Modelos de bordas degrau, rampa e telhado respectivamente. Modelo de Cores Para realizar esta atividade, faremos a leitura das imagens: baboo_colorido.tif, jupiter.tif e lena_colorida.tif. Imagens utilizadas por esta atividade. Separação R,G e B Código: --> bab = imread('baboo_colorido.tif'); --> jup = imread('jupiter.tif'); --> len = imread('lena_colorida.tif'); Repetindo o código a seguir para cada uma das 3 imagens para obter as componentes vermelho, verde e azul de cada imagem. Substituindo a variável “bab“, pela variável de imagem da respectiva imagem. Código utilizado para components RGB da imagem baboo_colorido.tif. Componentes RGB das imagens. Conversão CMY Imagens RGB convertidas para CMY (Ciano, Magenta e Amarelo). Código para conversão. Abaixo código para separação das componentes em CMY e impressão das imagens resultantes: --> Cbab = cmyBab(:,:,1); --> Mbab = cmyBab(:,:,2); --> Ybab = cmyBab(:,:,3); --> Cjup = cmyJup(:,:,1); --> Mjup = cmyJup(:,:,2); --> Yjup = cmyJup(:,:,3); --> Clen = cmyLen(:,:,1); --> Mlen = cmyLen(:,:,2); --> Ylen = cmyLen(:,:,3); --> subplot(331); --> imshow(Cbab); --> subplot(332); --> imshow(Mbab); --> subplot(333); --> imshow(Ybab); --> subplot(334); --> imshow(Cjup); --> subplot(335); --> imshow(Mjup); --> subplot(336); --> imshow(Yjup); --> subplot(337); --> imshow(Clen); --> subplot(338); --> imshow(Mlen); --> subplot(339); --> imshow(Ylen); Imagens em CMY com componentes separadas. Conversão HSI O formato HSI é composto por três partes Matiz (“Hue”), Saturação (“Saturation”) e Intensidade (“Intensity”). A saturação o grau de diluição de uma cor pura pela luz branca, já a intensidade pode ser interpretada como o brilho e a matiz é a cor pura da imagem. --> //COnvertendo a imagem RGB para HSI// --> hsiBab = rgb2hsv(bab); --> hsiJup = rgb2hsv(jup); --> hsiLen = rgb2hsv(len); --> subplot(131); --> imshow(hsiBab); --> subplot(132); --> imshow(hsiJup); --> subplot(133); --> imshow(hsiLen); Imagens convertidas de RGB para HSI. Imagens com as componentes HSI separadas. Componentes individuais RGB Abaixo é a sequência de imagens com as componentes RGB individualizadas, zerando as demais: Inserção de ruídos Nesta etapa estaremos aplicando ruídos com o comando “imnoise” na imagem lena_colorida.tif. Trabalharemos com dois tipos de ruído, gaussiano e Sal e Pimenta. As imagens demonstrativas estarão apresentando à direita a imagem original e à esquerda a imagem com ruído aplicado. Gaussiano Código: --> lenGau = imnoise(len,'gaussian'); --> subplot(121); --> imshow(len); --> subplot(122); --> imshow(lenGau); Demonstração Gaussiano. Sal e Pimenta Código: --> lenSeP = imnoise(len,'salt & pepper'); --> subplot(121); --> imshow(len); --> subplot(122); --> imshow(lenSeP); Demonstração sal e pimento. Filtros Aplicando um filtro de característica passa-baixa nas imagens com ruídos tratadas anteriormente, obtemos o seguinte resultado (Imagem com ruído gaussiano e sal e pimenta respectivamente): Código: --> filter = fspecial('average', 3); --> lenFil = imfilter(lenGau,filter); --> lenFGAU = imfilter(lenGau,filter); --> lenFSeP = imfilter(lenSeP,filter); --> subplot(121); --> imshow(lenFGAU); --> subplot(122); --> imshow(lenFSeP); Aplicando um filtro Bayer na imagem baboo_colorido.tif obtemos o seguinte resultado (Imagem original à direita e filtrada à esquerda): Código: --> [nrow,ncol,nchan] = size(bab); --> babBayer(1:2:nrow,1:2:ncol,2) = bab(1:2:nrow,1:2:ncol,2); --> babBayer(2:2:nrow,2:2:ncol,2) = bab(2:2:nrow,2:2:ncol,2); --> babBayer(1:2:nrow,2:2:ncol,1) = bab(1:2:nrow,2:2:ncol,1); --> babBayer(2:2:nrow,1:2:ncol,3) = bab(2:2:nrow,1:2:ncol,3); --> subplot(121); --> imshow(bab); --> subplot(122); --> imshow(babBayer); Interpolação Aplicando a interpolação na imagem que tratamos com o filtro de Bayer anteriormente, teremos a imagem restaurada: Código: --> R = babBayer(:,:,1); --> G = babBayer(:,:,2); --> B = babBayer(:,:,3); --> R = double(R); --> G = double(G); --> B = double(B); --> G = G+conv2(G,[0 1 0;1 0 1;0 1 0]/4,'same'); --> B = B+conv2(B,[1 0 1;0 0 0;1 0 1]/4,'same'); --> B = B+conv2(B,[0 1 0;1 0 1;0 1 0]/4,'same'); --> R = R+conv2(R,[1 0 1;0 0 0;1 0 1]/4,'same'); --> R = R+conv2(R,[0 1 0;1 0 1;0 1 0]/4,'same'); --> babRestored(:,:,1)=R; --> babRestored(:,:,2)=G; --> babRestored(:,:,3)=B; --> subplot(121); --> imshow(babBayer); --> subplot(122); --> imshow(uint8(babRestored)); Morfologia Matemática Para realizar esta atividade, faremos a leitura das imagens: retangulo.tif, texto.tif e Rosto.tif. Realizaremos um processamento morfológico nas imagens para realçar as características e o conteúdo das imagens. Imagem retangulo.tif Retângulo.tif Devemos resultar no mais próximo possível de um retângulo branco sem nenhum artefato dentro ou fora do mesmo. Variáveis após leitura da imagem retângulo.tif. Código: --> esRet = imcreatese('rect',30,30); --> resRet = imdilate(ret,esRet); --> imshow(resRet); --> resRet = imerode(resRet,esRet); --> imshow(resRet); --> resRet = imerode(resRet,esRet); --> imshow(resRet); --> resRet = imerode(resRet,esRet); --> imshow(resRet); Resultado após primeira dilatação. Resultado após primeira erosão.Resultado após segunda erosão. Resultado final após terceira erosão. Imagem texto.tif Texto.tif Deve-se obter o texto nítido (o texto original possuí falhas nos caracteres). O texto se tornará nítido quando estiver legível e sem falhas dentro das letras. Código: --> esTex = imcreatese('cross',3,3); --> resTex = imdilate(tex,esTex); --> imshow(resTex); --> esTex = imcreatese('rect',1,1); --> resTex = imerode(resTex,esTex); --> imshow(resTex); Resultado após aplicação do código. Imagem Rosto.tif Rosto.tif Fazer um processamento morfológico para conseguir o contorno do rosto na imagem. Para tanto, dilatamos a imagem e subtraímos a nova imagem pela original. Código: --> ros = imread('Rosto.tif'); --> esRos = imcreatese('rect',10,10); --> resRos = imdilate(ros,esRos); --> imshow(resRos); --> finalRos = resRos - ros; --> imshow(finalRos); Resultado após código. REFERÊNCIAS BIBLIOGRÁFICAS Todas as informações teóricas contidas neste trabalho foram baseadas nos estudos do portal AVA Univirtus referentes ao segmento de PROCESSAMENTO DIGITAL DE IMAGENS. SCILAB ONLINE HELP. Manual SciLab. Disponível em: https://help.scilab.org/docs/5.3.0/pt_BR/index.html, acesso em 02 de abril 2020. FARIA, Fabio Augusto. Disciplina de Processamento de Imagens. Disponível em: https://www.ic.unicamp.br/~ffaria/pi2s2015/class10/aula_segmentacao1.pdf, acesso em 02 de abril de 2020. conclusão O processamento digital de imagens é algo bem denso e que faz possível um trabalho muito grande sobre o que está sendo transmitindo na tela. Com os comandos de Histograma vimos que podemos definir mais ou menos uma imagem com uma distribuição mais ampla dos pixels da imagem com relação ao nível de cinza. Além da morfologia ajudando na definição da imagem retratada. A aplicação de filtros que facilmente vemos várias aplicações, inclusive em reconhecimento de imagens e objetos através de capturas de um ultrassom. Uma ferramenta que auxilia, detalha, e manipula uma das principais características da humanidade, a visualização. 1
Compartilhar