Phát hiện các thành phần khác nhau:
Nếu bạn đang cố gắng phát hiện các thành phần khác nhau, có thể có các cách tiếp cận khác để thực hiện chúng hơn là phát hiện các đường viền. Đây là một ví dụ trong Mathicala. Xói mòn theo sau sự giãn nở được sử dụng để thu hẹp khoảng cách trong thành phần thứ hai trước khi phát hiện (nếu bạn không làm điều này, nó sẽ không phát hiện ra nó).
img = Binarize@Import["http://i.stack.imgur.com/yqDyu.png"];
Colorize[MorphologicalComponents[Dilation[Erosion[img,1],1]]]
Hình bên trái bên dưới, hiển thị phát hiện đối tượng không hoàn hảo (không đóng khoảng cách) và bên phải, hiển thị phát hiện chính xác (chạy mã ở trên).
Phát hiện các đường viền khác nhau:
Tuy nhiên, nếu bạn thực sự muốn chỉ tách các đường viền, đây là một ví dụ. Xói mòn và giãn nở được thực hiện như trước để thu hẹp khoảng cách và hình ảnh thu được được chạy qua một máy dò cạnh Canny. Tôi đã thực hiện các tùy chọn mặc định rõ ràng để bạn có thể thấy những gì đang được sử dụng.
img2 = EdgeDetect[Dilation[Erosion[img, 1], 1], Method -> "Canny"]
Điều này sẽ cung cấp cho bạn cả cạnh bên trong và cạnh bên ngoài (xem hình bên trái bên dưới), vì chiều rộng pixel lớn hơn 1 xung quanh. Tôi đã không có nhiều may mắn khi cố gắng làm cho nó mỏng hơn, vì hiệu suất giảm (có thể khác với các hình ảnh khác của bạn). Các đường viền bên trong là những đường viền bạn muốn và đường viền bên ngoài chỉ là đường viền kết hợp của cả 4 thành phần. Bây giờ tất cả những gì chúng ta cần làm là thả cái ngoài cùng với:
SelectComponents[img2, "EnclosingComponentCount", # > 0 &]
cung cấp cho bạn các đường viền bên trong (xem dưới cùng bên phải). Nói cách khác, nó chỉ chọn những đường viền được bao quanh bởi ít nhất một đường viền khác, nó sẽ tự động loại bỏ đường viền ngoài cùng. Tôi không biết tương đương với các lệnh / hoạt động này trong openCV.
Lưu ý rằng các ngắt rõ ràng trong hình là do lưu vào jpeg ở kích thước nhỏ hơn. Nó không giống như vậy trên màn hình của tôi.