7

Tôi có một câu hỏi liên quan đến kịch bản sau đây. Khi tôi xử lý hình ảnh, tôi đã đạt được một đường viền, thật không may là hai lần được kết nối như bạn có thể thấy ở dòng dưới cùng. Để làm cho nó rõ ràng những gì tôi muốn chỉ là dòng outter. Do đó tôi đã phóng to và đánh dấu dòng, tôi muốn có hình ảnh lớn.Cách ly hình thái của hai ranh giới được kết nối

Những gì tôi muốn từ lựa chọn này chỉ là một phần outter, mà tôi đã đánh dấu là màu xanh lá cây trong hình tiếp theo. Xin lỗi vì kỹ năng vẽ xấu của tôi. ;)

Tôi đang sử dụng MatLab với IPT. Vì vậy, tôi cũng đã cố gắng để làm ra với bwmorph và các tùy chọn hbreak, nhưng nó đã ném một lỗi.

Làm cách nào để giải quyết vấn đề đó? Nếu bạn thành công, bạn có thể cho tôi biết thêm một chút về nó không? Cảm ơn bạn trước!

Trân trọng

Trả lời

1

Tôi cũng muốn sử dụng bwmorph

%# find the branch point 
branchImg = bwmorph(img,'branchpoints'); 

%# grow the pixel to 3x3 
branchImg = imdilate(branchImg,ones(3)); 

%# hide the branch point 
noBranchImg = img & ~branchImg; 

%# label the three lines 
lblImg = bwlabel(noBranchImg); 

%# in the original image, mask label #3 
%# note that it may not always be #3 that you want to mask 
finalImg = img; 
finalImg(lblImg==3) = 0; 

%# show the result 
imshow(finalImg) 
+0

bạn đã đề cập rằng nó không phải lúc nào cũng là 3 ... lý do đằng sau điều này là gì? cho sự hiểu biết của tôi, nó luôn luôn là một đường kẻ rộng 1px/đường viền, phù hợp với mô hình đó (của 3) ..? – mchlfchr

+0

@mchlfchr: trong bước 'bwlabel', ba dòng bị ngắt kết nối được gán các nhãn 1,2 và 3 tương ứng. Nó có thể không phải lúc nào cũng là phần có nhãn 3 mà bạn muốn xóa. – Jonas

+0

vì vậy không thể chọn dòng "outter" cho mọi trường hợp? Khi tôi hiểu cách 'phá vỡ', nó tách các cấu trúc kết nối ba như vậy? Trong bước tiếp theo, tôi đã chọn nhãn outter đó, nhưng tùy chọn đó 'hbreak' không hoạt động vì lý do gì. – mchlfchr

2

Có vẻ như hình ảnh đầu vào của bạn là một chút khác biệt so với một trong những bạn đăng, kể từ khi tôi có thể không trực tiếp thu thập các điểm chi nhánh (có quá nhiều người trong số họ). Vì vậy, để bắt đầu xử lý vấn đề của bạn, tôi xem xét việc tỉa thưa theo sau là phát hiện điểm nhánh. Tôi cũng làm giãn chúng và loại bỏ khỏi hình ảnh mỏng, điều này đảm bảo rằng trên thực tế không có kết nối (4 hoặc 8) giữa các phân đoạn khác nhau trong hình ảnh ban đầu.

f = im2bw(imread('http://i.imgur.com/yeFyF.png'), 0); 
g = bwmorph(f, 'thin', 'Inf'); 
h = g & ~bwmorph(bwmorph(g, 'branchpoints'), 'dilate'); 

Kể từ h giữ phân đoạn bị ngắt kết nối, hoạt động sau thu thập các điểm kết thúc của tất cả các phân đoạn:

u = bwmorph(h, 'endpoints'); 

Bây giờ để thực sự giải quyết vấn đề của bạn tôi đã làm một số phân tích nhanh chóng vào những gì bạn muốn loại bỏ. Cân nhắc hai phân đoạn riêng biệt, ab, trong h. Chúng tôi nói ab trùng lặp nếu các điểm kết thúc của một được chứa trong phần còn lại. Bởi có tôi chỉ đơn giản có nghĩa là nếu điểm x bắt đầu của một là nhỏ hơn hoặc bằng khác, và điểm kết thúc x là lớn hơn hoặc bằng nhau quá. Trong trường hợp của bạn, "núi" trùng lặp với phân đoạn mà bạn muốn xóa. Để xác định mỗi người trong số họ xóa, hãy xem xét khu vực của họ. Nhưng, vì đây là những phân đoạn, khu vực là một thuật ngữ vô nghĩa. Để xử lý điều đó, tôi kết nối các điểm kết thúc của một phân đoạn và được sử dụng làm khu vực đơn giản là các điểm bên trong. Như bạn có thể nhận thấy rõ ràng, khu vực của phân đoạn chồng chéo ở phía dưới là rất nhỏ, vì vậy chúng tôi nói nó về cơ bản là một dòng và loại bỏ nó trong khi vẫn giữ phân khúc "núi". Để thực hiện bước này, hình ảnh u có tầm quan trọng cơ bản, vì với nó, bạn có một dấu hiệu rõ ràng về nơi bắt đầu và dừng theo dõi một đường bao. Nếu bạn đã sử dụng hình ảnh h như hiện tại, bạn sẽ gặp khó khăn khi xác định vị trí bắt đầu và dừng thu thập các điểm của đường bao (tức là, thứ tự quét sẽ cho bạn dấu hiệu trùng lặp không chính xác).

Để xây dựng lại phân khúc dưới dạng một phân đoạn (hiện tại bạn có ba phân đoạn), hãy xem xét các điểm bạn đã loại bỏ khỏi g trong h và sử dụng những phân đoạn không thuộc phân đoạn dưới cùng đã bị xóa.