Matlab - Pixel rectangular en una imagen en escala de grises

 
Vista:

Pixel rectangular en una imagen en escala de grises

Publicado por Francisco Jesús (3 intervenciones) el 16/01/2017 20:29:23
¡Hola a todos!

Estoy trabajando en mi proyecto final de grado, que trata de realizar varios ensayos de flexión en 2D de un fémur, y tengo una duda que no soy capaz de verle la solución. El estudio se realiza en 2D, como si el hueso fuera una chapa porque si lo hiciera en 3D se complicaría mucho.
Tengo unos archivos DICOM de un TAC, que son de un fémur.
Los cuales leo con el siguiente scrip:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
clear all
clc
 
dicom_directory=uigetdir();
d=dir(dicom_directory);
 
 
indice=1;
orden=[];
%h=waitbar(1/length(d),'Ordenando imágenes...');
h = waitbar(0,'Por favor espere...','Name','Cargando serie DICOM...',...
             'CreateCancelBtn',...
             'setappdata(gcbf,''canceling'',1)');
 setappdata(h,'canceling',0)
 
 
for i=1:length(d)
    h=waitbar(i/length(d),h,'Ordenando imágenes...');
    % Check for Cancel button press
     if getappdata(h,'canceling')
         disp('La carga de imagenes no se ha completado');
         break
     end
    if (~d(i).isdir)
        try
            info=dicominfo([dicom_directory filesep d(i).name]);
            matriz_desorden(:,:,indice)=dicomread(info);
            orden=[orden info.SliceLocation];
            indice=indice+1;
 
        catch
            %modificar para que aparezca en una pantalla como warning
            %mencionando el nombre del fichero desconocido
            %siempre sera el VERSION
            disp('Fichero con formato desconocido, ignorando...');
        end
   end
end
 
delete(h);
 
[vals, indices]=sort(orden);
volumen=matriz_desorden(:,:,indices);

La matriz volumen son secciones transversales del fémur, por ello la re-coloco en otra matriz cambiando los ejes. Ya que lo que quiero obtener es la sección transversal del fémur en su "mitad" (plano más simétrico), que doy por válido que será en la sección 270.

1
2
3
4
5
6
7
8
9
matriz2=zeros(906,512,512);
for i=1:1:512
   for j=1:1:512
    for k=1:1:905
  matriz2(k,j,i)=volumen(i,j,k);
    end
   end
end
Y=matriz2(:,:,270);

Posteriormente creo una máscara, diciendo que todos los valores de grises que estén por debajo de 400 será aire, y le asignaré un 1, y a la parte del hueso le asignaré un 0. Para finalmente crear un contorno de la imagen con la función Canny.

1
2
3
4
5
6
7
8
9
10
11
mask=zeros(906,512);
for i=1:906
    for j=1:512
        if  Y(i,j)<400
            mask(i,j)=1;
        else
            mask(i,j)=0;
        end
    end
end
DBCanny=edge(mask,'canny');

Ahora lo que tengo es una matríz con unos (1) que recorre el borde de la imagen y me dibuja la silueta del fémur.
Ahora bien, necesito las coordenadas de esta silueta, pero sabiendo a priori que la resolución del escaner que ha realizado el TAC son unos píxeles de 0.2 mm de ancho y 0.6 mm de alto.
Con lo cual, mi instinto me dice que lo haga multiplicando por 0.2 las 'x' (restando 0.1 que será el valor en x del primer pixel) y por 0.6 las 'y' (restando 0.3 que será el valor en y del primer pixel). Pero luego al utilizar estas coordenadas en otro programa de elementos finitos (Abaqus CAE) el hueso me sale alargado en el eje y. Y es, como puede comprobarse, que un eje no crece igual que el otro. Entonces no sé como hacer para crear unos píxeles que sean rectangulares con los valores anteriormente mencionados, para que a la hora de hallar los valores del contorno obtenga los correctos.
1
2
3
4
5
6
7
8
9
10
11
Coord_finales=zeros(2596,2);
l=1;
for i=1:906
    for j=1:512
        if  DBCanny(i,j)==1
            Coord_finales(l,1)=(i*0.2-0.1);;
            Coord_finales(l,2)=(j*0.6-0.3);
            l=l+1;
        end
    end
end


Y no me sirve los que me da en un primer caso la matriz DBCanny, porque entonces es como asumir que los pixeles son cuadrados de 1mm por 1mm, y posteriormente tengo que realizar otras operaciones, como la discretización del hueso e ir sacando el valor medio de los grises que hay en cada elemento para finalmente asignarles una densidad diferente. Ya que un hueso es un material compuesto y no tiene la misma densidad en todas sus zonas.

Espero haberme explicado bien, si tienen alguna duda sobre el mi problema estaré encantado de resolverla con la mayor brevedad.
Sería un gran apoyo si me pudierais ayudar con esto, ya que llevo varios días atascado y no avanzo nada.
Muchísimas gracias de antemano.
Un saludo.

Francisco Jesús
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder