Thuật toán nhảy lũ có thể tách rời?


10

JFA (thuật toán được mô tả ở đây: http://www.comp.nus.edu.sg/~tants/jfa/i3d06.pdf ) có thể được sử dụng để lấy xấp xỉ biểu đồ Voronoi hoặc biến đổi khoảng cách. Nó làm như vậy trong thời gian logarit dựa trên kích thước của hình ảnh thu được, chứ không dựa trên số lượng hạt giống.

Bạn sẽ làm gì nếu hình ảnh của bạn không cùng kích thước trên mỗi trục?

Nếu chúng có kích thước tương tự nhau, tôi chắc chắn rằng bạn chỉ có thể để trục ngắn hơn có thêm các bước JFA có kích thước 1, trong khi trục lớn hơn hoàn thành nó hoạt động (như có hình ảnh kích thước 512 x 256). Đối với kích thước trục có kích thước khác nhau rất lớn, điều này có thể kém hiệu quả hơn rất nhiều - giả sử rằng bạn có kết cấu âm lượng là 512 x 512 x 4.

Có thể chạy JFA trên từng trục riêng biệt mà vẫn nhận được kết quả tốt?

Hoặc tại thời điểm đó là một thuật toán khác phù hợp hơn để sử dụng? Nếu vậy, thuật toán đó có thể là gì?

Trong tình huống của tôi, lý tưởng nhất là tôi đang tìm cách hỗ trợ cả các hạt giống đơn, cũng như các hạt có hình dạng tùy ý. Thậm chí có thể có hạt có trọng lượng, trong đó khoảng cách đến hạt được điều chỉnh bằng cấp số nhân và / hoặc bộ cộng để tạo ra ảnh hưởng ít nhiều.

Câu trả lời:


7

Câu trả lời nhanh cho câu hỏi cá nhân của bạn

Bạn sẽ làm gì nếu hình ảnh của bạn không cùng kích thước trên mỗi trục?

Bài viết sử dụng hình ảnh vuông với độ dài cạnh là sức mạnh của 2. Điều này để dễ giải thích, nhưng không cần thiết để thuật toán hoạt động. Xem phần 3.1:

Không mất tính tổng quát, chúng ta có thể giả sử n là lũy thừa của 2.

Đó là, giả định này là không bắt buộc để thuật toán hoạt động.

Có thể chạy JFA trên từng trục riêng biệt mà vẫn nhận được kết quả tốt?

Chạy trên mỗi trục riêng biệt có khả năng cho kết quả pixel không chính xác hơn mất nhiều thời gian hơn để chạy trong hầu hết các trường hợp. Trong các trường hợp cực đoan khi một trong các độ dài của hình ảnh nhỏ hơn 8 (số lượng hướng nhảy), có thể nhanh hơn vì thuật toán xử lý 8 hướng đó một cách tuần tự, nhưng đối với bất kỳ hình ảnh rộng hơn nào, việc tách các trục sẽ mất lợi thế khi xử lý chúng song song.

Trong tình huống của tôi, lý tưởng nhất là tôi đang tìm cách hỗ trợ cả các hạt giống đơn, cũng như các hạt có hình dạng tùy ý

Bài viết đề cập đến các hạt có hình dạng tùy ý trong phần 6 dưới tiêu đề "Sơ đồ Voronoi tổng quát":

... Các thuật toán của chúng tôi coi các hạt giống như vậy là các bộ sưu tập các hạt điểm và do đó hy vọng sẽ kế thừa hiệu suất tốt thu được cho các hạt điểm.

Vì vậy, miễn là nó phù hợp với mục đích của bạn để mô hình hóa các hình dạng tùy ý thành các bộ sưu tập pixel, bạn không cần thực hiện bất kỳ điều chỉnh nào cho thuật toán. Đơn giản chỉ cần cung cấp một kết cấu gắn nhãn tất cả các pixel trong một hạt giống có hình dạng tùy ý với cùng số hạt giống, nhưng các vị trí khác nhau.

Thậm chí có thể có hạt có trọng lượng, trong đó khoảng cách đến hạt được điều chỉnh bằng cấp số nhân và / hoặc bộ cộng để tạo ra ảnh hưởng ít nhiều

Đối với "trọng số trên các hạt giống như nhân và phụ gia", bài viết chỉ đề cập đến khả năng chuyển qua trong phần 8, là công việc tiềm năng trong tương lai. Tuy nhiên, điều này nên đơn giản để thực hiện với điều kiện trọng số mong muốn của bạn có thể được bao gồm trong dữ liệu hạt giống được truyền từ pixel sang pixel.

Thuật toán hiện tại vượt qua <s, position(s)>để chỉ định một hạt giống và vị trí của nó và chỉ một hạt giống được lưu trữ trên mỗi pixel tại một thời điểm. Việc mở rộng này để lưu trữ <s, position(s), weight(s)>cung cấp tất cả thông tin cần thiết để cân trọng số của hàm khoảng cách và tính toán xem hạt giống mới được truyền tới một pixel có gần với nó hơn so với hạt giống hiện đang lưu trữ hay không.

Bạn thậm chí có thể bao gồm hai trọng số, một số nhân và một phụ gia, và chỉ cần đặt một số nhân thành 1 và một phụ gia thành 0 khi không cần thiết. Sau đó, thuật toán của bạn sẽ bao gồm khả năng được sử dụng cho các hạt có trọng số nhân, hạt có trọng số cộng hoặc thậm chí là sự kết hợp của cả hai cùng một lúc hoặc một số hạt. Điều này sẽ chỉ cần

<s, position(s), multiplicative(s), additive(s)>

và thuật toán hiện tại sẽ tương đương với thuật toán mới này bằng cách sử dụng

<s, position(s), 1, 0>


Giải thích chi tiết tại sao

đăng nhập()

Thuật toán không cần phải được điều chỉnh cho các độ dài khác nhau

Nếu độ dài cạnh không bằng nhau và không phải là lũy thừa của 2, thì không cần phải điều chỉnh thuật toán. Nó đã xử lý các pixel ở rìa ảnh mà một số hướng nhảy dẫn ra ngoài ảnh. Vì thuật toán đã bỏ qua thông tin hạt giống cho các hướng dẫn bên ngoài hình ảnh, chiều rộng hoặc chiều cao không phải là lũy thừa 2 sẽ không phải là vấn đề. Đối với hình ảnh có chiều rộng W và chiều cao H, kích thước bước nhảy tối đa được yêu cầu sẽ là

2đăng nhập(tối đa(W,H))-1

Đối với trường hợp chiều rộng và chiều cao N bằng nhau, điều này giảm xuống còn

2đăng nhập(N)-1

Trong trường hợp độ dài cạnh N có công suất bằng 2, điều này giảm xuống còn

2đăng nhập(N)-1= =N/2

như được sử dụng trong bài báo.

Nói một cách trực quan hơn, làm tròn chiều dài cạnh tối đa lên tới sức mạnh tiếp theo là 2, và sau đó giảm một nửa để có được kích thước nhảy tối đa.

Điều này luôn đủ để bao phủ mọi pixel trong ảnh từ mọi pixel khác trong ảnh, vì phần bù cho bất kỳ pixel nào sẽ nằm trong phạm vi từ 0 đến N-1 nếu độ dài cạnh dài nhất là N. Kết hợp các lũy thừa của 2 từ 0 đến N / 2 sẽ bao phủ mọi số nguyên lên tới N-1 nếu N là lũy thừa 2 và nếu N không phải là lũy thừa 2 thì phạm vi được bao phủ chỉ có thể lớn hơn yêu cầu, do lấy trần của logarit ( làm tròn đến sức mạnh tiếp theo của 2).

Hình ảnh với các mặt không có sức mạnh bằng 2 sẽ không hiệu quả kém

Số lần nhảy phụ thuộc vào độ dài cạnh dài nhất, giả sử L. Nếu L là lũy thừa bằng 2 thì số lần nhảy là . Nếu L không phải là bằng 2 thì số lần nhảy là . Đối với một hình ảnh lớn hợp lý, điều này sẽ không phải là một sự khác biệt lớn.đăng nhập(L)đăng nhập(L)

Ví dụ: một hình ảnh 1024 x 1024 sẽ yêu cầu 10 lần lặp nhảy. Một hình ảnh 512 x 512 sẽ yêu cầu 9 lần lặp nhảy. Bất cứ điều gì giữa hai kích thước cũng sẽ yêu cầu 10 lần lặp. Ngay cả trong trường hợp xấu nhất của hình ảnh chỉ có công suất 2, như hình ảnh 513 x 513, nó sẽ chỉ yêu cầu thêm 1 lần lặp, với tỷ lệ này cao hơn khoảng 11% (10 thay vì 9).

Hình ảnh không vuông là kém hiệu quả trên mỗi khu vực

Vì số lần lặp được yêu cầu được xác định bởi độ dài cạnh dài nhất, thời gian dành cho hình ảnh 1024 x 1024 sẽ giống như đối với hình ảnh 1024 x 16. Một hình ảnh vuông cho phép một khu vực lớn hơn được bao phủ trong cùng một số lần lặp.

Các trục tách có khả năng làm giảm chất lượng

Phần 5 của bài viết mô tả các lỗi có thể. Mọi pixel có thể truy cập bằng một đường dẫn từ mọi pixel khác, nhưng một số đường dẫn không mang đúng hạt giống gần nhất, do hạt đó không phải là pixel gần nhất với đường dẫn trước đó trong đường dẫn. Một pixel không cho phép hạt giống truyền qua nó được cho là đã "giết" hạt giống đó. Nếu hạt giống gần nhất với pixel bị giết trên tất cả các đường dẫn đến pixel đó, thì pixel đó sẽ ghi lại một số hạt giống khác và sẽ có màu không chính xác trong hình ảnh cuối cùng.

Chỉ có một con đường cần tồn tại mà không giết chết hạt giống để kết quả cuối cùng là chính xác. Màu sắc không chính xác chỉ xảy ra khi tất cả các đường dẫn từ hạt giống chính xác đến một pixel nhất định bị chặn.

Nếu một đường dẫn liên quan đến các bước nhảy ngang và dọc xen kẽ, các trục tách biệt sẽ làm cho đường dẫn này không thể thực hiện được (tất cả các bước nhảy ngang sẽ được thực hiện trước tất cả các bước nhảy thẳng đứng, làm cho không thể xen kẽ). Nhảy chéo sẽ không thể thực hiện được. Vì vậy, bất kỳ đường dẫn thay thế hoặc chứa nhảy chéo sẽ được loại trừ. Mỗi pixel sẽ vẫn có một đường dẫn đến mọi pixel khác, nhưng vì hiện tại có ít đường dẫn hơn nên có nhiều khả năng một pixel nhất định bị chặn nhận hạt giống chính xác, do đó kết quả cuối cùng sẽ dễ bị lỗi hơn.

Việc tách các trục có khả năng làm cho thuật toán mất nhiều thời gian hơn

Hiệu quả có thể sẽ giảm đi bằng cách tách các trục, vì lũ lụt sẽ không còn được thực hiện song song, mà thay vào đó sẽ được lặp lại cho mỗi trục. Đối với 2D, điều này có thể sẽ mất khoảng gấp đôi thời gian và đối với 3D dài gấp khoảng 3 lần.

Điều này có thể được giảm nhẹ bằng cách thiếu các bước nhảy chéo, nhưng tôi vẫn mong đợi sự giảm hiệu quả tổng thể.


1
Tôi đã bắt đầu thử nghiệm một số điều này rồi. Tôi đã thấy rằng việc lấy mẫu trong dấu + (5 lần đọc) thay vì toàn bộ 9 cho thấy không có sự khác biệt nào trong thử nghiệm của tôi, nhưng tôi chắc chắn với các tình huống phức tạp hơn, sẽ có sự khác biệt. Làm một x jfa đầy đủ và sau đó một y jfa đầy đủ sẽ gây ra nhiều lỗi. Tôi sẽ quan tâm để nghe thêm chi tiết / thông tin nếu bạn có nó, nhưng chấp nhận câu trả lời của bạn: P
Alan Wolfe

1
Quên, đây là liên kết đến một trong những thử nghiệm của tôi: shadertoy.com/view/Mdy3D3
Alan Wolfe

Điều thú vị là nó hoạt động rõ ràng cũng chỉ với 5 lần đọc - đặc biệt là vì chúng không thể song song. Vì bài viết liệt kê các trường hợp dẫn đến lỗi, có lẽ bạn có thể cố tình thiết lập các trường hợp này và xem liệu 5 hướng nhảy có còn tốt không.
trichoplax

Âm thanh như bạn đã sẵn sàng để gửi câu trả lời của riêng bạn ...
trichoplax

thông tin của tôi bổ sung cho bạn: P
Alan Wolfe
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.