2012-04-15 13 views
5

enter image description hereMatlab - cuenca para extraer líneas - la información perdida

tengo una imagen de las venas de la siguiente manera. Yo uso un algoritmo de cuencas hidrográficas para extraer el esqueleto de la veta.

Mi código: (K es la imagen original).

level = graythresh(K); 
BW = im2bw(K,level); 
D = bwdist(~BW); 
DL = watershed(D); 
bgm = DL == 0; 
imshow(bgm); 

El resultado es:

enter image description here

Como se puede ver gran cantidad de información se pierde. ¿Alguien puede ayudarme? Gracias.

Respuesta

8

Parece que la iluminación es algo desigual. Esto se puede corregir usando ciertas operaciones morfológicas. La idea básica es calcular una imagen que represente solo la iluminación desigual y restarla, o dividirla (lo que también mejora el contraste). Debido a que queremos encontrar solo la iluminación, es importante usar un elemento estructurador lo suficientemente grande, de modo que la operación examine más propiedades globales en lugar de las locales.

%# Load image and convert to [0,1]. 
A = im2double(imread('http://i.stack.imgur.com/TQp1i.png')); 
%# Any large (relative to objects) structuring element will do. 
%# Try sizes up to about half of the image size. 
se = strel('square',32); 
%# Removes uneven lighting and enhances contrast. 
B = imdivide(A,imclose(A,se)); 
%# Otsu's method works well now. 
C = B > graythresh(B); 
D = bwdist(~C); 
DL = watershed(D); 
imshow(DL==0); 

Éstos son C (izquierda), más DL==0 (centro) y su superposición en la imagen original:

Divided by closingOtsu's methodSegmentation overlay

+0

funciona bien. Las fotos serían agradables, sin embargo. – Jonas

+0

Buen consejo ... (ver edición). –

+0

Muchas gracias por su ayuda. Solo una pregunta rápida. Si deseo aplicar "imopen" seguido de "imclose" debería editar esta parte se = strel ('square', 32); im_open = imopen (A, se); B = imdivide (A, imclose (im_open, se)); Im el papel que estoy leyendo en este momento, dijeron que el uso de esta manera podría ayudar mucho en la reducción de las ramas falsas. Sin embargo, cuando lo hice de esta manera, parece que hay más ramas falsas, lol. ¿Tienes alguna sugerencia? Gracias – W00f

1

Sí, necesitará reducir su umbral probablemente (menos que lo que el método de Otsu le está dando). Y si el mapa de borde es ruidoso cuando baja el umbral, debe aplicar un filtro suavizado gaussiano en 2 D antes de bajar el umbral. Esto moverá los bordes ligeramente pero también eliminará el ruido, por lo que es una compensación.

El 2-D de Gauss se puede aplicar haciendo algo como

w=gausswin(N,Alpha) % you'll have to play with N and alpha 
K = imfilter(K,w,'same','symmetric'); % something like these options 

Antes de aplicar el resto de su algoritmo.

1

Usted está perdiendo información porque cuando se aplica im2bw, que está convirtiendo básicamente su imagen uint8, donde el brillo de los píxeles toma un valor intmin('uint8')==0-intmax('uint8')==255, en una imagen binaria (donde sólo se utilizan los valores logical). Esto es lo que implica una pérdida de información que usted observó. Si visualiza la imagen BW verá que todos los elementos de K que tenían un valor mayor que el umbral level se convierten en unos, mientras que los que están por debajo del umbral se convierten en ceros.

Cuestiones relacionadas