2012-09-20 41 views
6

Bởi "Nhóm", ý tôi là một tập hợp pixel sao cho mỗi pixel ít nhất có một pixel liền kề trong cùng một tập, bản vẽ hiển thị ví dụ về một nhóm.Cách tìm điểm ảnh xa nhất với điểm ảnh khác trong cùng nhóm pixel

An example of a group

Tôi muốn tìm ra điểm ảnh mà là có dòng khoảng cách lớn nhất trực tiếp từ một điểm ảnh được chỉ định (ví dụ, các điểm ảnh màu xanh lá cây). Và đường thẳng nối hai điểm ảnh (đường màu đỏ) không được rời khỏi nhóm.

Giải pháp của tôi là lặp qua các độ và mô phỏng tiến trình của các dòng bắt đầu từ pixel màu xanh lá cây với mức độ và xem dòng nào đi xa nhất.

longestDist = 0 
bestDegree = -1 
farthestX = -1 
farthestY = -1 
FOR EACH degree from 0 to 360 
    dx=longestDist * cos(degree); 
    dy=longestDist * sin(degree); 
    IF Point(x+dx , y+dy) does not belong to the group 
     Continue with next degree 
     //Because it must not be the longest line, so skip it 
    END IF 
    (farthestX , farthestY) = simulate(x,y,degree) 
    d = findDistance(x , y , farthestX , farthestY) 
    IF d > longestDist 
     longestDist = d 
     bestDegree = degree 
    END IF 
END FOR 

Rõ ràng đây không phải là thuật toán tốt nhất. Vì vậy, tôi yêu cầu giúp đỡ ở đây.

Cảm ơn và xin lỗi vì tiếng Anh kém của tôi.

+1

Lưu ý rằng bạn có thể hủy tính toán cho tất cả các pixel nội bộ. – dfens

+0

Và bạn không cần phải sử dụng góc. Bạn chỉ cần sử dụng định lý Pythagore;) – dfens

+0

@dfens: "pixel nội thất" - tại sao? một trong số đó có thể là giải pháp. –

Trả lời

0

Trước tiên, hãy lưu ý rằng việc discretization góc trong thuật toán của bạn có thể phụ thuộc vào kích thước của lưới. Nếu bước quá lớn, bạn có thể bỏ lỡ các ô nhất định, nếu nó quá nhỏ, bạn sẽ kết thúc việc truy cập cùng một ô một lần nữa.

Tôi khuyên bạn nên liệt kê các ô trong khu vực và kiểm tra điều kiện cho từng ô riêng lẻ. Việc liệt kê có thể được thực hiện bằng cách sử dụng tìm kiếm theo chiều rộng đầu tiên hoặc chiều sâu (tôi nghĩ rằng thứ hai sẽ thích hợp hơn, vì nó sẽ cho phép một thiết lập một giới hạn thấp hơn một cách nhanh chóng và thực hiện cắt tỉa).

Người ta có thể duy trì điểm xa nhất X cho đến nay và cho mỗi điểm mới trong khu vực, kiểm tra xem (a) điểm có xa hơn điểm được tìm thấy cho đến thời điểm này không và đường thẳng đi qua các ô của khu vực. Nếu cả hai điều kiện được thỏa mãn, hãy cập nhật X, hãy tiếp tục với tìm kiếm. Nếu điều kiện (a) không thỏa mãn, điều kiện (b) không phải được kiểm tra.

Độ phức tạp của giải pháp này là O(N*M), trong đó N là số ô trong khu vực và M là kích thước lớn hơn của khu vực (max(width,height)). Nếu hiệu suất là bản chất, heuristics phức tạp hơn có thể được áp dụng, nhưng đối với một lưới có kích thước hợp lý này sẽ làm việc tốt.

0

Tìm kiếm pixel, không phải cho độ dốc. Mã giả.

bestLength = 0 
for each pixel in pixels 
    currentLength = findDistance(x, y, pixel.x, pixel.y) 
    if currentLength > bestLength 
    if goodLine(x, y, pixel.x, pixel.y) 
     bestLength = currentLength 
     bestX = pixel.x 
     bestY = pixel.y 
    end 
    end 
end 

Bạn có thể muốn sắp xếp pixel giảm dần | dx | + | dy | trước đó.

+1

Điều này không xử lý yêu cầu rằng đường kết nối vẫn nằm trong khu vực. – davec

1

Tôi sẽ không làm việc với các góc. Nhưng tôi khá chắc chắn khoảng cách lớn nhất sẽ luôn ở giữa hai điểm ảnh ở cạnh của tập, vì vậy tôi sẽ theo dõi đường viền: Từ bất kỳ pixel nào trong tập hợp sẽ chuyển sang bất kỳ hướng nào cho đến khi bạn đến cạnh của bộ. Sau đó di chuyển (couter) theo chiều kim đồng hồ dọc theo cạnh. Làm điều này với bất kỳ điểm ảnh nào như điểm bắt đầu và bạn sẽ có thể tìm thấy khoảng cách lớn nhất. Nó vẫn khá tham lam, nhưng tôi nghĩ nó có thể cung cấp cho bạn một điểm khởi đầu thay thế để cải thiện.

Chỉnh sửa: Điều tôi vừa nghĩ: Khi bạn có pixel bắt đầu s và điểm ảnh cuối e. Trong lần lặp đầu tiên sử dụng s, e tương ứng sẽ được liền kề (cạnh tiếp theo dọc theo cạnh theo chiều kim đồng hồ).Khi bạn lặp lại dọc theo cạnh, trường hợp có thể xảy ra, rằng không có đường thẳng nào qua tập hợp giữa se. Trong trường hợp đó, dòng này sẽ nhấn một phần khác của cạnh thiết lập (pixel p). Bạn có thể tiếp tục lặp đi lặp lại của mép ở đó điểm ảnh (e = p)

Edit2: Và nếu bạn nhấn một p bạn sẽ biết rằng có thể không còn khoảng cách giữa se như vậy trong phiên bản kế tiếp của s bạn có thể bỏ qua toàn bộ một phần của cạnh (giữa sp) và bắt đầu lại tại p.

Chỉnh sửa3: Sử dụng phương pháp trên để tìm số p đầu tiên. Hãy lấy số p đó làm s tiếp theo và tiếp tục. Lặp lại cho đến khi bạn tiếp tục lại lần đầu tiên p. Khoảng cách tối đa sẽ nằm giữa hai trong số p trừ khi cạnh của bộ này lồi trong trường hợp bạn sẽ không tìm thấy p.

Disclaimer: Đây là chưa được kiểm tra và chỉ là ý tưởng từ đỉnh đầu của tôi, không có bản vẽ đã được thực hiện để chứng minh yêu cầu của tôi và tất cả mọi thứ có thể sai (tức là suy nghĩ về nó cho chính mình trước khi bạn thực hiện nó; D)

0

Sử dụng cấu trúc dữ liệu kép:

  • Một trong đó chứa các pixel được sắp xếp theo góc.
  • Thứ hai được sắp xếp theo khoảng cách (để truy cập nhanh, điều này cũng nên chứa "con trỏ" cho cấu trúc dữ liệu đầu tiên).

Đi qua góc được sắp xếp một và kiểm tra từng điểm ảnh mà đường nằm trong vùng. Một số điểm ảnh sẽ có cùng một góc, vì vậy bạn có thể đi bộ từ nguồn gốc dọc theo đường và đi cho đến khi bạn ra khỏi khu vực. Bạn có thể loại bỏ tất cả các điểm ảnh vượt quá điểm đó. Ngoài ra, nếu khoảng cách tối đa tăng lên, hãy xóa tất cả các pixel có khoảng cách ngắn hơn.

0

Xử lý vùng của bạn dưới dạng đa giác thay vì tập hợp pixel. Từ đó bạn có thể nhận danh sách các đoạn thẳng (các cạnh của đa giác).

Vẽ một đường từ điểm ảnh bắt đầu của bạn đến từng pixel bạn đang kiểm tra. Đường dài nhất không giao nhau với bất kỳ đoạn đường nào trong đa giác của bạn cho biết điểm ảnh xa nhất có thể truy cập bằng đường thẳng từ pixel của bạn.

Có nhiều tối ưu khác nhau mà bạn có thể thực hiện đối với trường hợp này và một vài trường hợp cần kiểm tra, nhưng hãy cho tôi biết nếu bạn hiểu ý tưởng trước khi tôi đăng những ý tưởng đó, bạn có hiểu ý tôi không? đa giác thay vì tập hợp các pixel?

Để thêm, phương pháp này sẽ nhanh hơn đáng kể so với bất kỳ cách tiếp cận hoặc phương pháp tiếp cận dựa trên góc nào yêu cầu "đi bộ" cho tất cả trừ các tập hợp pixel nhỏ nhất. Bạn có thể tiếp tục tối ưu hóa vì vấn đề của bạn tương đương với việc tìm điểm cuối xa nhất của cạnh đa giác có thể đạt được thông qua một đường thẳng không xác định từ điểm bắt đầu của bạn. Điều này có thể được thực hiện trong O (N^2), trong đó N là số cạnh. Lưu ý rằng N sẽ nhỏ hơn nhiều so với số lượng pixel và nhiều thuật toán đề xuất rằng góc sử dụng một/hoặc pixel lặp lại sẽ thay vào đó phụ thuộc vào số lượng pixel.

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