Detección de la nariz en una imagen mediante Matlab

En este programa se va a realizar la detección de la nariz en una imagen 3D formada por un conjunto de datos que nos permite simular la periferia de un cráneo en 3D.
Los datos los tenemos en una matriz de 3 dimensiones en los cuales, la primera y segunda dimensión son los ejes x e y que nos permiten definir el ancho y largo de la imagen y la tercera dimensión diferencia entre imágenes las cuales han sido tomadas desde abajo hacia arriba para cortes con diferentes alturas en el cráneo.

Proyecto realizado junto con la colaboración de Encarni Sánchez García.

Para poder ejecutar el programa, se hace uso del siguiente código:

load 'TAC_Nasal_2_0'
%para corte 2.0 corte axial
v = volume(1:2:end,1:2:end,1:1:end);
figure
p = patch(isosurface(v, 700));
isonormals(v, p)
set(p, 'FaceColor', 'red', 'EdgeColor', 'none');
daspect([1 1 size(v,3)/size(v,1)*1.5])
view(3)
camlight; lighting phong
v = double(volume);
dim=size(v);
%for i=1:dim(3)
corte_20 = squeeze(v(:,:,30));
 norm = double(max(max(max(volume)))); 
figure, imshow((corte_20)/norm)%lo normalizamos entre el máximo, si no lo hacemos la imagen se verá blanca 
corte_20 = (corte_20)/norm;

%realizamos el histograma
[xh,yh] = histograma(corte_20,norm);
[pks,locs]=findpeaks(yh,'SORTSTR','descend','minpeakdistance',100,'Npeaks',20);

hold on
plot(xh(locs(1:3)),yh(locs(1:3)),'k^','markerfacecolor',[1 0 0]);



m1 = round((locs(1)+locs(2))/2);
m2 = round((locs(2)+locs(3))/2);
 m3= round((locs(1)+locs(3))/2);  % 
m11=((locs(1)+locs(2))/2);
m22=((locs(2)+locs(3))/2);

stem(xh(m1),norm,'r^')

text(xh(m1),2000,['T = ' num2str(xh(m1))]);

title(['histograma con umbral T']);
hold off


%segmentación con el algoritmo fcm

clusterNum = 3;
[ Unow, center, now_obj_fcn ] = FCMforImage(corte_20, clusterNum );
figure, imshow(Unow(:,:,1))  %unow tiene 3 capas  es en escala grises  tienes varias tonalidades de un mismo color  unow es una imagen en 3 capas


 figure, imshow(Unow(:,:,1))

  imshow(corte_20,[]);
for i=1:clusterNum

   figure,imshow(Unow(:,:,i),[]);
end

figure, imshow(Unow)%tiene gradaciones del color




 I=Unow(:,:,3);
figure, imshow(I)
BW = im2bw(I, graythresh(I));  %CONVIERTE LA IMAGEN I A BINARIA 
CC = bwconncomp(BW); %conectividad
L = labelmatrix(CC); %MATRIZ ETIQUETADA

RGB = label2rgb(L); %imagn de color etiquetada  creo que igual que bwlabel
RGB2 = label2rgb(L, 'spring', 'c', 'shuffle'); %(L) convierte una matriz de etiqueta, L, como los devueltos por labelmatrix, bwlabel, bwlabeln o cuenca, en una imagen de color RGB con el fin de visualizar las regiones marcadas. La función label2rgb determina el color para asignar a cada objeto basado en el número de objetos en la matriz de etiqueta y gama de colores en el mapa de colores. La función label2rgb recoge colores de toda la gama.
RGB2 = label2rgb(L, 'spring', 'c', 'shuffle'); %rgb2 se puede hacer extración si se elimina el fondo
figure, imshow(RGB)
figure, imshow(RGB2)
 imshow(RGB(:,:,1))
  %%ETIQUETADO
%%
close all
 ImageR=bwlabel(BW, 4); %imagen binaria  LE PASO LA IMAGEN BINARIA 

RGB = label2rgb(ImageR);
figure, imshow(RGB);
im_gray=rgb2gray(RGB);
im_edge=edge(im_gray);
im_edgeR=edge(RGB(:,:,1));
im_edgeG=edge(RGB(:,:,2));
im_edgeB=edge(RGB(:,:,3));
im_nueva=0.4*RGB(:,:,1)+0.4*RGB(:,:,3)-0.4*RGB(:,:,2);
im_edgeN=edge(im_nueva);
figure, imshow(im_edge);
figure, imshow(im_edgeR);
figure, imshow(im_edgeG);
figure, imshow(im_edgeB);
figure, imshow(im_nueva);
figure, imshow(im_edgeN);
im__2 = im2bw(im_nueva,0.1);
figure, imshow(im__2);
% obtencion del cuadrado con el que voy a recortar la imagen RGB:
parte_alta=length(im__2(:,1));
parte_baja=1;
parte_izquierda=length(im__2(1,:));
parte_derecha=1;
for j=1:length(im__2(1,:))
    for i=1:length(im__2(:,1))
        if im__2(i,j)==0
            if i
                parte_alta=i;
            end
            if i>parte_baja
                parte_baja=i;
            end
            if j
                parte_izquierda=j;
            end
            if j>parte_derecha
                parte_derecha=j;
            end
        end
    end
end
%una vez tengo el cuadrado paso a recortar la imagen RGB:
im_RGB_nariz=imcrop(RGB,[parte_baja parte_alta parte_derecha parte_izquierda]);
figure, imshow(im_RGB_nariz);

Además de las funciones que se utilizan que se adjuntan en el zip que podéis descargar aquí:


Resultados:
A continuación se representa la obtención de la nariz  a partir de la siguiente imagen inicial.
En esta primera imagen, se observa la periferia de un craneo, visto desde arriba. Los datos de entrada a nuestro programa son los datos del craneo en 3D, del cual obtenemos la representación de la parte que hace referencia a la nariz en 3D aunque mostramos solamente la imagen de la nariz vista desde abajo:

Vista de la detección de la nariz desde abajo en color:


Vista de la detección de la nariz desde abajo en blanco y negro:
Entrada principal

No hay comentarios:

Publicar un comentario