Làm cách nào để phát hiện các vật thể khác biệt khi các cạnh của chúng chạm vào nhau?


21

Tôi cần tìm tất cả các đường viền trong hình ảnh được lấy từ máy ảnh. Vì vậy, trước tiên tôi sử dụng bộ dò cạnh canny để tìm các cạnh và sau đó tìm các đường viền. Khá đơn giản.

Tuy nhiên, các đường viền của tôi được "hợp nhất". Ví dụ, trong hình dưới đây, tôi rõ ràng có 4 đối tượng khác nhau. Các cạnh hơi chạm vào một số điểm, vì vậy tôi có một đường viền lớn thay vì bốn đường viền riêng biệt. Tôi đã cố gắng thay đổi xung quanh các ngưỡng, xói mòn, hoạt động hình thái và những thứ tương tự nhưng các cạnh giữ hơi chạm. Có ai có bất kỳ đề xuất về làm thế nào để có được các đường viền riêng biệt trong hình ảnh tương tự như dưới đây? (Hình ảnh dưới đây rõ ràng chỉ là một ví dụ, hình ảnh thực tế của tôi phức tạp hơn nhiều, nhưng có cùng một vấn đề cơ bản).

nhập mô tả hình ảnh ở đây


Phân khúc đầu nguồn có thể làm việc.
sm176357

Vì vậy, bạn cũng nên xem xét các trường hợp liên hệ là một đường và không chỉ là một điểm quá (chạm nhưng không chồng chéo)
Shravya Boggarapu

Câu trả lời:


11

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).

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

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.

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

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.


2

Hãy thử xử lý trước hình ảnh của bạn bằng bộ lọc hình thái như xói mòn . Điều này sẽ cho phép các đường viền chạm được tách ra. Sau khi phát hiện các đường viền của bạn, bạn có thể áp dụng thao tác giãn nở để hoàn thành các mạng.


Tôi đã thử điều đó, nhưng kết quả cho thấy không có cải thiện.

1
Bạn có thể hiển thị một hình ảnh ví dụ thực tế?

2

Đây không phải là câu trả lời cho câu hỏi của bạn, nhưng phân tích đường viền dễ bị lỗi. Bạn không thể làm gì nhiều về nó và nó chỉ hoạt động trên các kịch bản rất đơn giản.

Nếu bạn gặp khó khăn khi sử dụng nó, bạn nên tìm kiếm một thuật toán hoàn toàn khác. Có nhiều cách phức tạp hơn và mạnh mẽ hơn để giải quyết mọi thứ, nhưng nó phụ thuộc vào những gì bạn muốn đạt được (phát hiện đối tượng, theo dõi, v.v.)


Cảm ơn bạn. Chương trình của tôi được sử dụng để phát hiện bàn tay, vì vậy tôi nghĩ nó sẽ rất giống với phát hiện đối tượng. Bạn có đưa ra bất kỳ đề nghị cho các thuật toán phức tạp và mạnh mẽ hơn? Các tính năng của Haar, SURF và các thuật toán học máy tương tự không phải là điều tôi có thể làm.

Bạn đã xem xét các tài nguyên này? paginas.fe.up.pt/~hgc2011 Chúng chủ yếu là cơ sở dữ liệu / kết quả, nhưng tôi hy vọng bạn sẽ có thể tìm thấy một số bài báo tốt ở đây.

0

Đường viền không nhất thiết phải xem xét rằng bạn đã sử dụng canny để phát hiện chúng. Các vấn đề với Canny đã được giải thích ở đây . Các cuộc thảo luận về canny cung cấp cho bạn ý tưởng cơ bản rằng vẫn còn các hoạt động như đóng và giãn được yêu cầu trên đầu canny để đánh giá các đường viền kín.

Điều này cũng phụ thuộc vào việc chúng ta đang tìm kiếm các đường viền hoặc phân đoạn (Canny so với các phương thức như Biểu đồ ). Vì vậy, tôi đoán tìm kiếm giải pháp mạnh mẽ phụ thuộc vào ứng dụng cuối cùng của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.