• Nenhum resultado encontrado

PCIM Laboratório 0, parte visual: Iniciação ao tratamento de imagem, vídeo e áudio no MATLAB

N/A
N/A
Protected

Academic year: 2021

Share "PCIM Laboratório 0, parte visual: Iniciação ao tratamento de imagem, vídeo e áudio no MATLAB"

Copied!
6
0
0

Texto

(1)

PCIM 2013-2014

Laboratório 0 - parte visual:   Iniciação à manipulação de imagem,

vídeo e áudio com o MATLAB

1. Processamento de imagem

O MatLab possui diversos comandos específicos para manipular imagens e para executar diversas técnicas de processamento de imagens. O MatLab adequa-se particularmente bem à manipulação e processamento de imagens, uma vez que a sua estrutura básica de dados é a matriz e uma imagem não é mais do que uma matriz. Uma imagem é lida no MatLab e armazenada como uma matriz do tipo uint8 (valor inteiro representado com 8 bits, logo com 28=256 valores possiveis).

.

Para se poder utilizar os valores dessa matriz em operações de números do tipo double como adição, subtração, multiplicação e divisão, é necessário efectuar a conversão dessa matriz para o tipo double (valores reais de precisão dupla).

Algumas funções de Image file import/export/manipulação: • imread - lè ficheiro de imagem

• imwrite - grava imagem num ficheiro • imshow - apresenta uma imagem numa janela

• imageinfo - cria uma ferramenta que permite obter informação sobre uma imagem gravada em ficheiro • imattributes - lista atributos da imagem que está a ser visualizada

• image - visualiza uma matriz como sendo uma imagem; o valor de cada elemento da matriz especifica a cor do elemento de imagem espacialmente correspondente.

• im2frame e frame2im - permitem converter de formato de imgem para formato de filme usado pelo MATLAB e vice-versa.

• etc

Os seguintes comandos permitem executar diversas operações com imagens:

>> im = imread (‘lena.tif’); % lê a imagem “lena” com o formato TIFF para a matriz im (MxN)

>> [line,col]=size(im(:,:,1)); % lê o número de linhas e colunas da imagem que foi armazenada na matriz im

% e armazena nas variáveis lin e col (variáveis quaisquer); nota: a matriz im tem 3 dimensões já que a imagem que foi lida % a imagem lena, é uma imagem a cores. Nota: o comando [line,col]=size(im) daria o mesmo resultado.

>> imshow (im); % visualiza a imagem que está na matriz im

>> im2 = double(im); % converte a imagem que está na matriz im para tipo real de precisão dupla e guarda na nova matriz im2 >> im2 = im2 + 10; % aumenta o brilho da imagem que está na matriz im2

>> im2 = uint8(im2); % converte de novo a imagem para valores do tipo inteiro

>> imwrite (im2, ‘nome.bmp’, ‘bmp’); % guarda a nova imagem no ficheiro “nome.bmp”

Para imagens armazenadas no formato “true color” (BMP, 24 bits) são criadas matrizes a 3 dimensões para armazenar cada uma das componentes fundamentais de côr R, G, B. Os 24 bits correspondem a 3 bits para representar cada uma das componentes de côr. Cada dimensão contém uma matriz MxN (nº de linhas vezes nº de colunas) que corresponde à matriz de um dos tons (exatamente na ordem RGB). Para separar cada componente, o seguinte código pode ser utilizado:

>> im = imread(‘movie.bmp’); % imagem RGB de 24 bits, isto é, cada elemento de imagem é representado por 24 bits, sendo % 8 bits para a cor vermelha (R), 8 bits para a cor verde(G) e 8 bits para a cor azul (B): >>size(im) % permite verificar que se trata de uma matriz de n pixels por m colunas com profundidade 3, isto é uma matriz a % 3 dimensões - a profundidade 3 indica que na prática existe uma matriz (ou plano) para cada uma das cores

(2)

>> r = im(:, :, 1); % atribui todas as linhas e todas as colunas do primeiro plano de im à variável r , i.e., a matriz com os % valores de vermelho (R)

>> g = im(:, :, 2); % matriz do segundo plano com os valores de G >> b = im(:, :, 3); % matriz do terceiro plano com os valores de B

Neste caso, se quisermos guardar em variáveis as 3 dimensões da matriz im onde se guardou a imagem, a leitura das dimensões da imagem deve ser feita da seguinte forma:

>> [lin, col, plano] = size(im);

Ou seja, um terceiro parâmetro de saída deve ser usado. Se quisermos guardar as dimensões y,x (nº de linhas por nº de colunas) de um dos planos, podemos fazer:

>> [line,col]=size(im(:,:,1));

Neste caso inspeciona as dimensões do 1º plano, ou seja da matriz onde foram armazenados os valores de R da imagem. Nota: o comando [line,col]=size(im) daria o mesmo resultado em line, mas daria um valor 3 vezes maior em col, porque apresentaria o nº de colunas de toda a estrutura (composta por três matrizes bidimensionais) .

Podemos criar uma nova imagem preta com 24 bits por elemento, usando as dimensões da imagem lida: >> im2 = uint8(zeros(lin, col, plano)); % criada uma imagem só de zeros

Cada plano dessa nova matriz pode receber um dos planos da outra imagem, por exemplo, incrementados e decrementados de um dado valor:

>> im2(:, :, 1) = r+50; >> im2(:, :, 2) = g-50; >> im2(:, :, 3) = b+100;

Para visualizarmos e compararmos as duas imagens que estão armazenadas nas matrizes im e im2: >>figure; imshow(im);

>>figure; imshow(im2);

Outros comandos para manipulação de imagens importadas para o MATLAB e armazenadas em matrizes: rgb2gray - conversão de 24 bits para tons de cinza

im2bw - conversão para preto-e-branco rgb2ind - conversão de 24 bits para 256 cores imresize - altera as dimensões de uma imagem

imrotate - roda uma imagem de um determinado ângulo imhist - calcula o histograma de uma imagem

imcrop - define uma sub-imagem rectangular dentro da imagem original B = imresize(A, M, ‘method’)

O comando de cima retorna uma matriz que é M vezes maior (ou menor) que a imagem A, onde ‘method’ pode ser um de (funções definidas no MATLAB):

nearest = vizinho mais próximo bilinear = interpolação bilinear bicubic = interpolação bicúbica

Exemplo para obter uma imagem com metade das dimensões da imagem que está na matriz A, usando interpolação “nearest neighbor”:

>> B = imresize (A, 0.5, ‘nearest’); B = imrotate(A, Ângulo, ‘method’);

O comando de cima retorna uma matriz que é uma versão rodada de Ângulo da imagem A, onde ‘method’ pode ser um de (funções definidas no MATLAB): onde method = nearest, bilinear ou bicubic.

Exemplo:

>> A = imread (‘lena’, ‘tif’);

(3)

>> imhist(A); % apresenta um gráfico de barras com o histograma da imagem A >> histograma=imhist(A);

>> plot(histograma); >> histeq(A);

>> imshow(imadjust(A));

Os comandos de cima permitem obter o histograma de uma imagem (imhist: registo do nº de vezes que cada valor ocorre numa imagem), podendo-se também usar as funções histeq e imadjust que permitem efectuar a equalização e a especificação do histograma de uma imagem, respectivamente.

A filtragem de uma imagem pode ser conseguida com a função filter2, a qual devolve uma matriz de valores reais. Assim, é necessário arredondar e converter para uint8 para se poder visualizar a imagem filtragem:

>> im = imread(‘movie.bmp’); >> im = rgb2gray(im); >> figure;

>> subplot(2,2,1);imshow(im);title('Imagem original escala cinza'); >> h = fspecial (‘average’, 5); % cria um filtro da média (box) >> im2 = uint8(round(filter2(h, im)));

>> subplot(2,2,2);imshow(im2);title('Imagem filtro media');

>> h= fspecial('motion',20,45); % cria um filtro de efeito movimento >> im3= imfilter(im,h,'replicate');

>> subplot(2,2,3);imshow(im3);title('Imagem filtro motion'); >> h=fspecial('unsharp'); % cria um filtro para realce contornos >> im4 = imfilter(im,h,'replicate');

>> subplot(2,2,4);imshow(im4);title('Imagem mais nitida');

Podemos criar uma matriz com valores aleatórios e apresentá-la como uma imagem usando a função built-in ‘image’; por exemplo, desta forma:

>> c=round(255*rand(255)); >> image(c);

Podemos converter uma imagem a cores para uma imagem a preto e branco, nível de cinzas ou imagem a cores indexada com as funções built-in ‘image’, ‘rgb2gray’, ‘rgb2ind’; por exemplo, desta forma:

>> im=imread(‘lena.bmp’); >> bw=im2bw(im, 0.5); >> imshow(im); >> >> grayLena=rgb2gray(im); >>imshow(grayLena); >> >>[indLena,mapa]=rgb2ind(im,256);

Podemos criar uma sub-imagem a partir de uma imagem já importada e acabada de visualizar: >>im=imread(‘bird-blue.jpg’);

>>imshow(im); >>subImagem=imcrop;

% define com o rato a área desejada, em cima da imagem original; acaba com “crop image” >>imshow(subImagem);

(4)

2. Processamento de vídeo

O MatLab tem algumas funções para processamento de vídeo, trabalhando mais facilmente com arquivos do tipo AVI (Audio Video Interleave), aceitando alguns CODECs (codificadores/decodificadores) mais conhecidos como o XViD. É possível abrir arquivos MPEG também.

Funções de Video file import/export: • aviread – Lê arquivo de vídeo (AVI)

• aviinfo - Retorna informação sobre o arquivo AVI • avifile - Cria um novo arquivo AVI

• mmreader – Lê frames de vídeo de um arquivo multimédia (como MPEG) • mmfileinfo - Retorna informação sobre o arquivo multimédia

• movie2avi – Cria filme AVI a partir de um filme MATLAB (.mov – não do Quicktime) Exemplo: >> info = aviinfo('video1.avi') info = Filename: 'D:\MATLABR2008b\work\video1.avi' FileSize: 2997760 FileModDate: '03-mai-2010 19:53:44' NumFrames: 13 FramesPerSecond: 15 Width: 320 Height: 240 ImageType: 'truecolor' VideoCompression: 'none' >> h = info.Height; >> w = info.Width;

A leitura/importação do arquivo de vídeo é feita pelo comando aviread (arquivo AVI) :>> mov = aviread('video1.avi');

Acesso a uma frame específica: >>mov=aviread('video1.avi',3);

Mas mov continua a ser do tipo estrutura. Para termos a frame sob o formato de imagem: >>mov1=mov.cdata;

E então podemos fazer: >>imshow(mov1); Para tocarmos o vídeo: >>movie(mov);

>>movie(mov,rep,info.FramesPerSecond);

>>movie(mov,2,2*info.FramesPerSecond); % repete 2 vezes o filme com um taxa de refrescamento dupla da original Conversão de imagem para frame:

>>mov1(i)=im2frame(image,map);

Variando i podemos criar um filme a partir de várias imagens.

(5)

3. Processamento de áudio

Um som pode ser gravado com a função wavrecord, a qual gera um arquivo do tipo wave: >>som=wavrecord(16000,8000,1,'double');

Nota: é necessário ter um dispositivo de entrada de som no computador.

Isto cria o vector som do tipo double com 16000 amostras com uma taxa de amostragem de 8kHz. O parâmetro 1 indica que é gravado apenas um canal (mono). Para tocar o som:

>>soundsc(som); >>soundsc(som,8000); Podemos vizualizar o gráfico: >>plot(som);

Podemos normalizar os valores do vector para o intervalo -1 a 1: >>som=som/max(abs(som));

Para ler/importar um arquivo wav: >>som=wavread('teste.wav'); >>[som,fs]=wavread('teste.wav'); >> [som,fs,nbits]=wavread('teste.wav');

Neste ultimo caso obtemos a frequência de amostragem na variável fs e o nº de bits por amostra na variável nbits. Podemos carregar apenas parte do ficheiro .wav:

>>sizeinfo = wavread('handel100.wav', 'size'); >>total_amostras = sizeinfo(1);

>>startpos = total_amostras / 4; >>endpos = 2 * startpos;

>>[som2, fs2] = wavread(‘handel100.wav’, [startpos endpos]); >>sound(som2, fs2);

Podemos aplicar filtros ao sinal, onde a e b são coeficientes do filtro (para FIR, a=1): >>y=filter(b,a,som);

Podemos calcular FFT: >>som_fft=fft(som,256); >>plot(abs(som_fft)); >>plot(abs(fftshift(som_fft)));

Neste ultimo caso obtemos um grafico com as baixas frequências centradas.

Utilização de um filtro IIR com função de transferência H(z)=1-0.9375z-1, fazendo com que o som fique mais nasal: >>h=[1-0.9375];

>>y=filter(h,1,som); >>sound(y,22000);

Divisão do som em 240 frames, filtragem individual dessas frames e reagrupamento das frames filtradas: >>w=240; >>n=floor(length(som)/w); >>for k=1:n seg=som(1+(k-1)*w:k*w); segf=filter(h,1,seg); outsp(1+(k-1)*w:k*w)=segf; end >>sound(outsp,22000); Criação de música

Onda sinusoidal de amplitude 1 e frequência 523.25Hz (corresponde a um pitch C num piano, uma oitava acima do C médio): >>cnote=sin(2*pi*523.25*(0:0.000125:0.5));

O vector cnote contem amostras da onda sinusoidal de t=0s até t=0.5s, separadas de 0.000125s (intervalo de amostragem Ts=1/ fs), correspondente a fs=8kHz.

(6)

Gravar esse som num ficheiro wav: >>wavwrite(cnote,'c.wav');

Para obter a lista das frequências de diferentes notas: http://www.dolmetsch.com/musictheory27.htm. Criar mais notas:

>> f= sin(2*pi*174.61*(0:0.000125:0.5)); >>g = sin(2*pi*195.99*(0:0.000125:0.5)); >>a = sin(2*pi*220*(0:0.000125:0.5)); >>b = sin(2*pi*246.94*(0:0.000125:0.5)); >>c=cnote; >>line1=[a,b,c,f,g]; >>line2=[c,f,g,b,a]; >>song=[line1,line2];

Referências

Documentos relacionados

A fim de dar pleno cumprimento aos normativos citados, o Sistema Integrado de Administração Financeira do Governo Federal – SIAFI contém um módulo específico para registro dos

5 – Em relação aos arrendamentos para habitação, cessa o disposto na alí- nea a) do número anterior após transmissão por morte para filho ou enteado ocorrida depois da entrada

ilustrados na seção 2.. O processo é semelhante ao anterior mas nele não é necessário gerar um ritmo previamente. O primeiro passo seria escolher os ataques que compõem o ritmo,

Através deste projeto de diplomação, realizou-se um estudo de caso no qual se propôs a predição do número de afundamentos de tensão no ponto de conexão da empresa

Estruturas cerebrais pertencentes aos clusters encontrados com a análise de GLM do ritmo teta, referente à análise entre o grupo de pacientes com ELT à direita versus voluntários,

Com o objetivo de se conhecer o índice de infestação do inseto na cultura foi avaliada no mês de setembro de 2003, nos Municípios de Olímpia, Catanduva e Teodoro Sampaio, SP,

PtxImage* img: Ponteiro para objeto do tipo PtxImage onde será armazenada a imagem em memória. const uint8* buffer: Buffer contendo a imagem estruturada a

Esses parâmetros são padronizados e relacionados com a codificação do áudio e do vídeo, frames que compõem a imagem ou grupo de imagem, resolução do