2011-09-20 31 views
10

Giả sử tôi có một số dữ liệu bitmap (màu đen) mà trên đó một số dòng được vẽ tay theo định dạng vector (màu xanh). Các dòng gần đúng theo hình dạng của dữ liệu bitmap. Ở một số nơi, các đường giao nhau.Cách tìm 4 điểm bên cạnh giao điểm của hai dòng

Vì vậy, những gì tôi đang cố gắng làm là, biết vị trí của giao điểm đường màu xanh, làm thế nào tôi có thể tìm thấy vị trí của A, B, C và D?

Xem dưới đây để biết một số ví dụ:

enter image description here

Tôi không chắc chắn làm thế nào để tiếp cận vấn đề này cho các vị trí ngẫu nhiên của các dòng và đôi khi họ thậm chí không bên trong hình dạng màu đen. Tuy nhiên, tôi đoán phải có một số cách. Bất kì lời đề nghị nào?

+0

Bạn có thể chính xác hơn không: giao điểm đường màu xanh lá cây có ** bên trong ** A, B, C, D hoặc A, B, C, D như minh họa ở đâu có giao điểm đường màu xanh lục không? –

+0

Làm điều này với một bitmap có thể trở nên khó khăn/chậm. Bạn không thể lấy đầu vào làm đồ họa vector? –

+1

Tôi không thấy cách các đường màu xanh lá cây sẽ giúp; trong hình 2 họ giao nhau ở bên phải của B & C. –

Trả lời

3

đơn giản nhất cách tiếp cận tôi có thể nghĩ là thế này:

  1. Lọc hình ảnh để loại bỏ các dòng màu xanh lá cây. Một cách tiếp cận đơn giản là sử dụng một số loại mỏng làm đầy màu nền của (các) pixel lân cận.

  2. Bây giờ bạn sẽ có một hình ảnh chỉ bao gồm các đường màu đen (rộng) và nền trắng.

  3. Lọc lại hình ảnh bằng thuật toán phát hiện góc, chẳng hạn như Harris detector. Điều này sẽ cho bạn bốn góc.

Ghi chú:

  1. Tùy thuộc vào các dữ liệu đầu vào, bạn có thể nhận được nhiều hơn bốn góc. Trong mọi trường hợp, bạn nên xác minh rằng bốn góc bạn đã trích xuất thực sự là các góc của giao lộ. Một lần nữa, đây là một cách tiếp cận khá thô, nhưng nếu dữ liệu đầu vào là sạch như trong ví dụ của bạn, và khoảng cách giữa các đường màu xanh và các đường màu đen không quá lớn, tôi nghĩ nó có thể hoạt động.

0

Trước tiên, hãy để tôi nói rằng tôi không biết gì về chủ đề cũng như tôi không có bất kỳ trải nghiệm nào về chủ đề này. Vì vậy, đây chỉ là phỏng đoán của tôi. Nhưng tôi sẽ bắt đầu bằng cách bỏ qua các dòng màu xanh lá cây - trong đó, btw, cũng không giống như dòng.

Btw, việc này có phải làm gì với đường không?

Vì vậy, hãy tắt các đường màu xanh lục. Sau đó, lấy một hình vuông nhỏ giống như bất kỳ hình vuông nào trong số 4 hình trên bạn đã có, cho đến khi bạn đi qua tất cả chúng và tìm những người có tỷ lệ pixel/đen tối đa. Đó phải là những người có "ngã tư". Bằng cách ánh xạ các pixel đen đó với viền màu trắng, bạn sẽ có đường viền đường/trường. Sau đó xác định những điểm đó sẽ dễ dàng.

Như tôi đã nói, một phỏng đoán hoang dã. Thú vị vấn đề - tự hỏi những gì những hiểu biết chaps sẽ đến với.

0

Trước tiên, bạn phải trích xuất các cạnh từ hình ảnh gốc để có được các đa giác mô tả viền đen trắng.

Sau đó, bạn lặp qua các điểm của các cạnh của đề tài và tính toán một khoảng cách pointwise đến điểm giao nhau của hai đường màu xanh lục. Bốn khoảng cách nhỏ nhất đến từ những điểm bạn đang tìm kiếm.

Điều này có trả lời câu hỏi của bạn không? Hay tôi hiểu nhầm điều gì đó?

Nếu bạn chỉ muốn 4 góc, bạn không cần dòng màu xanh lá cây: Chỉ cần lấy đường viền từ mép cắt, mịn bằng bộ lọc Savitzky-Golay và tính độ cong theo chiều kim đồng hồ. Chỉ trích xuất các điểm có độ cong tối đa.

0

Bạn cần vector hóa hình ảnh nhị phân. Dự án đại học của chúng tôi đã đúng về chủ đề - Corners Toolbox Allowing Processing Binary Images in a Compressed Form (không bị nhầm lẫn bởi tiêu đề - "nén" ở đây có nghĩa là hình ảnh nhị phân được chuyển đổi lần đầu tiên trong danh sách được liên kết của các góc được gọi).

1) chuyển đổi hình ảnh thành các góc (xem chương 4 của liên kết ở trên). Sau đó bạn có thể sử dụng nội suy đường của các điểm góc (chương 5.5) - bạn sẽ sửa đổi thuật toán của chúng tôi để xem những thay đổi độ dốc lớn (~ 90 độ) trong các đoạn lớn hơn.

2) bạn không cần dòng màu xanh lục. Bạn có thể sử dụng thuật toán skeletonization để tìm bộ xương của phần màu đen (xem chương 5.4), và nội suy bộ xương này với các dòng (xem chương 5.5 của liên kết ở trên).

Nếu bạn quan tâm đến dự án, tôi có thể hỏi các đồng nghiệp nếu chúng tôi có thể cung cấp mã nguồn.

0

Cách đơn giản nhất sẽ là một bộ khung. Đầu tiên tách hình ảnh màu xanh lá cây và đen/trắng. Chạy thuật toán khung (một hoạt động hình thái khá đơn giản, cũng trong OpenCV) trên cả hai hình ảnh và xác định điểm giao nhau (có thể được thực hiện với số pixel 8 vùng đơn giản trong hình ảnh bộ xương: nghĩa là, đối với mỗi pixel đen đếm bao nhiêu pixel được kết nối theo chiều ngang, chiều dọc hoặc theo đường chéo và nếu giá trị này là> = 4 thì đó là giao lộ). Bây giờ thực hiện một trận đấu gần nhất hàng xóm cho các điểm được sắp xếp hợp lý này và bạn đã hoàn thành.

2

Tôi giả sử bạn biết cách lấy tọa độ (x,y) giao điểm đường vectơ màu xanh lá cây, vì vậy tôi sẽ loại bỏ phần đó.

Bắt đầu từ pixel gần nhất với (x,y), dần dần di chuyển ra ngoài theo hình xoắn ốc vuông (hoặc một số mẫu tìm kiếm khác theo ý thích của bạn) từ pixel đến pixel. Ở mỗi bước, kiểm tra xem bạn có đang ở trên một pixel đen với một pixel và chỉ một màu trắng Moore neighbour. Nếu vậy, sau đó là nơi mà các điểm ảnh màu đen và liên lạc hàng xóm màu trắng của nó (có thể là một góc chung) là một trong những điểm của bạn (gọi nó là A). Tiếp tục hành quân cho đến khi bạn tìm thấy thêm ba (B, C, D). Đây sẽ là bốn điểm gần nhất với giao lộ xanh - điều này sẽ hoạt động tốt trong bốn ví dụ bạn trình bày trong câu hỏi của mình.

Tuy nhiên, thuật toán này sẽ thất bại nếu giao lộ màu xanh lá cây nằm giữa hai giao lộ màu đen; trong trường hợp này nó sẽ kết hợp các điểm từ cả hai giao điểm đen. Nếu bạn lo ngại về điều này, thì ngay sau khi bạn đã tìm thấy điểm A, hãy bắt đầu lại vòng xoắn hành quân của bạn, tập trung vào A lần này và diễu hành cho đến khi bạn tìm thấy B, C, D. Điều này sẽ có hiệu lực " snap "đến giao điểm đen gần nhất.

Bạn có thể thêm thông minh hơn để tránh tìm kiếm cùng một khu vực hai lần; bắt đầu lại hoặc tập trung lại mẫu tìm kiếm của bạn khi bạn đã tìm thấy B và một lần nữa khi bạn đã tìm thấy C, v.v ... Tùy thuộc vào mức độ ưa thích mà bạn muốn/cần phải có.

0

Bạn sẽ có thể tìm thấy điểm mà các đường màu xanh lá cây đi ngang cũng như điểm giữa, nơi các đường màu đen đi ngang qua một quá trình xói mòn (co lại thành các điểm). Sau đó, sử dụng một cặp gần nhất của các loại thuật toán để tìm những đường màu đen giao nhau với giao lộ đường màu xanh lá cây là gần nhất.

Sau đó, bạn có thể thực hiện tìm kiếm cách xa điểm mà các đường màu đen giao nhau. Bạn sẽ cần một hàng đợi ưu tiên sẽ xử lý các điểm theo khoảng cách của họ cách xa điểm giao nhau của đường màu đen, gần nhất trước tiên. Đặt bốn điểm liền kề với các đường màu đen giao nhau trong hàng đợi. Đối với mỗi điểm trong hàng đợi, bạn sẽ muốn kiểm tra xem nó có phải là một pixel trắng (chúng ta muốn) hay không, kiểm tra xem nó chưa được truy cập trước đó hay không (bỏ qua trong trường hợp đó), và sau đó thêm bốn điểm ảnh liền kề của nó vào hàng đợi. Bốn pixel trắng đầu tiên nên là pixel mà bạn muốn (giả sử bạn có phương pháp sắp xếp khung/thu nhỏ tốt để tìm giao lộ), nhưng bạn nên thực sự lấy các pixel trắng cho đến khi bạn nhận được bốn điểm ảnh đầu tiên không liên kết với nhau .

Các vấn đề liên quan