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 và 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⌈ log( 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⌈ log( 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 )⌈ log( 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ể.