2012-04-23 76 views
5

Nhiệm vụ chính là loại bỏ nền phức tạp của lá và trích xuất lá mục tiêu từ hình ảnh lá bị tắc trong MATLAB. Để loại bỏ nền tôi đã áp dụng K-nghĩa là phân cụm bản ngã. Bây giờ nhiệm vụ chính là phân đoạn lá từ một chiếc lá bị tắc bằng thuật toán phân đoạn lưu vực. Tôi không thể tìm thấy các phân đoạn hoàn hảo cho từng chiếc lá đơn lẻ. Làm ơn giúp tôi. Tôi đã tải lên các hình ảnh mẫu và mã phân đoạn lưu vực đầu nguồn.Thuật toán phân đoạn lưu vực để phân đoạn lá bị tắc trong matlab

ORIGINAL IMAGE enter image description here

Hình ảnh sau khi loại bỏ nền sử dụng thuật toán phân nhóm K-Phương tiện và nguồn phân khúc chồng lên ảnh gốc enter image description here

Tôi muốn chiếc lá giữa chính là một phân khúc duy nhất để tôi có thể giải nén nó.

tôi đã đưa ra mã nguồn Phân khúc dưới

function wateralgo(img) 

F=imread(img); 

F=im2double(F); 

%Converting RGB image to Intensity Image 
r=F(:,:,1); 
g=F(:,:,2); 
b=F(:,:,3); 
I=(r+g+b)/3; 
imshow(I); 

%Applying Gradient 
hy = fspecial('sobel'); 
hx = hy'; 
Iy = imfilter(double(I), hy, 'replicate'); 
Ix = imfilter(double(I), hx, 'replicate'); 
gradmag = sqrt(Ix.^2 + Iy.^2); 
figure, imshow(gradmag,[]), title('Gradient magnitude (gradmag)'); 

L = watershed(gradmag); 
Lrgb = label2rgb(L); 
figure, imshow(Lrgb), title('Watershed transform of gradient magnitude (Lrgb)'); 

se = strel('disk',20); 
Io = imopen(I, se); 
figure, imshow(Io), title('Opening (Io)'); 
Ie = imerode(I, se); 
Iobr = imreconstruct(Ie, I); 
figure, imshow(Iobr), title('Opening-by-reconstruction (Iobr)'); 

Ioc = imclose(Io, se); 
figure, imshow(Ioc), title('Opening-closing (Ioc)'); 

Iobrd = imdilate(Iobr, se); 
Iobrcbr = imreconstruct(imcomplement(Iobrd), imcomplement(Iobr)); 
Iobrcbr = imcomplement(Iobrcbr); 
figure, imshow(Iobrcbr), title('Opening-closing by reconstruction (Iobrcbr)'); 

fgm = imregionalmin(Iobrcbr); 
figure, imshow(fgm), title('Regional maxima of opening-closing by reconstruction (fgm)'); 

I2 = I; 
I2(fgm) = 255; 
figure, imshow(I2), title('Regional maxima superimposed on original image (I2)'); 

se2 = strel(ones(7,7)); 
fgm2 = imclose(fgm, se2); 
fgm3 = imerode(fgm2, se2); 
fgm4 = bwareaopen(fgm3, 20); 
I3 = I; 
I3(fgm4) = 255; 
figure, imshow(I3), title('Modified regional maxima superimposed on original image (fgm4)'); 

bw = im2bw(Iobrcbr, graythresh(Iobrcbr)); 
figure, imshow(bw), title('Thresholded opening-closing by reconstruction (bw)'); 

D = bwdist(bw); 
DL = watershed(D); 
bgm = DL == 0; 
figure, imshow(bgm), title('Watershed ridge lines (bgm)'); 

gradmag2 = imimposemin(gradmag, bgm | fgm4); 
L = watershed(gradmag2); 
I4 = I; 
I4(imdilate(L == 0, ones(3, 3)) | bgm | fgm4) = 255; 
figure, imshow(I4), title('Markers and object boundaries superimposed on original image (I4)'); 

Lrgb = label2rgb(L, 'jet', 'w', 'shuffle'); 
figure, imshow(Lrgb), title('Colored watershed label matrix (Lrgb)'); 

figure, imshow(I), hold on 
himage = imshow(Lrgb); 
set(himage, 'AlphaData', 0.3); 
title('Lrgb superimposed transparently on original image'); 
end 
+0

@Phonon Xin lỗi mã đã bị thụt lề kém nhưng hãy giúp tôi giải pháp. –

+0

bạn đang cố trích xuất lá nào? – vini

+0

Trong phạm vi điều kiện môi trường nào, thuật toán phân đoạn lá của bạn thực hiện? Bạn có bất kỳ sự kiểm soát nào không? Liệu nó hoàn toàn phải sử dụng một thuật toán đầu nguồn? Tôi không chắc chắn thông tin về độ dốc có đủ mạnh để cung cấp cho bạn một giải pháp mạnh mẽ hay không. Bạn có thể muốn một thuật toán hoặc mô hình cho phép bạn triển khai các chuyên gia mạnh hơn. Hình dạng của lá khá rập khuôn, vì vậy có lẽ nhìn vào một mô hình biến dạng có thể là thích hợp. Nếu thời gian là ngắn, có lẽ một cách tiếp cận heuristic dựa trên phát triển khu vực có thể cung cấp cho bạn một số kết quả nhanh chóng? –

Trả lời

2

Tôi nghĩ bạn nên thử một thuật toán khai thác foreground chứ không phải là phân khúc chung. Một thuật toán như vậy là GrabCut. Một điều hữu ích khác là đạt được một số mức độ ánh sáng khác nhau trong đại diện hình ảnh của bạn trước khi cố gắng trích xuất đối tượng nền trước. Một cách để làm như vậy là làm việc trong Chong color space.

0

Nếu có bất kỳ tương tác nào từ người dùng, phân đoạn của bạn sẽ tốt hơn nhiều với GrabCut (như được đề cập bởi @Victor May) hoặc số interactive graph cut cơ bản hơn.

Nếu không, phân đoạn tự động sẽ rất khó để hoàn thiện cho nhiều hình ảnh. Có lẽ bạn có thể thử một số xử lý hậu kỳ trong đó các vùng lân cận được so sánh và hợp nhất dựa trên số liệu tương tự (hoặc dựa trên cường độ của độ dốc giữa hai đoạn?).