Professional Documents
Culture Documents
EM752
Procesamiento Digital de Imágenes
Tarea Recuperativa
Entonces, según la guía del problema, se deben filtrar los todos verdes de cada imágen y
luego operar en convolución con los métodos de gradiente Prewitt, Sobel y Roberts (al menos)
Parte 1
Para filtrar los tonos verdes, se deben separar las tres capas RGB de la imágen, tomar el
histograma de la capa verde y modificarla de manera que todos sus pixeles tengan un valor por
debajo del umbral en que el verde se hace notar. En este caso este umbral se determina con un valor
de 100 al analizar las imágenes.
Los pasos a seguir en MATLAB son:
1. Leer archivo de imagen:
Imagen=imread('archivo.bmp');
2. Separar las capas
3. Histograma de la capa Verde (G)
4. Filtro y ecualización de capa verde
5. Unir las capas Roja-Verde Filtrada-Azul
M=eliminaverde(Level,Imagen);
6. Guardar Imagén Filtrada
imwrite(M,'archivo_filtrada','png');
El código de la función "eliminaverde" es:
function M=eliminaverde(Level,Imagen)
Igreen=Imagen(:,:,2);
maximo=max(max(Igreen))
figure
imshow(Igreen)
figure
imhist(Igreen);
%p2=imhist(Igris);
[m,n]=size(Igreen);
Level
k=double((maximo-Level))/Level;
k=ceil(k);
for i=1:m
for j=1:n
if Igreen(i,j)>=Level
u=Igreen(i,j)-Level;
B=u/k;
Mgreen(i,j)=round(B);
else
Mgreen(i,j)=Igreen(i,j);
end
end
end
figure
imhist(Mgreen);
figure
imshow(Mgreen);
M(:,:,1)=Imagen(:,:,2);
M(:,:,2)=Mgreen(:,:);
M(:,:,3)=Imagen(:,:,3);
Cómo se observa, los tonos verdes desaparecen y las imágenes toman tonos magenta.
Parte 2
En base a las imágenes filtradas, se debe convolucionar cada una con los filtros Prewit,
Sobel y Roberts para hacer la detección de la característica particular, luego analizar la eficiencia en
la detección de cada caso.
Para esto, se debe invertir el filtro, luego operarlo sobre un pixel de la imagen y la zona
circundante. Luego convolucion entre una imagen y un filtro es:
function Ig=convolucion2d(Imagen,Filtro)
%I imagen
%G filtro
I=Imagen;
G=Filtro;
[m1,n1]=size(G);
%se invierte filtro en 180°
for i=0:m1-1
for j=0:n1-1
G_(i+1,j+1)=G(m1-i,n1-j);
end
end
G=G_;
[m,n]=size(I);
H=zeros(m+2*(a-1),n+2*(b-1));
h=0;
for i=a:a+n-1
h=h+1;
o=0;
for j=b:b+n-1
o=o+1;
H(i,j)=I(h,o);
end
end
size(H)
%Para cada pixel a partir del punto a,b hacer la
convolucion entre ambas
%matrices
h=0;
for i=a:m+a-1
h=1+h;
o=0;
for j=b:n+b-1
o=1+o;
suma=0;
%el valor sobre el pixel i,j
for f=1:m1
for g=1:n1
r(f,g)=double(G(f,g))*double(H((i-a)+f,(j-b)+g));
suma=suma+r(f,g);
end
end
Ig(h,o)=uint8(suma); %error en ultimo punto
Ig(h,o);
end
end
Luego de aplicar el filtro, para obtener una mejor vizualización se define un umbral y se
asigna un valor 0 para los pixeles que se ubican sobre el umbral y un valor de 255 par alos pixeles
ubicados bajo el umbral.
function B=binariza(Imagen,Level)
I=Imagen;
[m,n]=size(I);
for i=1:m
for j=1:n
if I(i,j)>=Level
B(i,j)=0;
else
B(i,j)=255;
end
end
end
Las funciones para invocar los métodos son las siguientes.
Prewitt
Nudo Vivo
Roberts Sobel
Se observa que, para detectar nudos, el método roberts garantiza una mejor detección,
seguido del método sobel y por último prewitt (demasiado ténue).
Las imágenes de los gradientes por si mismas son muy oscuras, por lo que no vale la pena
ponerlas en este informe. El resultado es la aproximación binarizada de la suma algebraica de la
aplicación de los filtros por gradiente de cada método.
Medula
Roberts Sobel
Se observa en este caso que las respuestas de sobel o prewitt son mejores, ya que
practicamente no presentan ruido al detectar una medula en comparacion con roberts.
Grieta
Roberts Sobel
Se observa que tanto sobel como prewitt son similares en su calidad de deteccion de la
grieta. En cambio roberts presenta perturbaciones que pueden complicar la detección, sin embargo
tambien se puede observar que la detecta con claridad.
Segmentación de una imagen de Arroz
El archivo arroz.txt se importa al matlab y luego se procesa como imagen, guardandola como
arroz.png.
Para obtener la segmentacion de arroz para distintos valores de sigma, desde 0.1 a 1.6, con un
tamaño de ventana 5 se escribió el siguiente código:
%LOG=laplacianodelgauss(mu,sigma,Imagen)
%para obtener el LoG se escribe:
%LOG=laplacianodelgauss(mu,sigma,Imagen)
%para obtener el LoG se escribe:
LoG1=[];
m=0;
for l=1:16
LoG1(:,:,l)=fspecial('log',5,.1*l);
Ig(:,:,l)=convolucion2d(Arroz,LoG1(:,:,l));
[y,u]=size(Ig)
subplot(4,4,l)
imshow(Ig(:,:,l))
title(strcat('Sigma=',num2str(l*.1)))
imwrite(uint8(Ig(:,:,l)),strcat('D:\TareaImagenes\parte2\Sigma_7_'
,num2str(l*.1),'.png'),'png')
B(:,:,l)=binariza(Ig(:,:,l),16);
imwrite(uint8(B(:,:,l)),strcat('D:\TareaImagenes\parte2\BIN_7_',nu
m2str(l*.1),'.png'),'png')
end
figure
for i=1:16
subplot(4,4,i)
imhist(uint8(Ig(:,:,i)))
title(strcat('Histograma Sigma=',num2str(i*.1)))
end
figure
for i=1:16
subplot(4,4,i)
imshow(B(:,:,i))
title(strcat('Binarizado Sigma=',num2str(i*.1)))
end
Lo que resulta en para un tamaño de matriz 3x3 y variante
LoG1(:,:,1) =
LoG1(:,:,2) =
LoG1(:,:,3) =
0.8131 0.8131 0.8131 0.8131 0.8131
0.8131 0.8164 1.1985 0.8164 0.8131
0.8131 1.1985 -21.0694 1.1985 0.8131
0.8131 0.8164 1.1985 0.8164 0.8131
0.8131 0.8131 0.8131 0.8131 0.8131
LoG1(:,:,4) =
LoG1(:,:,5) =
LoG1(:,:,6) =
LoG1(:,:,7) =
LoG1(:,:,8) =
LoG1(:,:,10) =
LoG1(:,:,11) =
LoG1(:,:,12) =
LoG1(:,:,13) =
LoG1(:,:,14) =
LoG1(:,:,15) =
LoG1(:,:,16) =
Ahora bien, si se ocupa el método de Prewitt para segmentar se obtiene la imagen binaria
siguiente, con un corte deumbral 120.
Se observa que es bastante más difusa la segmentación que con el método LOG.
Con el método roberts se obtuvo un mejor resultado, con un umbral de corte en 100:
Lo que era de esperarse ya que en la parte 1 este método detecta de mejor forma las figuras
ovaladas.
Aplicación de algortimos locales en la obtención de
características de un rostro
Consiste en implementar los métodos que aplican un estudio sobre la zona circundante del
pixel en cuestión.
Los dos métodos implementados son Local Normalization y Local Binary Pattern.
Se escribió primero el código correspondiente a las funciones de cada método y luego un
archivo central (main) que los invoca y muestra los resultados.
Local Normalization
function LN=localnormalization(Imagen,N)
%N grado de la local norma,[0,1,2,] induce una ventana cuadrada de
tamaño imapar
K=2*N+1
I=Imagen;
[m,n]=size(I);
a=(K-1)/2
for i=K-a:m-a
for j=K-a:n-a
g_=double(I(i-a:i+a,j-a:j+a));
g=g_(:);
mu=mean(g);
st=std(g);
LN(i,j)=((double(I(i,j))-mu)/st);%uint8
end
end
end
Local Binary Pattern
function LBP=localbinarypattern(Imagen)
K=3;
I=Imagen;
[m,n]=size(I);
a=(K-1)/2;
for i=K-a:m-a-1
for j=K-a:n-a-1
for k=1:K
for l=1:K
g_(a+1,a+1)=0;
if I(i-2+k,j-2+l)<I(i,j)
g_(k,l)=1;
else
g_(k,l)=0;
end
end
end
g=g_(:);
a=g(1:4);
b=g(6:9);
g=[a;b];
g=flipud(g);
LBP(i,j)=binvec2dec(g');%uint8
end
end
end
Main
I=imread('cara.png');
%etapa local nomalization
subplot(1,6,1);
imshow(I);
title('Original')
for i=1:4
LN(:,:,i)=localnormalization(I,i);
subplot(1,6,i+1);
imshow(LN(:,:,i));
title(strcat('Local Norm. Ventana
',num2str(2*i+1),'x',num2str(2*i+1)));
imwrite((LN(:,:,i)),strcat('D:\TareaImagenes\parte3\cara_ventana_
',num2str(2*i+1),'.png'),'png')
end
figure
%etapa Local binary pattern
LBP=localbinarypattern(I);
subplot(1,2,1);
imshow(I);
title('Original')
subplot(1,2,2);
imshow(LBP);
title('LBP')
imwrite(LBP,'D:\TareaImagenes\parte3\cara_LBP_.png','png')
figure
%etapa Local binary pattern
subplot(1,2,1);
imshow(I);
title('Original')
subplot(1,2,2);
imshow(LN(:,:,1));
title('LN 3x3')
figure
%etapa Local binary pattern
subplot(1,2,1);
imshow(LBP);
title('LBP')
subplot(1,2,2);
imshow(LN(:,:,1));
title('LN 3x3')
La función localnormalization permite obtener resultados para distintos tamaños de ventana,
como se observa de los resultados de la primera parte del main:
O r ig in a l L o c a l N o rm . V e n ta n a 3 x 3 L o c a l N o rm . V e n ta n a 5 x 5 L o c a l N o rm . V e n ta n a 7 x 7 L o c a l N o rm . V e n ta n a 9 x 9
O rig in a l LN 3x3
Luego, la LBP resultante es:
O r ig in a l LB P
LB P LN 3x3
Con esto, se puede observar que en ambos métodos se pueden extraer características de la
imagen, sin embargo se puede decir que LN al ser un resultado estadistico de la zona circundante
retorna mejores resultados que LBP que retorna resultados booleanos de la zona circundante. LN
sería entonces, como se observa, más sensible a características obviadas en el caso LBP.