Anda di halaman 1dari 18

2.

Resoluo - Algoritmos Matlab

2.1 Intro_Matlab
1) Dado A = [1 2 3;4 5 6;7 8 9];
a) Mostrar a primeira coluna de A
b) Mostrar a segunda linha de A
c) Mostrar o tamanho de A

A = [1 2 3;4 5 6;7 8 9];


A(:,1)
A(2,:)
size(A)

2) Crie uma funo que retorne a mdia e o desvio padro de um vetor


de dados qualquer.
function y = md(x)
y(1) = sum(x)/length(x);
y(2) = std(x);
end

3) Crie uma funo que retorne o tringulo de Pascal.


a = 1;
disp(a);
while (length(a) < 5)
a = [0 a]+[a 0];
disp(a);
end

1
1

4) Dadas duas imagens quaisquer, crie uma funo para misturar as


duas em uma nica imagem. Calcule o tempo para esta operao.
Implemente a funo primeiramente utilizando comandos for e em
seguida sem usar . Compare os resultados obtidos e conclua a
respeito.

%com for
img = imread('linux.jpg');
img2 = imread('Xadrez.jpg');
img = rgb2gray(img)
img2 = rgb2gray(img2)

tic;
for i=1:256
for j=1:256
img3(i,j)=((img(i,j)+img2(i,j))/2);
end
end
toc;

%Elapsed time is 0.008118 seconds.

%sem for
img = imread('linux.jpg');
img2 = imread('Xadrez.jpg');
img = rgb2gray(img);
img2 = rgb2gray(img2);
tic;

img3 = ((img + img2)/2);

toc;

%Elapsed time is 0.000113


seconds.
Speedup: A verso sem for
72 vezes mais rpida.

5) Dada uma imagem colorida, construa uma funo que retorne cada
banda desta imagem.

function [R,G,B]=banda(im)
img = imread(im)
R = img(:,:,1);
G = img(:,:,2);
B = img(:,:,3);
figure(1)
imshow(R);
figure(2)
imshow(G);
figure(3)
imshow(B);
end

Red

Green

Blue

2.2 Roteiro PDI_1


1) Iniciar o Matlab
2) Criar uma Matriz A, de tamanho 4x5, cujos valores so:
A=[1 1 2 1 3;1 1 2 3 1;2 2 3 2 2; 1 3 2 1 1]
3) Convert-la em uma imagem com 3 nveis de cinza, usando:
I=mat2gray(A)
4) Exibi-la com 3 nveis de cinza e refletir sobre o resultado obtido:
Imshow(I,3)
R 1-4
A = [1 1 2 1 3;1 1 2 3 1;2 2 3 2 2;1 3 2 1 1];
I = mat2gray(A);
subplot(121);
imshow(I);

A funo mat2gray normaliza os valores da matriz,


transformando o maior valor (3) em 1 (pixel branco) e
o menor valor (1) em 0 (pixel preto). O restante dos
pixels normalizado de forma proporcional. Ex: pixel
de valor 2 transformado em 0,5.
5) Criar um mapa de cores atravs de uma matriz mapa:
mapa=[.4 .4 .4;0 .6 1;1 0 0]

6) Exibir a imagem indexada com o mapa de cores criado e interpretar o resultado


obtido, usando o comando:
R. 5-6

Imshow(A,mapa)
A = [1 1 2 1 3;1 1 2 3 1;2 2 3 2 2;1 3 2 1 1];
I = mat2gray(A);
mapa=[.4 .4 .4;0 .6 1;1 0 0];
subplot(121);
imshow(A,mapa)

MAPA
0.4000
0
1.0000

0.4000
0.6000
0

0.4000
1.0000
0

A
1
1
2
1

1
1
2
3

2
2
3
2

1
3
2
1

3
1
2
1

A funo imshow(A,mapa) faz uma


ligao entre os valores de A e o
MAPA. Os valores da matriz A
correspondem s linhas de MAPA.
Ex: o valor 3 de A, corresponde a
linha 3 de MAPA, onde os valores [1
0 0] dizem respeito aos valores [R G
B], portanto um pixel vermelho.
7) Criar uma imagem de intensidade em forma de faixas de diferentes tons de cinza,
desde o branco at o preto.
8) Verificar os valores dos pixels da imagem e interpret-los.
9) Exibir a imagem com 16 nveis de cinza, fazendo:
Imshow(G,16)
F=(0:15)/15;
G=[F;F;F];
subplot(121);
imshow(G)
0
0
0

0.0667
0.0667
0.0667

0.1333
0.1333
0.1333

Esse trecho de cdigo cria 16 valores entre 0 e 1 e atribui a matriz G. Esses


valores correspondem a intensidade de cinza da imagem.
10) Carregar uma imagem indexada colorida j disponvel na toolbox e exibi-la. Notar
que aps ter sido carregada, sua matriz de ndices ser armazenada na varivel X,
enquanto seu mapa de cores (palheta) estar na varivel map.
11) Usando o comando whos, verificar o tamanho da matriz map e concluir a respeito.
12)
Verificar o contedo da matriz map, observando que nenhuma linha igual a
outra e que cada uma delas corresponde a uma combinao das componentes R,G e
B, normalizadas na faixa de 0 a 1.

map

128x3

3072 double

A varivel X composta por nmeros que


variam
entre
1
e
128.
Os
nmeros
correspondem s linhas da matriz map. Cada
linha de map referente aos valores [RGB] da
imagem.

13) Converter a imagem trees para imagem de intensidade e exibi-la com 128 nveis de
cinza.
load trees
J = ind2gray(X,map);
imshow(J)

14) Criar uma imagem binarizada:


15) Exibi-la usando: Imshow(BN,2)
BN = [0 0 1 0 0;0 1 1 1 0;1 1 1 1 1;0 1 1 1 0;0 0
1 0 0];
subplot(121)
imshow(BN)

16) Converter a imagem trees de indexada para RGB e exibi-la:


17) Verificar o contedo de R,G e B do pixel de coordenadas (5,5).
Obs.: pesquisar os valores de R(5,5), G(5,5) e B(5,5).

load trees
[R,G,B] = ind2rgb(X,map);
J = [R,G,B];
imshow(J);

R(5,5) ans = 0.5490


G(5,5) ans = 0.7412
B(5,5) ans = 0.9059

18) Testar a exibio de mltiplas imagens com o mesmo mapa de cores, com a
sequncia de passos a seguir;

clear all;
load trees;
subplot(121);
imshow(X,map);
title('Antes de Rotacionar');
subplot(122);
imshow(imrotate(X,35,'crop'),map);
title('Depois')

2.3 Roteiro PDI_2


1) Iniciar o matlab
2) Carregar a imagem clown, convert-la para imagem monocromtica e exibir seu
histograma, usando a funo imhist.
2000
1500
1000
500
0
0

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

load clown
I=ind2gray(X,map);
subplot(211);
imhist(I);
subplot(212);
imshow(I);

3) Repetir o passo 2 para a imagem trees e interpretar o resultado obtido.

load trees
I=ind2gray(X,map);
subplot(211);
imhist(I);
subplot(212);
imshow(I);

2000
1000
0
0

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

4) Verificar o efeito de aplicar transformaes de intensidade a uma imagem com


valores y entre 0 e 1. onde:

Z =x y
load trees
I=ind2gray(X,map);
J = imadjust(I,[],[],.5);
subplot(221);
imshow(I);
subplot(223);
imshow(J);
subplot(222);
imhist(I);
subplot(224);
imhist(J);

2000
1000
0
0

0.5

0.5

2000
1000
0

A linha 3 do cdigo refere-se a funo imadjust. Essa


funo mapeia os valores de intensidade da imagem I para
novos valores em J. Os parmetros [] e [] mantm o padro
[0 1] do range de intensidade para as imagens de entrada e
sada. O parmetro 0.5 (gamma) especifica a forma da curva
que mapeia os valores de intensidade. Se gamma < 1, o
mapeamento torna os valores mais claros. Se gamma > 1, o
mapeamento torna os valores mais escuros.

5) Verificar o efeito de aplicar transformaes de intensidade a uma imagem com


valores de y maiores que 1.

2000
1000
0
0

0.5

0.5

2000
1000
0

load trees
I=ind2gray(X,map);
J = imadjust(I,[],
[],1.5);
subplot(221);
imshow(I);
subplot(223);
imshow(J);
subplot(222);
imhist(I);
subplot(224);
imhist(J);

Com gamma > 1, a imagem fica mais escura como pode ser visto no
histograma.
6) Equalizar o histograma da imagem trees para 128 nveis de cinza.
load trees
I=ind2gray(X,map);
J =histeq(I,128);
subplot(221);
imshow(I);
subplot(223);
imshow(J);
subplot(222);
imhist(I);
subplot(224);
imhist(J);

2000
1000
0
0

0.5

0.5

2000
1000
0

7) A funo histeq tambm permite que o histograma seja equalizado para um


nmero menor de nveis de cinza.
load trees
I=ind2gray(X,map);
J =histeq(I,16);
subplot(221);
imshow(I);
subplot(223);
imshow(J);
subplot(222);
imhist(I);
subplot(224);
imhist(J);

2000
1000
0
0

0.5

0.5

3000
2000
1000
0

J recebe uma imagem que mapeada com 128 nveis em uma imagem mapeada com 16
nveis.
8) Repetir os passos 6 e 7 para a imagem clown.
2000
1500
1000
500
0
0

0.5

0.5

3000
2000
1000
0

load clown;
I=ind2gray(X,map);
J =histeq(I,16);
subplot(221);
imshow(I);
subplot(223);
imshow(J);
subplot(222);
imhist(I);
subplot(224);
imhist(J);

9) Para ilustrar o conceito de pseudocolorizao, dividiremos a faixa total


de nveis de cinza da imagem spine em 6 segmentos e atribuiremos a
cada um deles uma cor distinta, predefinida no mapa de cores prism:
load spine;
I=ind2gray(X,map);
imshow(I);
Y = grayslice(I,6);
imshow(Y,prism(6));
colorbar;

3
2

10) Para verificar o conceito de expanso de histograma, sugere-se a seguinte


seqncia:
load clown
I = ind2gray(X,map);
J=imadjust(I,[0 0.5],[],
[]);
subplot(222);
imhist(I,128);
subplot(221);
imshow(I);
subplot(224);
imhist(J,128);
subplot(223);
imshow(J);
A linha 3 do cdigo faz com que os valores de referncia da
imagem original que so 0 para o pixel de menor valor e 0.5
para o pixel de maior valor sejam mapeados para [0 1].
Aumentando assim os nveis de intensidade e expandindo o
histogram.
3000
2000
1000

0.2

0.4

0.6

0.8

0.2

0.4

0.6

0.8

4000
3000
2000
1000

11) Repetir o passo 10 para a imagem trees e concluir a respeito.


3000
2000
1000
0
0

0.2

0.4

0.6

0.8

0.2

0.4

0.6

0.8

6000
4000
2000
0

load trees
I = ind2gray(X,map);
J=imadjust(I,[0 0.5],[],[]);
subplot(222);
imhist(I,128);
subplot(221);
imshow(I);
subplot(224);
imhist(J,128);
subplot(223);
imshow(J);

A linha 3 do cdigo faz com que os valores de referncia da imagem


original que so 0 para o pixel de menor valor e 0.5 para o pixel de
maior valor sejam mapeados para [0 1]. Aumentando assim os nveis de
intensidade e expandindo o histogram.

12) Para verificar o conceito de compresso de histograma, sugere-se a seguinte


sequncia:
load clown
I = ind2gray(X,map);
J=imadjust(I,[],[0.5 1],[]);
subplot(222);
imhist(I,128);
subplot(221);
imshow(I);
subplot(224);
imhist(J,128);
subplot(223);
imshow(J);
A linha 3 do cdigo mostra um funo que recebe os nveis de
intensidade mnimo e mximo da imagem: [0 1] e faz o mapeamento para
os nveis [0.5 1].
3000
2000
1000

0.2

0.4

0.6

0.8

0.2

0.4

0.6

0.8

3000
2000
1000

2.4 PDI_2
function out=filtro(i,j,im)
%gera a mscara em forma de vetor
masc(1:(i*j)) = 1/(i*j);
%faz a leitura da imagem e converte em escala de cinza
img = imread(im);
img = rgb2gray(img);
%encontra o tamanho da imagem
[l,c] = size(img);
%percorre a imagem levando em conta o tamanho da mscara
for(x=ceil(i/2):l-floor(i/2))
for(y=ceil(j/2):c-floor(j/2))
a=0;
pos=1; %controla os ndices da mscara
for(t=(x-floor(i/2)):(x+floor(i/2))) %percorre a mscara na
imagem
for(p=(y-floor(j/2)):(y+floor(j/2)))
a = (img(t,p)*masc(pos)) + a; %acumula as multiplicaes
pos=pos+1;
end
end
z(x,y) = a; %salva o valor na nova imagem
end
end

imshow(z)
out = z;
A funo filtro recebe como parmetros o nmero de linhas e colunas da
mscara e a imagem onde o filtro ser aplicado.

1) Implemente uma funo no matlab para correo de rudos aleatrios em imagens. Tal
funo dever permitir variar as dimenses da mscara de entrada.
Na imagem abaixo foi aplicado o filtro com mscara 5x5. Perceba que os pontos escuros na barriga do
pinguim comeam a sumir. Isso acontece pois ao redor deles a maioria dos pixels de cor branca.

2.5 Roteiro_PDI_3
1) Iniciar o matlab
2) Criar a matriz h para filtragem passa-baixa pela tcnica de filtragem de mdia.
3) Carregar a imagem trees, convert-la para imagem monocromtica e filtr-la
usando a tcnica de filtragem pela mdia. Exibir na tela as duas imagens e
concluir a respeito.

h=[1 1 1;1 1 1;1 1 1]/9;


load trees;
I = ind2gray(X,map);
B=filter2(h,I);
subplot(121); imshow(I);
subplot(122); imshow(B);
A funo filter2 faz a convoluo da mscara h com a imagem I.

4) Corrompendo a imagem com rudo.


Original

Imagem filtrada

Rudo Sal e Pimenta

load trees;
I = ind2gray(X,map);
J=imnoise(I,'salt &
pepper');
B=filter2(h,I);
subplot(221); imshow(I);
title('Original');
subplot(222); imshow(J);
title('Rudo Sal e
Pimenta');
subplot(223); imshow(B);
title('Imagem filtrada');

A funo imnoise adiciona rudo sal e pimenta. A funo filter2 realiza a convoluo de
h por I e retira o rudo.

5) Utilizando a funo medfilt2 (filtragem pela mediana).

load trees;
I = ind2gray(X,map);
K=medfilt2(I,[3 3]);
subplot(121); imshow(I);
subplot(122); imshow(K);
A funo medfilt2 realiza a convoluo da imagem I por um filtro 3x3.
O filtro aplicado da mediana.

6) Repetir o passo anterior para verso da imagem trees corrompida com o rudo
sale pimenta.

load trees;
I = ind2gray(X,map);
J=imnoise(I,'salt & pepper');
K=medfilt2(J,[3 3]);
subplot(221); imshow(I);
subplot(222); imshow(J);
subplot(223); imshow(K);
O resultado mostrou que o filtro da mediana apresenta um bom resultado
quando aplicado em imagens com rudo sal e pimenta.

7) Filtragem pela mdia de mltiplas imagens.

load trees;
I = ind2gray(X,map);
J1=imnoise(I,'salt & pepper');
J2=imnoise(I,'salt & pepper');
J3=imnoise(I,'salt & pepper');
J4=imnoise(I,'salt & pepper');
J = (J1 + J2 + J3 + J4)/4;
subplot(231); imshow(I);
subplot(232); imshow(J);
subplot(233); imshow(J1);
subplot(234); imshow(J2);
subplot(235); imshow(J3);
subplot(236); imshow(J4);
Neste experimento 4 imagens foram geradas a partir da distoro de uma
imagem original com rudo sal e pimenta. A mdia das quatro imagens
com rudo gerou uma imagem resultante menos ruidosa.

8) Efeito emboss
load trees;
clf
I=ind2gray(X,map);
h=fspecial('sobel');
A=filter2(h,I);
imshow(mat2gray(A));

A funo fspecial gera o filtro sobel (passa alta). A funo filter2


faz a convoluo desse filtro com a imagem trees. possvel perceber
que as bordas foram destacadas.

9) Realce de imagens

clear
A=[0 -1 0;-1 5 -1;0 -1 0];
load trees;
N=255;
J=ind2gray(X,map);
K=round(J*N);
L=filter2(A,K);
[lin,col]=size(L);
for i=1:lin
for j=1:col
if L(i,j)<0
L(i,j)=0;
end
end
end

for i=1:lin
for j=1:col
if L(i,j)>N
L(i,j)=N;
end
end
end
L = L/N;
subplot(121); imshow(J);
subplot(122); imshow(L);
A linha round(J*N) faz a converso de um mapa de intensidades variando
entre 0 e 1 para um mapa variando entre 0 e 255. A funo filter2
realiza a convoluo da imagem com o filtro passa altas. Os laos
subsequentes servem para impedir que aps a convoluo, alguns valores
fiquem abaixo de zero ou acima de 255. A linha L = L/N, faz com que a
imagem retorne novamente ao mapa de intensidades entre 0 e 1.

10)

Unsharp masking

clear
load trees;
J=ind2gray(X,map);
h=fspecial('unsharp');
clf
N=255;
K=round(J*N);
L=filter2(h,K);
[lin,col]=size(L);
for i=1:lin
for j=1:col
if L(i,j)<0
L(i,j)=0;
end
end
end
for i=1:lin

for j=1:col
if L(i,j)>N
L(i,j)=N;
end
end
end
L = L/N;
subplot(121); imshow(J);
subplot(122); imshow(L);
Neste exerccio foi utilizado o filtro unsharp que serve para realar
o contraste. Essa funo permite outros parmetros como:

for a Gaussian lowpass filter


'sobel' for a Sobel horizontal edge-emphasizing filter
'prewitt' for a Prewitt horizontal edge-emphasizing filter
'laplacian' for a filter approximating the two-dimensional Laplacian operator
'log' for a Laplacian of Gaussian filter
'gaussian'

11)

High boost

clear
load trees;
J=ind2gray(X,map);
p1=1.1;
p2=1.15;
p3=1.2;

w1=9*p1-1;
w2=9*p2-1;
w3=9*p3-1;
m1=[-1 -1 -1; -1 w1 -1; -1 -1 -1];
m2=[-1 -1 -1; -1 w2 -1; -1 -1 -1];
m3=[-1 -1 -1; -1 w3 -1; -1 -1 -1];
clf
N=255;
K=round(J*N);
L1=filter2(m1,K);
[lin,col]=size(L1);
for i=1:lin
for j=1:col
if L1(i,j)<0
L1(i,j)=0;
end
end
end
for i=1:lin
for j=1:col
if L1(i,j)>N
L1(i,j)=N;
end
end
end
L1=L1/N;
L2=filter2(m2,K);
[lin,col]=size(L2);
for i=1:lin
for j=1:col
if L2(i,j)<0
L2(i,j)=0;
end
end
end
for i=1:lin
for j=1:col
if L2(i,j)>N
L2(i,j)=N;
end
end
end
L2=L2/N;
L3=filter2(m3,K);
[lin,col]=size(L3);
for i=1:lin
for j=1:col
if L3(i,j)<0
L3(i,j)=0;
end
end
end
for i=1:lin

for j=1:col
if L3(i,j)>N
L3(i,j)=N;
end
end
end
L3=L3/N;
subplot(221);
subplot(222);
subplot(223);
subplot(224);

imshow(J);
imshow(L1);
imshow(L2);
imshow(L3);

O filtro passa-alta utilizado nesse exerccio tm a funo de destacar


pixels brilhantes circundados por pixels mais escuros. Quanto maior o
valor do elemento central do filtro maior ser o destaque dos pixels
brilhantes.

Anda mungkin juga menyukai