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:
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.
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.
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.
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
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
0