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, a
và b
, trong h
. Chúng tôi nói a
và b
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.
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
@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
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