2012-04-15 19 views
5

enter image description hereMatlab - Đầu nguồn để trích xuất các dòng - mất thông tin

Tôi có hình ảnh tĩnh như sau. Tôi sử dụng thuật toán lưu vực để trích xuất bộ xương của tĩnh mạch.

Mã của tôi: (K là hình ảnh gốc).

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

Kết quả là:

enter image description here

Như bạn có thể thấy rất nhiều thông tin bị mất. Ai có thể giúp tôi không? Cảm ơn.

Trả lời

8

Dường như ánh sáng có phần không đồng đều. Điều này có thể được sửa chữa bằng cách sử dụng một số hoạt động hình thái nhất định. Ý tưởng cơ bản là tính toán một hình ảnh đại diện cho ánh sáng không đồng đều và trừ nó, hoặc chia cho nó (cũng làm tăng độ tương phản). Bởi vì chúng tôi muốn chỉ tìm thấy ánh sáng, điều quan trọng là sử dụng một yếu tố cấu trúc đủ lớn để hoạt động kiểm tra các thuộc tính toàn cầu hơn là các thuộc tính cục bộ.

%# 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); 

Dưới đây là C (trái), cộng với DL==0 (giữa) và lớp phủ của nó đối với hình ảnh ban đầu:

Divided by closingOtsu's methodSegmentation overlay

+0

trình tốt. Hình ảnh sẽ được tốt đẹp, mặc dù. – Jonas

+0

Lời khuyên tốt ... (xem phần chỉnh sửa). –

+0

Cảm ơn bạn rất nhiều vì sự giúp đỡ của bạn. Chỉ một câu hỏi nhanh thôi. Nếu tôi muốn áp dụng imopen theo sau bởi imclose tôi chỉ nên chỉnh sửa phần này se = strel ('square', 32); im_open = imopen (A, se); B = imdivide (A, imclose (im_open, se)); Im giấy mà tôi đang đọc ngay bây giờ, họ nói bằng cách này có thể giúp ích nhiều trong việc giảm chi nhánh giả. Tuy nhiên, khi tôi làm theo cách này thì dường như có nhiều chi nhánh giả hơn. Bạn có gợi ý nào không? Cảm ơn – W00f

1

Có, bạn sẽ cần hạ thấp ngưỡng của mình (thấp hơn so với phương thức mà Otsu đang cung cấp cho bạn). Và nếu bản đồ cạnh ồn ào khi bạn hạ thấp ngưỡng, bạn nên áp dụng bộ lọc làm mịn Gauss 2-D trước khi bạn hạ thấp ngưỡng. Điều này sẽ di chuyển các cạnh hơi nhưng sẽ làm sạch tiếng ồn quá, vì vậy nó là một sự cân bằng.

2-D Gaussian có thể áp dụng làm một cái gì đó giống như

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

Trước khi bạn áp dụng các phần còn lại của thuật toán của bạn.

1

Bạn đang mất thông tin vì khi bạn áp dụng im2bw, bạn về cơ bản chuyển đổi uint8 hình ảnh của bạn, nơi mà các điểm ảnh độ sáng có một giá trị intmin('uint8')==0-intmax('uint8')==255, thành một hình ảnh nhị phân (nơi chỉ logical giá trị được sử dụng). Đây là những gì đòi hỏi một sự mất mát của thông tin mà bạn quan sát thấy. Nếu bạn hiển thị hình ảnh BW, bạn sẽ thấy rằng tất cả các phần tử của K có giá trị lớn hơn ngưỡng level biến thành một trong những giá trị đó, trong khi các giá trị đó dưới ngưỡng chuyển thành số không.

Các vấn đề liên quan