Đường nối qua các đám mây điểm lớn


8

Tôi có một tập hợp lớn các điểm (thứ tự 10k điểm) được hình thành bởi các rãnh hạt (chuyển động trong mặt phẳng xy trong thời gian được quay bằng máy ảnh, do đó, khung hình 3d - 256x256px và ca 3k trong tập mẫu của tôi) và nhiễu. Các hạt này di chuyển trên các đường thẳng xấp xỉ (nhưng chỉ gần như) theo cùng một hướng, và vì vậy để phân tích quỹ đạo của chúng, tôi đang cố gắng điều chỉnh các đường thẳng qua các điểm. Tôi đã cố gắng sử dụng RANSAC tuần tự, nhưng không thể tìm thấy một tiêu chí để xác định một cách đáng tin cậy các mặt tích cực sai, cũng như T- và J-Linkage, quá chậm và cũng không đủ tin cậy.

Dưới đây là hình ảnh của một phần của bộ dữ liệu phù hợp tốt và xấu với Ransac tuần tự: nhập mô tả hình ảnh ở đây Tôi đang sử dụng tâm của các đốm hạt ở đây, kích thước blob thay đổi trong khoảng từ 1 đến khoảng 20 pixel.

Tôi thấy rằng các mẫu con sử dụng ví dụ chỉ mỗi khung hình thứ 10 cũng hoạt động khá tốt, vì vậy kích thước dữ liệu cần xử lý có thể được giảm theo cách này.

Tôi đã đọc một bài đăng trên blog về tất cả những điều mà mạng lưới thần kinh có thể thực hiện được và muốn hỏi bạn liệu đây có phải là một ứng dụng khả thi cho một trước khi tôi bắt đầu đọc không (tôi đến từ một nền tảng không phải là toán học, vì vậy tôi sẽ phải làm khá một chút đọc)?

Hoặc bạn có thể đề xuất một phương pháp khác?

Cảm ơn!

Phụ lục: Đây là mã cho hàm Matlab để tạo ra đám mây điểm mẫu chứa 30 dòng nhiễu song song mà tôi chưa thể phân biệt được:

function coords = generateSampleData()
coords = [];
for i = 1:30
    randOffset = i*2;
    coords = vertcat(coords, makeLine([100+randOffset 100 100], [200+randOffset 200 200], 150, 0.2));
end

figure
scatter3(coords(:,1),coords(:,2),coords(:,3),'.')

function linepts = makeLine(startpt, endpt, numpts, noiseOffset)
    dirvec = endpt - startpt;
    linepts = bsxfun( @plus, startpt, rand(numpts,1)*dirvec); % random points on line
    linepts = linepts + noiseOffset*randn(numpts,3); % add random offsets to points
end

end

nếu bạn cung cấp cho chúng tôi tập dữ liệu mẫu hoặc tập dữ liệu giả giống như tập dữ liệu thực của bạn hoặc ảnh của tập dữ liệu thật hoặc giả, bạn có thể nhận được phản hồi tốt hơn. Bạn không nên nói nếu 2d hoặc 3d - hoặc 4d ...
Spainedman

Tôi không nghĩ nó sẽ phải cụ thể như vậy. Dù sao cũng đã cập nhật
Lukas K.

Ôi thật thú vị hơn tôi nghĩ. Bạn đã có cả một đám mây các điểm thuộc về một số lượng lớn các dòng khác nhau và một số điểm ồn ào không có, và lý tưởng là bạn muốn tìm tất cả các dòng, ngay cả những điểm nhỏ như 3 hoặc 4 ở dưới cùng bên phải ...
Spainedman

Tôi rất vui vì vấn đề này rất thú vị, bây giờ tôi hy vọng ai đó có thể giúp tôi với nó :)
Lukas K.

ah, nhưng tọa độ điểm x, y, T không liên tục của nó mà là một loạt các raster nhị phân (0/1)? Và nếu hai bản nhạc giao nhau, bạn có thể nhận được một pixel thuộc nhiều hơn một bản nhạc ...
Spacesman

Câu trả lời:


3

Dựa trên phản hồi và cố gắng tìm ra cách tiếp cận hiệu quả hơn, tôi đã phát triển thuật toán sau bằng cách sử dụng thước đo khoảng cách chuyên dụng.

Các bước sau đây được thực hiện:

1) Xác định số liệu khoảng cách trở về:

không - nếu các điểm không thuộc về một dòng

Khoảng cách Eidianidian của các điểm - nếu các điểm tạo thành một đường theo các tham số đã xác định, nghĩa là

  • khoảng cách của chúng cao hơn hoặc bằng so với min_line_length

  • khoảng cách của chúng thấp hơn hoặc bằng max_line_length

  • dòng này bao gồm ít nhất các điểm min_line_point với khoảng cách thấp hơn dòng đó_ mật độ / 2 so với dòng

2) Tính ma trận khoảng cách bằng cách sử dụng thước đo khoảng cách này (sử dụng mẫu dữ liệu cho các tập dữ liệu lớn; điều chỉnh các tham số dòng cho phù hợp)

3) Tìm các điểm A và B với khoảng cách tối đa - ngắt đến bước 5) nếu khoảng cách bằng 0

Lưu ý rằng nếu khoảng cách cao hơn 0 thì các điểm A và B đang xây dựng một đường thẳng dựa trên định nghĩa của chúng tôi

4) Lấy tất cả các điểm thuộc đường thẳng AB và xóa chúng khỏi ma trận khoảng cách. Lặp lại bước 3) để tìm dòng khác

5) Kiểm tra mức độ bao phủ của điểm với các dòng đã chọn, nếu số lượng điểm đáng kể vẫn chưa được khám phá, lặp lại toàn bộ thuật toán với các tham số dòng được điều chỉnh.

6) Trong trường hợp mẫu dữ liệu được sử dụng - gán lại tất cả các điểm cho các dòng và tính toán lại các điểm biên.

Các tham số sau được sử dụng:

độ rộng đường - line_ thong / 2 là khoảng cách cho phép của điểm từ đường lý tưởng = r line_width

độ dài dòng tối thiểu - các điểm có khoảng cách ngắn hơn không được coi là thuộc cùng một dòng = r min_line_length

độ dài dòng tối đa - các điểm có khoảng cách dài hơn không được coi là thuộc cùng một dòng = r max_line_length

điểm tối thiểu trên một dòng - các dòng có ít điểm hơn bị bỏ qua =r min_line_points

Với dữ liệu của bạn (sau một vài lần thay đổi thông số) tôi đã có một kết quả tốt bao gồm tất cả 30 dòng.

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

Thông tin chi tiết có thể được tìm thấy trong kịch bản đan


2

Tôi đã giải quyết nhiệm vụ tương tự, mặc dù đơn giản hơn, với cách tiếp cận vũ phu. Đơn giản hóa là trong giả định, rằng dòng là một hàm tuyến tính (trong trường hợp của tôi, ngay cả các hệ số và đánh chặn đều nằm trong một phạm vi đã biết).

Do đó, điều này sẽ không giải quyết vấn đề của bạn nói chung, trong đó một hạt có thể di chuyển trực giao với trục x (nghĩa là nó không có chức năng nào), nhưng tôi đăng giải pháp như một nguồn cảm hứng có thể.

1) Lấy tất cả các kết hợp của hai điểm A và B với A (x)> B (x) + không đổi (để tránh tính đối xứng và sai số cao trong khi tính hệ số)

2) Tính hệ số c và chặn i của đường thẳng AB

 A(y) = i + c * A(x)
 B(y) = i + c * B(x)
 A(y) - B(y) = c * (A(x) - B(x))
 c = (A(y) - B(y)) / (A(x) - B(x))
 i = A(y) - c * A(x)

3) Làm tròn hệ số và đánh chặn (điều này sẽ loại bỏ / hạ thấp các vấn đề có lỗi do các điểm trong lưới)

4) Với mỗi lần đánh chặn và hệ số, hãy tính số điểm trên đường thẳng này

5) Chỉ xem xét các dòng có điểm trên một số ngưỡng.

Ví dụ đơn giản xem tại đây


Về cơ bản, đó là những gì tôi đang làm với RANSAC (ngoại trừ việc tôi sử dụng lấy mẫu ngẫu nhiên thay vì thử tất cả các kết hợp). Vấn đề đối với tôi không phù hợp với một số dòng, vấn đề là tôi phù hợp với quá nhiều dòng, bởi vì chỉ cần có quá nhiều điểm gần, thậm chí một đường xiên sẽ tìm thấy đủ các giá trị trong bất kỳ ngưỡng hợp lý nào. Vì vậy, tôi đang tìm kiếm một tiêu chí để phân biệt các dòng phù hợp với các dòng "thực" với các dòng khác.
Lukas K.

1
Tôi không chắc chắn nếu nó thực sự là cùng một cách tiếp cận. Tôi không phân biệt giữa điểm trên một dòngngoại lệ . Tôi đang xem xét nếu hai vectơ có thể hoặc không thuộc cùng một dòng. Tôi nghĩ điều này có thể chính xác hơn nhiều. Additioanly Tôi sử dụng chiều rộng dòng tham số , độ dài dòng tối thiểuđiểm dòng tối thiểu để kiểm soát lựa chọn.
Máy bay ném bom Marmite

ok, tôi hiểu rồi Mặc dù với 10k điểm và (10E + 5 chọn 2) = 5E + 11 cặp có thể, tôi sẽ phải lấy mẫu ngẫu nhiên. Ngoài ra, điều này có lẽ khá nhạy cảm đối với độ lệch so với đường thẳng, có thể thay đổi đánh chặn. Nhưng tôi sẽ thử! Suy nghĩ như chiều dài tối thiểu và tối thiểu không. điểm trên dòng tôi đã sử dụng trong nỗ lực của mình để làm sạch kết quả.
Lukas K.
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.