Diferencia entre revisiones de «Cosas temporales para cursos»
Sin resumen de edición |
Sin resumen de edición |
||
(No se muestran 10 ediciones intermedias de 2 usuarios) | |||
Línea 1: | Línea 1: | ||
sobre image annotation [http://people.csail.mit.edu/brussell/research/AIM-2005-025-new.pdf] | |||
acceso a la toolbox de matlab [http://labelme.csail.mit.edu/Release3.0/browserTools/php/matlab_toolbox.php] dentro del sitio [http://labelme2.csail.mit.edu/Release3.0/index.php] | |||
********************************* | |||
[[sesion de trabajo de vision por computador sobre Trans. Image Processing Nov-Dic 2013]] | |||
****************************** | |||
function r=segmentar_active_two_class(x,gt,mask,k,n_ciclos) | |||
mask=mask>0; | |||
gt=gt>0; | |||
[n m]=size(gt); | |||
im_u=zeros(size(x)); | |||
for l=1:n_ciclos | |||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%positivas | |||
figure(1) | |||
imshow(x+uint8(im_u*255)) | |||
title('muestras positivas') | |||
coord=floor(ginput(k)); | |||
for i=1:k | |||
muestra_positiva((l-1)*k+i,:)=squeeze(x(coord(i,2),coord(i,1),:)); | |||
end | |||
distancia=zeros(n,m,l*k); | |||
for i=1:l*k | |||
d(:,:,1)=double(x(:,:,1))-double(muestra_positiva(i,1)); | |||
d(:,:,2)=double(x(:,:,2))-double(muestra_positiva(i,2)); | |||
d(:,:,3)=double(x(:,:,3))-double(muestra_positiva(i,3)); | |||
d=d.^2; | |||
d=sum(d,3); | |||
distancia(:,:,i)=d; | |||
end | |||
distancia_clase_1=min(distancia,[],3); | |||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%negativas | |||
figure(2) | |||
imshow(x+uint8(im_u*255)) | |||
title('muestras negativas') | |||
coord=floor(ginput(k)); | |||
for i=1:k | |||
muestra_negativa((l-1)*k+i,:)=squeeze(x(coord(i,2),coord(i,1),:)); | |||
end | |||
distancia=zeros(n,m,l*k); | |||
for i=1:l*k | |||
d(:,:,1)=double(x(:,:,1))-double(muestra_negativa(i,1)); | |||
d(:,:,2)=double(x(:,:,2))-double(muestra_negativa(i,2)); | |||
d(:,:,3)=double(x(:,:,3))-double(muestra_negativa(i,3)); | |||
d=d.^2; | |||
d=sum(d,3); | |||
distancia(:,:,i)=d; | |||
end | |||
distancia_clase_0=min(distancia,[],3); | |||
r=distancia_clase_1<=distancia_clase_0; | |||
r=r.*mask; | |||
u=exp(-abs(distancia_clase_1-distancia_clase_0)/10); | |||
% figure(3) | |||
% imshow(u) | |||
% figure(4) | |||
im_u(:,:,1)=u; | |||
im_u(:,:,2)=u; | |||
im_u(:,:,3)=u; | |||
% | |||
% imshow(uint8(double(x).*im_u)) | |||
% | |||
% figure(5) | |||
% imshow(x+uint8(im_u*255)) | |||
accuracy(l)=sum(sum(r==gt))/(n*m); | |||
sensitivity(l)=sum(sum(double(gt).*r))/sum(sum(gt)); | |||
specificity(l)=sum(sum(double(1-gt).*(1-r)))/sum(sum(1-gt)); | |||
end %%% ciclos | |||
figure | |||
plot(accuracy) | |||
hold | |||
plot(sensitivity,'r') | |||
plot(specificity,'g') | |||
**************** | |||
function r=segmentar_knn_two_class(x,gt,mask,k) | |||
mask=mask>0; | |||
gt=gt>0; | |||
[n m]=size(gt); | |||
imshow(x) | |||
title('muestras positivas') | |||
coord=floor(ginput(k)); | |||
for i=1:k | |||
muestra(i,:)=squeeze(x(coord(i,2),coord(i,1),:)); | |||
end | |||
distancia=zeros(n,m,k); | |||
for i=1:k | |||
d(:,:,1)=double(x(:,:,1))-double(muestra(i,1)); | |||
d(:,:,2)=double(x(:,:,2))-double(muestra(i,2)); | |||
d(:,:,3)=double(x(:,:,3))-double(muestra(i,3)); | |||
d=d.^2; | |||
d=sum(d,3); | |||
distancia(:,:,i)=d; | |||
end | |||
distancia_clase_1=min(distancia,[],3); | |||
imshow(x) | |||
title('muestras negativas') | |||
coord=floor(ginput(k)); | |||
for i=1:k | |||
muestra(i,:)=squeeze(x(coord(i,2),coord(i,1),:)); | |||
end | |||
distancia=zeros(n,m,k); | |||
for i=1:k | |||
d(:,:,1)=double(x(:,:,1))-double(muestra(i,1)); | |||
d(:,:,2)=double(x(:,:,2))-double(muestra(i,2)); | |||
d(:,:,3)=double(x(:,:,3))-double(muestra(i,3)); | |||
d=d.^2; | |||
d=sum(d,3); | |||
distancia(:,:,i)=d; | |||
end | |||
distancia_clase_0=min(distancia,[],3); | |||
r=distancia_clase_1<=distancia_clase_0; | |||
r=r.*mask; | |||
accuracy=sum(sum(r==gt))/(n*m) | |||
sensitivity=sum(sum(double(gt).*r))/sum(sum(gt)) | |||
specificity=sum(sum(double(1-gt).*(1-r)))/sum(sum(1-gt)) | |||
***************** | |||
base de datos de retina [[media:DRIVE.zip| base de datos]] | |||
******************** | |||
function xr=filtro_frec_gauss_pasabanda_2(x,distancia,radio) | |||
% radio 1 > radio 2 | |||
h=fspecial('gauss',size(x),radio); | |||
xform = [ 1 0 0 | |||
0 1 0 | |||
distancia distancia 1 ]; | |||
filtro=zeros(size(x)); | |||
tform_translate = maketform('affine',xform); | |||
h1=imtransform(h,tform_translate, 'XData',[1 size(h,2)],'Ydata',[1 size(h,1)]); | |||
filtro=filtro+h1; | |||
xform(3,1)=-distancia; | |||
tform_translate = maketform('affine',xform); | |||
h1=imtransform(h,tform_translate, 'XData',[1 size(h,2)],'Ydata',[1 size(h,1)]); | |||
filtro=filtro+h1; | |||
xform(3,2)=-distancia; | |||
tform_translate = maketform('affine',xform); | |||
h1=imtransform(h,tform_translate, 'XData',[1 size(h,2)],'Ydata',[1 size(h,1)]); | |||
filtro=filtro+h1; | |||
xform(3,1)=distancia; | |||
tform_translate = maketform('affine',xform); | |||
h1=imtransform(h,tform_translate, 'XData',[1 size(h,2)],'Ydata',[1 size(h,1)]); | |||
filtro=filtro+h1; | |||
filtro=filtro/max(max(filtro)); | |||
figure | |||
imshow(filtro) | |||
xt=fft2(x); | |||
xtc=fftshift(xt); | |||
xtcf=xtc.*filtro; | |||
figure | |||
imshow(log(abs(xtcf)),gray(10)) | |||
title('transformada filtrada') | |||
xtcfd=ifftshift(xtcf); | |||
xr=ifft2(xtcfd); | |||
xr=abs(xr); | |||
figure | |||
imshow(xr/max(max(xr))) | |||
;*********************** | |||
function xr=filtro_frec_gauss(x,radio) | |||
filtro=zeros(size(x)); | |||
tamano=radio*9; | |||
radio_masc=int16(floor(tamano/2)); | |||
h=fspecial('gauss',tamano,radio); | |||
h=h/max(max(h)); | |||
[m n]=size(x); | |||
arribam=int16(m/2+radio_masc); | |||
abajom=int16(m/2-radio_masc); | |||
arriban=int16(n/2+radio_masc); | |||
abajon=int16(n/2-radio_masc); | |||
filtro(abajom:arribam,abajon:arriban)=h; | |||
figure | |||
imshow(filtro) | |||
xt=fft2(x); | |||
xtc=fftshift(xt); | |||
figure | |||
imshow(log(abs(xtc)),gray(10)) | |||
title('transformada centrada') | |||
xtcf=xtc.*filtro; | |||
figure | |||
imshow(log(abs(xtcf)),gray(10)) | |||
title('transformada filtrada') | |||
xtcfd=ifftshift(xtcf); | |||
xr=ifft2(xtcfd); | |||
xr=abs(xr); | |||
figure | |||
imshow(xr) | |||
;************************************ | |||
function xr=filtro_frec_gauss_pasaalta(x,radio) | |||
filtro=zeros(size(x)); | |||
tamano=radio*9; | |||
radio_masc=int16(floor(tamano/2)); | |||
h=fspecial('gauss',tamano,radio); | |||
h=h/max(max(h)); | |||
[m n]=size(x); | |||
arribam=int16(m/2+radio_masc); | |||
abajom=int16(m/2-radio_masc); | |||
arriban=int16(n/2+radio_masc); | |||
abajon=int16(n/2-radio_masc); | |||
filtro(abajom:arribam,abajon:arriban)=h; | |||
filtro=1-filtro; | |||
figure | |||
imshow(filtro) | |||
xt=fft2(x); | |||
xtc=fftshift(xt); | |||
figure | |||
imshow(log(abs(xtc)),gray(10)) | |||
title('transformada centrada') | |||
xtcf=xtc.*filtro; | |||
figure | |||
imshow(log(abs(xtcf)),gray(10)) | |||
title('transformada filtrada') | |||
xtcfd=ifftshift(xtcf); | |||
xr=ifft2(xtcfd); | |||
xr=abs(xr); | |||
figure | |||
imshow(xr) | |||
************************************** | |||
transparencias para el curso de vision [http://www.sc.ehu.es/ccwgrrom/transparencias/] | transparencias para el curso de vision [http://www.sc.ehu.es/ccwgrrom/transparencias/] | ||
Master: Intro a MNI [https://www.dropbox.com/s/qkxvj487iz3ycgz/IntroMRI.pdf?dl=0 Intro a MRI] | |||
: analisis de imagenes medicas, VBM, [https://www.dropbox.com/s/50l35la77rsn0p4/OASIS-2subj.zip VBM 2 sujetos de OASIS], [https://www.dropbox.com/s/xwhyplwwm8w6qjp/OASIS-40sujetos.zip VBM 40 sujetos de OASIS] | : analisis de imagenes medicas, VBM, [https://www.dropbox.com/s/50l35la77rsn0p4/OASIS-2subj.zip VBM 2 sujetos de OASIS], [https://www.dropbox.com/s/xwhyplwwm8w6qjp/OASIS-40sujetos.zip VBM 40 sujetos de OASIS] | ||
algunos codigos matlab para vision por computador | algunos codigos matlab para vision por computador |
Revisión actual - 14:45 9 dic 2014
sobre image annotation [1] acceso a la toolbox de matlab [2] dentro del sitio [3]
sesion de trabajo de vision por computador sobre Trans. Image Processing Nov-Dic 2013
function r=segmentar_active_two_class(x,gt,mask,k,n_ciclos)
mask=mask>0; gt=gt>0;
[n m]=size(gt);
im_u=zeros(size(x));
for l=1:n_ciclos %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%positivas figure(1) imshow(x+uint8(im_u*255)) title('muestras positivas') coord=floor(ginput(k));
for i=1:k muestra_positiva((l-1)*k+i,:)=squeeze(x(coord(i,2),coord(i,1),:)); end
distancia=zeros(n,m,l*k);
for i=1:l*k d(:,:,1)=double(x(:,:,1))-double(muestra_positiva(i,1));
d(:,:,2)=double(x(:,:,2))-double(muestra_positiva(i,2)); d(:,:,3)=double(x(:,:,3))-double(muestra_positiva(i,3));
d=d.^2; d=sum(d,3);
distancia(:,:,i)=d;
end
distancia_clase_1=min(distancia,[],3); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%negativas figure(2) imshow(x+uint8(im_u*255)) title('muestras negativas') coord=floor(ginput(k));
for i=1:k muestra_negativa((l-1)*k+i,:)=squeeze(x(coord(i,2),coord(i,1),:)); end
distancia=zeros(n,m,l*k);
for i=1:l*k d(:,:,1)=double(x(:,:,1))-double(muestra_negativa(i,1));
d(:,:,2)=double(x(:,:,2))-double(muestra_negativa(i,2)); d(:,:,3)=double(x(:,:,3))-double(muestra_negativa(i,3));
d=d.^2; d=sum(d,3);
distancia(:,:,i)=d;
end
distancia_clase_0=min(distancia,[],3);
r=distancia_clase_1<=distancia_clase_0; r=r.*mask;
u=exp(-abs(distancia_clase_1-distancia_clase_0)/10); % figure(3) % imshow(u) % figure(4)
im_u(:,:,1)=u;
im_u(:,:,2)=u;
im_u(:,:,3)=u;
%
% imshow(uint8(double(x).*im_u))
%
% figure(5)
% imshow(x+uint8(im_u*255))
accuracy(l)=sum(sum(r==gt))/(n*m); sensitivity(l)=sum(sum(double(gt).*r))/sum(sum(gt)); specificity(l)=sum(sum(double(1-gt).*(1-r)))/sum(sum(1-gt));
end %%% ciclos
figure plot(accuracy) hold plot(sensitivity,'r') plot(specificity,'g')
function r=segmentar_knn_two_class(x,gt,mask,k)
mask=mask>0; gt=gt>0;
[n m]=size(gt);
imshow(x) title('muestras positivas') coord=floor(ginput(k));
for i=1:k muestra(i,:)=squeeze(x(coord(i,2),coord(i,1),:)); end
distancia=zeros(n,m,k);
for i=1:k d(:,:,1)=double(x(:,:,1))-double(muestra(i,1));
d(:,:,2)=double(x(:,:,2))-double(muestra(i,2)); d(:,:,3)=double(x(:,:,3))-double(muestra(i,3));
d=d.^2; d=sum(d,3);
distancia(:,:,i)=d;
end
distancia_clase_1=min(distancia,[],3);
imshow(x) title('muestras negativas') coord=floor(ginput(k));
for i=1:k muestra(i,:)=squeeze(x(coord(i,2),coord(i,1),:)); end
distancia=zeros(n,m,k);
for i=1:k d(:,:,1)=double(x(:,:,1))-double(muestra(i,1));
d(:,:,2)=double(x(:,:,2))-double(muestra(i,2)); d(:,:,3)=double(x(:,:,3))-double(muestra(i,3));
d=d.^2; d=sum(d,3);
distancia(:,:,i)=d;
end
distancia_clase_0=min(distancia,[],3);
r=distancia_clase_1<=distancia_clase_0; r=r.*mask;
accuracy=sum(sum(r==gt))/(n*m) sensitivity=sum(sum(double(gt).*r))/sum(sum(gt)) specificity=sum(sum(double(1-gt).*(1-r)))/sum(sum(1-gt))
base de datos de retina base de datos
function xr=filtro_frec_gauss_pasabanda_2(x,distancia,radio) % radio 1 > radio 2 h=fspecial('gauss',size(x),radio); xform = [ 1 0 0
0 1 0 distancia distancia 1 ];
filtro=zeros(size(x)); tform_translate = maketform('affine',xform); h1=imtransform(h,tform_translate, 'XData',[1 size(h,2)],'Ydata',[1 size(h,1)]); filtro=filtro+h1;
xform(3,1)=-distancia; tform_translate = maketform('affine',xform); h1=imtransform(h,tform_translate, 'XData',[1 size(h,2)],'Ydata',[1 size(h,1)]); filtro=filtro+h1;
xform(3,2)=-distancia; tform_translate = maketform('affine',xform); h1=imtransform(h,tform_translate, 'XData',[1 size(h,2)],'Ydata',[1 size(h,1)]); filtro=filtro+h1;
xform(3,1)=distancia; tform_translate = maketform('affine',xform); h1=imtransform(h,tform_translate, 'XData',[1 size(h,2)],'Ydata',[1 size(h,1)]); filtro=filtro+h1;
filtro=filtro/max(max(filtro));
figure imshow(filtro) xt=fft2(x); xtc=fftshift(xt); xtcf=xtc.*filtro; figure imshow(log(abs(xtcf)),gray(10)) title('transformada filtrada') xtcfd=ifftshift(xtcf);
xr=ifft2(xtcfd);
xr=abs(xr); figure
imshow(xr/max(max(xr)))
function xr=filtro_frec_gauss(x,radio) filtro=zeros(size(x)); tamano=radio*9; radio_masc=int16(floor(tamano/2));
h=fspecial('gauss',tamano,radio); h=h/max(max(h)); [m n]=size(x); arribam=int16(m/2+radio_masc); abajom=int16(m/2-radio_masc); arriban=int16(n/2+radio_masc); abajon=int16(n/2-radio_masc); filtro(abajom:arribam,abajon:arriban)=h; figure imshow(filtro) xt=fft2(x); xtc=fftshift(xt); figure imshow(log(abs(xtc)),gray(10)) title('transformada centrada') xtcf=xtc.*filtro; figure imshow(log(abs(xtcf)),gray(10)) title('transformada filtrada') xtcfd=ifftshift(xtcf);
xr=ifft2(xtcfd);
xr=abs(xr); figure
imshow(xr)
function xr=filtro_frec_gauss_pasaalta(x,radio) filtro=zeros(size(x)); tamano=radio*9; radio_masc=int16(floor(tamano/2));
h=fspecial('gauss',tamano,radio); h=h/max(max(h));
[m n]=size(x); arribam=int16(m/2+radio_masc); abajom=int16(m/2-radio_masc); arriban=int16(n/2+radio_masc); abajon=int16(n/2-radio_masc); filtro(abajom:arribam,abajon:arriban)=h; filtro=1-filtro; figure imshow(filtro) xt=fft2(x); xtc=fftshift(xt); figure imshow(log(abs(xtc)),gray(10)) title('transformada centrada') xtcf=xtc.*filtro; figure imshow(log(abs(xtcf)),gray(10)) title('transformada filtrada') xtcfd=ifftshift(xtcf);
xr=ifft2(xtcfd);
xr=abs(xr); figure
imshow(xr)
transparencias para el curso de vision [4]
Master: Intro a MNI Intro a MRI
- analisis de imagenes medicas, VBM, VBM 2 sujetos de OASIS, VBM 40 sujetos de OASIS
algunos codigos matlab para vision por computador
- analisis de imagenes medicas, fMRI, fMRI 1 sijeto audiivo
% experimento de busqueda basado en corners
cd('coil-100') d=dir; i=floor(rand*7201); x=imread(d(i+2).name); figure imshow(x) x=rgb2gray(x); x=x.*uint8(x>45); cornersx=corner(x,'Harris'); for j=3:size(d,1);
if mod(j,100)==0 j end y=imread(d(j).name); y=rgb2gray(y); y=y.*uint8(y>45); cornersy=corner(y,'Harris'); distancias(j-2)=distancia_euclidea_regularizada(cornersx,cornersy);
end [d_ordenadas,indices]=sort(distancias); figure for j=1:10
y=imread(d(indices(j)+2).name); subplot(2,5,j) imshow(y)
end cd ..
function distancia=distancia_corners_chebychev_2(p1,p2)
for i=1:size(p1,1)
for j=1:size(p2,1) d(i,j)=norm(p1(i,:)-p2(j,:)); end
end
minimos_filas=min(d'); distancia_filas=max(minimos_filas); minimos_cols=min(d); distancia_cols=max(minimos_cols); distancia=max(distancia_filas, distancia_cols);
function distancia=distancia_corners_chebychev(p1,p2)
for i=1:size(p1,1)
for j=1:size(p2,1) d(i,j)=norm(p1(i,:)-p2(j,:)); end
end
minimos=min(d'); distancia=max(minimos);
function distancia=distancia_euclidea_regularizada(p1,p2)
for i=1:size(p1,1)
for j=1:size(p2,1) d(i,j)=norm(p1(i,:)-p2(j,:)); end
end
distancia=0; for i=1:size(p1,1)
[minimo indicemin]=min(d(i,:)); if minimo < inf d(:,indicemin)=inf; distancia=distancia+minimo; end
end
distancia=distancia + abs(size(p1,1)-size(p2,1))*1000;
function y=normaliza_orientacion_3(x)
mascarax=x>45; [r,c]=find(mascarax); [autovectores, pt]=princomp([r,c]); pt(:,1)=pt(:,1)+mean(r); pt(:,2)=pt(:,2)+mean(c); pt=floor(pt); y=zeros(size(x));
for i=1:size(r,1)
if pt(i,1)>0 & pt(i,1)<=size(x,1) & pt(i,2)>0 & pt(i,2)<=size(x,2) y(pt(i,1),pt(i,2))=x(r(i),c(i)); end
end
y=imerode(imdilate(y,ones(3)),ones(3));
function y=normaliza_orientacion_2(x)
mascarax=x>45; [r,c]=find(mascarax); [autovectores, pt]=princomp([r,c]); pt(:,1)=pt(:,1)+mean(r); pt(:,2)=pt(:,2)+mean(c); pt=floor(pt); y=zeros(size(x));
for i=1:size(r,1)
if pt(i,1)>0 & pt(i,1)<=size(x,1) & pt(i,2)>0 & pt(i,2)<=size(x,2) y(pt(i,1),pt(i,2))=x(r(i),c(i)); end
end
for i=1:size(y,1)
for j=1:size(y,2) if y(i,j)==0 iabajo=i-1; iarriba=i+1; jabajo=j-1; jarriba=j+1; if iabajo<1 iabajo=1; end if iarriba>size(y,1) iarriba=size(y,1); end if jabajo<1 jabajo=1; end if jarriba>size(y,2) jarriba=size(y,2); end vecinos=y(iabajo:iarriba,jabajo:jarriba); h=imhist(vecinos,gray(256)); [maximo ind_maximo]=max(h); y(i,j)=ind_maximo-1; end end
end
function y=normaliza_orientacion(x)
mascarax=x>45; [r,c]=find(mascarax); [autovectores, pt]=princomp([r,c]); pt(:,1)=pt(:,1)+mean(r); pt(:,2)=pt(:,2)+mean(c); pt=floor(pt); y=zeros(size(x));
for i=1:size(r,1)
if pt(i,1)>0 & pt(i,1)<=size(x,1) & pt(i,2)>0 & pt(i,2)<=size(x,2) y(pt(i,1),pt(i,2))=x(r(i),c(i)); end
end
function dist=distancia_bordes_2(o1,o2) % objetos que son imagenes binarias de contornos
[nfilas ncols]=size(o1); dist=0; for i=1:nfilas
indices1=find(o1(i,:)); indices2=find(o2(i,:)); n1=size(indices1,2); n2=size(indices2,2); if n1>0 & n2 >0 if n1<n2 for j=1:n1 dist=dist+abs(indices1(j)-indices2(j)); end dist=dist+ncols*(n2-n1); else for j=1:n2 dist=dist+abs(indices1(j)-indices2(j)); end dist=dist+ncols*(n1-n2); end else dist=dist+ncols*abs(n2-n1); end
end
%%% parece hace cosas raras.... mejor no tocar
function dist=distancia_bordes(o1,o2) % objetos que son imagenes binarias de contornos
[nfilas ncols]=size(o1); dist=0; for i=1:nfilas
ultimo_borde_o2=0; for j=1:ncols if o1(j) if ultimo_borde_o2<ncols k=ultimo_borde_o2; while not(o2(k)) & k<=ncols k=k+1; end if k==ncols dist=dist+ncols; else dist=dist+abs(j-k); end ultimo_borde_o2=k; else % los bordes sin correspondencia de o1 se penalizan dist=dist+ncols; end end end % los bordes sin correspondencia de o2 se penalizan if ultimo_borde_o2<ncols if sum(o2(i,ultimo_borde_o2+1:ncols))>0 dist=dist + sum(o2(i,ultimo_borde_o2+1:ncols))*ncols; end end
end
cd('coil-100') d=dir; i=floor(rand*7201); x=imread(d(i+2).name); x=rgb2gray(x); x=x.*uint8(x>45); ox=edge(x,'log',0,2); for j=3:size(d,1);
if mod(j,100)==0 j end y=imread(d(j).name); y=rgb2gray(y); y=y.*uint8(y>45); oy=edge(y,'log',0,2); dist(j-2)=distancia_bordes(ox,oy);
end [d_ordenadas,indices]=sort(dist); figure for j=1:10
y=imread(d(indices(j)+2).name); subplot(2,5,j) imshow(yind) colorbar
end cd ..
function vocabulario=crea_vocabulario_color_kmeans(ncluster)
% sobre un directorio de imagenes de color
% tita es el umbral de inclusion del color en el vocabulario
cd('coil-100')
d=dir;
vocabulario=[];
pilacolores=[];
ncolores=0;
for i=3:size(d,1)
if mod(i,100)==0 i end y=imread(d(i).name); [yind, mapay]=rgb2ind(y,16); for k=1:16 ncolores=ncolores+1; pilacolores(ncolores,:)=mapay(k,:); end
end
cd ..
[indices vocabulario]=kmeans(pilacolores,ncluster);
% experimento busqueda en bd de color
tita=0.1;
v=crea_vocabulario_color(tita);
bd=crea_bd_vocabulario(v);
i=floor(rand*7201);
for j=1:size(bd,1)
dist(j)=norm(bd(i,:)-bd(j,:));
end [d_ordenadas,indices]=sort(dist);
cd('coil-100') d=dir; figure for j=1:50
y=imread(d(indices(j)+2).name); subplot(10,5,j) imshow(y)
end cd ..
function bd=crea_bd_vocabulario(v) % v es el vocabulario... histograma de color general % cd('coil-100') d=dir; ncolores=size(v,1); bd=[]; for i=3:size(d,1)
if mod(i,100)==0 i end y=imread(d(i).name); yind=rgb2ind(y,v); h=imhist(yind,v); bd(i-2,:)=h;
end cd ..
function vocabulario=crea_vocabulario_color(tita) % sobre un directorio de imagenes de color % tita es el umbral de inclusion del color en el vocabulario cd('coil-100') d=dir; vocabulario=[]; ncolores=0; for i=3:size(d,1)
if mod(i,100)==0 i end y=imread(d(i).name); [yind, mapay]=rgb2ind(y,16); for j=1:16 incluircolor=1; for k=1:ncolores if norm(mapay(j,:)-vocabulario(k,:))<tita incluircolor=0; end end if incluircolor ncolores=ncolores+1; vocabulario(ncolores,:)=mapay(j,:); end end
end cd ..
% experimento basico de busqueda con emparejamiento greedy de mpas de color cd('coil-100') d=dir; i=floor(rand*7201); x=imread(d(i+2).name); [xind, mapax]=rgb2ind(x,16); for j=3:size(d,1);
if mod(j,100)==0 j end y=imread(d(j).name); [yind, mapay]=rgb2ind(y,16); dist(j-2)=distancia_colorbar_greedy(mapax,mapay);
end [d_ordenadas,indices]=sort(dist); figure for j=1:10
y=imread(d(indices(j)+2).name); subplot(2,5,j) imshow(y)
end cd ..
% funcion de emparejamiento codicioso de mapas de colores
function dmap=distancia_colorbar_greedy(m1,m2)
ncolores=size(m1,1); libres=ones(ncolores,1); dmap=0; for i=1:ncolores
%tenemos i-1 colores asignados dist=ones(ncolores,1)*inf; for j=1:ncolores if libres(j) dist(j)=norm(m1(i,:)-m2(j,:)); end end [dmin jmin]=min(dist); libres(jmin)=0; dmap=dmap+dmin;
end
% experimento basico de busqueda en la bd REMOVIENDO el color mas cercano a negro cd('coil-100') d=dir; i=floor(rand*7201); x=imread(d(i+2).name); [xind, mapa]=rgb2ind(x,16); for i=1:16
grises(i)=norm(mapa(i,:));
end [minimo,negro]=min(grises); for j=3:size(d,1);
if mod(j,100)==0 j end y=imread(d(j).name); yind=rgb2ind(y,mapa); yr=uint8(ind2rgb(yind,mapa)); dist(j-2)=sum(sum(sum(abs(y(yind~=negro)-yr(yind~=negro)))));
end [d_ordenadas,indices]=sort(dist); figure for j=1:10
y=imread(d(indices(j)+2).name); yind=rgb2ind(y,mapa); subplot(2,5,j) imshow(yind,mapa) colorbar
end figure for j=1:10
y=imread(d(indices(j)+2).name); subplot(2,5,j) imshow(y)
end cd ..
% experimento basico de busqueda en la bd cd('coil-100') d=dir; i=floor(rand*7201); x=imread(d(i+2).name); [xind, mapa]=rgb2ind(x,16); for j=3:size(d,1);
if mod(j,100)==0 j end y=imread(d(j).name); yind=rgb2ind(y,mapa); yr=uint8(ind2rgb(yind,mapa)); dist(j-2)=sum(sum(sum(abs(y-yr))));
end [d_ordenadas,indices]=sort(dist); figure for j=1:10
y=imread(d(indices(j)+2).name); yind=rgb2ind(y,mapa); subplot(2,5,j) imshow(yind,mapa) colorbar
end cd ..
function disparidades=calculo_disparidad_correlacion(izq,dcha)
bizq=izq<70; bdcha=dcha<70; figure(1) proy=sum(bizq'); indices=find(proy>0); arriba=indices(1); indices=find(proy(arriba+1:size(izq,1))==0); abajo=indices(1)+arriba; subplot(2,1,1) imshow(izq(arriba:abajo,:)) izq=izq(arriba-2:abajo,:); bizq=bizq(arriba-2:abajo,:);
proy=sum(bdcha');
indices=find(proy>0);
arriba=indices(1);
indices=find(proy(arriba+1:size(dcha,1))==0);
abajo=indices(1)+arriba;
subplot(2,1,2)
imshow(dcha(arriba:abajo,:))
dcha=dcha(arriba-2:abajo,:);
bdcha=bdcha(arriba-2:abajo,:);
comp_izq=bwlabel(bizq); s_izq=regionprops(comp_izq,'all'); comp_dcha=bwlabel(bdcha); s_dcha=regionprops(comp_dcha,'all');
nobjetos=0; for c=1:size(s_izq,1);
if s_izq(c).Area>1000 nobjetos=nobjetos+1; correlacion=[]; x=floor(s_izq(c).BoundingBox) abajo=x(2)+x(4); if x(2)+x(4)> size(dcha,1) abajo=size(dcha,1); end c_izq=izq(x(2):abajo,x(1):x(1)+x(3)); for i=1:x(1)-1 size(dcha) c_dcha=dcha(x(2):abajo,x(1)-i:x(1)-i+x(3)); correlacion(i)=sum(sum(abs(c_izq-c_dcha))); end figure plot(correlacion) [minimo imin]=min(correlacion); disparidades(nobjetos)=imin; figure subplot(1,2,1) imshow(c_izq) c_dcha=dcha(x(2):abajo,x(1)-imin:x(1)-imin+x(3)); subplot(1,2,2) imshow(c_dcha) end
end
function disparidad=calculo_disparidad_proyecciones(izq,dcha,umbral)
%asumo que los objetos son oscuros y el fondo blanco izq=izq<umbral; dcha=dcha<umbral; proyeccion_izq=sum(izq); proyeccion_dcha=sum(dcha);
figure(1) plot(proyeccion_izq) figure(2) plot(proyeccion_dcha)
%primer componente
for i_1=1:1000
if proyeccion_izq(i_1)>0 break end
end for i_2=i_1:1000
if proyeccion_izq(i_2)==0 break end
end for j_1=1:1000
if proyeccion_dcha(j_1)>0 break end
end for j_2=j_1:1000
if proyeccion_dcha(j_2)==0 break end
end
% calcular el centro de las proyecciones de los componentes c_izq=sum((1:i_2).*proyeccion_izq(1:i_2)/sum(proyeccion_izq(1:i_2))); c_dcha=sum((1:j_2).*proyeccion_dcha(1:j_2)/sum(proyeccion_dcha(1:j_2)));
disparidad(1)= c_izq-c_dcha;
%anulo primer componente
proyeccion_izq(1:i_2)=0; proyeccion_dcha(1:j_2)=0;
% proceso segundo componente....
figure(3) plot(proyeccion_izq) figure(4) plot(proyeccion_dcha)
%segundo componente
for i_1=1:1000
if proyeccion_izq(i_1)>0 break end
end for i_2=i_1:1000
if proyeccion_izq(i_2)==0 break end
end for j_1=1:1000
if proyeccion_dcha(j_1)>0 break end
end for j_2=j_1:1000
if proyeccion_dcha(j_2)==0 break end
end
% calcular el centro de las proyecciones de los componentes c_izq=sum((1:i_2).*proyeccion_izq(1:i_2)/sum(proyeccion_izq(1:i_2))); c_dcha=sum((1:j_2).*proyeccion_dcha(1:j_2)/sum(proyeccion_dcha(1:j_2)));
disparidad(2)= c_izq-c_dcha;
function disparidad=calculo_disparidad_estereo_naive(izq,dcha)
%imagenes en niveles de grises % umbral_izq=metodo_otsu(izq); % umbral_dcha=metodo_otsu(dcha);
umbral_izq=60; umbral_dcha=60;
izq=izq>umbral_izq; dcha=dcha>umbral_dcha; izq=1-izq; dcha=1-dcha; figure(1) imshow(izq) title('izquierda') figure(2) imshow(dcha) title('derecha') [comp_izq, num_comp_izq]=bwlabel(izq); [comp_dcha, num_comp_dcha]=bwlabel(dcha); for i_izq=1:num_comp_izq
if sum(sum(comp_izq==i_izq))>500 break end
end for i_dcha=1:num_comp_dcha
if sum(sum(comp_dcha==i_dcha))>500 break end
end figure(3) imshow(comp_izq==i_izq) title('objeto izquierda') figure(4) imshow(comp_dcha==i_dcha) title('objeto derecha') c_izq=calcula_centroide(comp_izq==i_izq); c_dcha=calcula_centroide(comp_dcha==i_dcha); disparidad=c_izq(2)-c_dcha(2);
function centroide=calcula_centroide(x) % x imagen binaria [n m]=size(x); p_filas=sum(x')/sum(sum(x));
p_cols=sum(x)/sum(sum(x));
centro_filas=sum((1:n).*p_filas); centro_cols=sum((1:m).*p_cols);
centroide=[centro_filas,centro_cols];
function umbral=metodo_otsu(x) h=imhist(x,256); size(h) for T=2:255
v1=var(h(1:T).*(1:T)'); v2=var(h(T+1:256).*(T+1:256)'); P1=sum(h(1:T)); P2=sum(h(T+1:256)); vintra(T)=P1*v1+P2*v2;
end plot(vintra) vintra(1)=inf; [minvarintra umbral]=min(vintra);
%descomposicion en planos de bits x es la imagen original
x=double(cara); plano_8=floor(x/2^7);
x=rem(x,2^7);
plano_7=floor(x/2^6);
x=rem(x,2^6);
plano_6=floor(x/2^5);
x=rem(x,2^5);
plano_5=floor(x/2^4);
x=rem(x,2^4); plano_4=floor(x/2^3);
x=rem(x,2^3); plano_3=floor(x/2^2);
x=rem(x,2^2); plano_2=floor(x/2^1);
x=rem(x,2^1); plano_1=x;
figure(1)
subplot(2,4,1)
imshow(plano_8)
subplot(2,4,2)
imshow(plano_7)
subplot(2,4,3)
imshow(plano_6)
subplot(2,4,4)
imshow(plano_5)
subplot(2,4,5)
imshow(plano_4)
subplot(2,4,6)
imshow(plano_3)
subplot(2,4,7)
imshow(plano_2)
subplot(2,4,8)
imshow(plano_1)
% reconstruccion a partir de los planos de bits
reconstruccion=zeros(size(cara));
reconstruccion=plano_1; reconstruccion=reconstruccion + plano_2*2^1; reconstruccion=reconstruccion + plano_3*2^2; reconstruccion=reconstruccion + plano_4*2^3; reconstruccion=reconstruccion + plano_5*2^4; reconstruccion=reconstruccion + plano_6*2^5; reconstruccion=reconstruccion + plano_7*2^6; reconstruccion=reconstruccion + plano_8*2^7; figure (2) imshow(reconstruccion, gray(256))
% reconstruccion con un watermark sencillo en el primer plano de bits
reconstruccion=zeros(size(cara));
reconstruccion(20:80,20:80)=fspecial('disk',30)>0;
reconstruccion=reconstruccion + plano_2*2^1; reconstruccion=reconstruccion + plano_3*2^2; reconstruccion=reconstruccion + plano_4*2^3; reconstruccion=reconstruccion + plano_5*2^4; reconstruccion=reconstruccion + plano_6*2^5; reconstruccion=reconstruccion + plano_7*2^6; reconstruccion=reconstruccion + plano_8*2^7; figure (3) imshow(reconstruccion, gray(256))
function modelo=construir_modelo(nimagen) cd orlfaces d=dir; modelo=zeros(112,92,size(d,1)-2); for i=3:size(d,1);
cd (d(i).name) ds=dir; modelo(:,:,i-2)=imread(ds(nimagen+2).name); cd ..
end cd ..
function modelo=construir_modelo_LOO cd orlfaces d=dir; modelo=zeros(112,92,size(d,1)-2,10); for i=3:size(d,1);
cd (d(i).name) ds=dir; for j=3:size(ds,1) modelo(:,:,i-2,j-2)=imread(ds(j).name); end cd ..
end cd ..
function [error_acumulado, matriz_confusion]=calcular_error_test(modelo,nimagen)
cd orlfaces d=dir; nclases=size(d,1)-2; distancia=zeros(nclases,1); matriz_confusion=zeros(nclases); error_acumulado=0; for i=3:size(d,1);
cd(d(i).name) ds=dir; for j=3:size(ds,1) if j ~= nimagen + 2 y=double(imread(ds(j).name)); for k=1:size(d,1)-2 distancia(k)=sum(sum(abs(modelo(:,:,k)-y))); end
%
[dmin, clase]=min(distancia); matriz_confusion(i-2,clase)=matriz_confusion(i-2,clase)+1; error= (i-2) ~=clase; error_acumulado= error_acumulado + error; end end cd ..
end
cd ..
function [aciertos, error_acum]=calculo_error_LOO(m) m=double(m); [filas,cols,nsujetos,nimagenes]=size(m) error_acum=0; aciertos=0; for i=1:40
i for j=1:10 test=squeeze(m(:,:,i,j)); distancias=zeros(nsujetos,nimagenes); for k=1:nsujetos for l=1:nimagenes distancias(k,l)=norm(test-m(:,:,k,l)); end end distancias(distancias==0)=inf; [mincols rowinds]=min(distancias); [minglobal colind]=min(mincols); clase=rowinds(colind); if clase==i aciertos=aciertos+1; else error_acum=error_acum+1; end end
end