คำตอบอย่างรวดเร็วสำหรับคำถามส่วนตัวของคุณ
คุณจะทำอย่างไรถ้าภาพของคุณมีขนาดไม่เท่ากันในแต่ละแกน
กระดาษใช้ภาพสี่เหลี่ยมจัตุรัสที่มีความยาวด้านข้างเท่ากับกำลังงาน 2 ซึ่งมีไว้เพื่อความสะดวกในการอธิบาย แต่ไม่จำเป็นสำหรับอัลกอริทึมในการทำงาน ดูหัวข้อ 3.1:
เราสามารถสรุปได้ว่า n คือพลังของ 2
นั่นคือสมมติฐานนี้ไม่จำเป็นต้องใช้เพื่อให้อัลกอริทึมในการทำงาน
เป็นไปได้หรือไม่ที่จะเรียกใช้ JFA ในแต่ละแกนแยกจากกันและยังได้ผลลัพธ์ที่ดี?
การวิ่งบนแต่ละแกนแยกกันมีแนวโน้มที่จะให้ผลลัพธ์พิกเซลที่ไม่ถูกต้องมากขึ้นและใช้เวลานานกว่าในกรณีส่วนใหญ่ ในกรณีที่รุนแรงที่สุดที่ความยาวด้านหนึ่งของภาพน้อยกว่า 8 (จำนวนทิศทางการกระโดด) มันอาจเร็วกว่าเมื่ออัลกอริทึมปฏิบัติกับ 8 ทิศทางเหล่านั้นตามลำดับ แต่สำหรับภาพที่กว้างขึ้นการแยกแกนสูญเสียข้อดีของการรักษา ในแบบคู่ขนาน.
ในสถานการณ์ของฉันฉันกำลังมองหาที่จะสนับสนุนทั้งเมล็ดจุดเดียวเช่นเดียวกับเมล็ดรูปทรงโดยพลการ
กระดาษกล่าวถึงเมล็ดที่มีรูปร่างตามอำเภอใจในส่วนที่ 6 ภายใต้หัวข้อย่อย "แผนภาพ Voronoi ทั่วไป":
... อัลกอริทึมของเราปฏิบัติต่อเมล็ดพันธุ์ทั่วไปเช่นชุดของเมล็ดจุดและคาดว่าจะสืบทอดประสิทธิภาพที่ดีที่ได้รับสำหรับเมล็ดพันธุ์จุด
ดังนั้นหากมันเหมาะสมกับวัตถุประสงค์ของคุณในการสร้างแบบจำลองรูปร่างโดยพลการเป็นชุดของพิกเซลคุณไม่จำเป็นต้องทำการปรับเปลี่ยนอัลกอริทึม เพียงฟีดในพื้นผิวที่ป้ายพิกเซลทั้งหมดในเมล็ดที่มีรูปร่างตามอำเภอใจด้วยหมายเลขเมล็ดเดียวกัน แต่สถานที่ที่แตกต่างกัน
อาจมีน้ำหนักเมล็ดที่ระยะห่างจากเมล็ดถูกปรับโดยตัวคูณและ / หรือแอดเดอร์เพื่อให้มีอิทธิพลมากขึ้นหรือน้อยลง
สำหรับ "การถ่วงน้ำหนักบนเมล็ดพืชเช่นการคูณและการเติม" กระดาษกล่าวถึงความเป็นไปได้ในการผ่านในส่วนที่ 8 ซึ่งเป็นงานที่มีศักยภาพในอนาคต อย่างไรก็ตามสิ่งนี้ควรตรงไปตรงมาเพื่อนำไปใช้หากน้ำหนักที่คุณต้องการสามารถรวมอยู่ในข้อมูลเมล็ดที่ส่งผ่านจากพิกเซลเป็นพิกเซล
อัลกอริทึมปัจจุบันผ่าน<s, position(s)>
ไปเพื่อระบุเมล็ดและตำแหน่งของมันและมีเพียงหนึ่งเมล็ดจะถูกเก็บไว้ต่อพิกเซลในเวลาใดก็ได้ การขยายส่วนนี้เพื่อจัดเก็บ<s, position(s), weight(s)>
ข้อมูลทั้งหมดที่จำเป็นต่อการชั่งน้ำหนักฟังก์ชั่นระยะทางและคำนวณว่าเมล็ดพันธุ์ใหม่ที่ส่งผ่านไปยังพิกเซลนั้นอยู่ใกล้กับพิกเซลมากกว่าที่เป็นอยู่ในปัจจุบันหรือไม่
คุณสามารถรวมสองน้ำหนักหนึ่งคูณและหนึ่งเสริมและเพียงแค่ตั้งค่าคูณหนึ่งเป็น 1 และหนึ่งบวกเป็น 0 เมื่อไม่จำเป็น จากนั้นอัลกอริทึมของคุณจะรวมถึงความเป็นไปได้ที่จะใช้สำหรับเมล็ดที่มีน้ำหนักแบบทวีคูณเมล็ดที่มีน้ำหนักแบบเสริมหรือแม้กระทั่งการรวมกันของทั้งสองอย่างในคราวเดียวหรือบางส่วน แค่นี้ก็คงต้อง
<s, position(s), multiplicative(s), additive(s)>
และอัลกอริทึมปัจจุบันจะเทียบเท่ากับอัลกอริทึมใหม่นี้โดยใช้
<s, position(s), 1, 0>
คำอธิบายโดยละเอียดว่าทำไม
เช่นเดียวกับในกระดาษการใช้ทั้งหมดของ เข้าสู่ระบบ( ) อ้างถึงลอการิทึมฐาน 2
อัลกอริทึมไม่จำเป็นต้องปรับให้เหมาะกับความยาวด้านที่แตกต่างกัน
หากความยาวด้านไม่เท่ากันและไม่ใช่พลังของ 2 ไม่จำเป็นต้องปรับเปลี่ยนอัลกอริทึม มันเกี่ยวข้องกับพิกเซลที่ขอบของรูปภาพซึ่งทิศทางการข้ามบางอย่างนำไปสู่นอกรูปภาพ เนื่องจากอัลกอริทึมได้ละเว้นข้อมูลเมล็ดพันธุ์สำหรับเส้นทางที่นำไปสู่นอกภาพความกว้างหรือความสูงที่ไม่ใช่กำลัง 2 จะไม่เป็นปัญหา สำหรับภาพความกว้าง W และความสูง H ขนาดการกระโดดสูงสุดที่ต้องการจะเป็น
2⌈ บันทึก( สูงสุด( W), ช) ) ⌉ - 1
สำหรับกรณีที่มีความกว้างและความสูงเท่ากัน N จะลดลง
2⌈ บันทึก( N) ⌉ - 1
ในกรณีที่มีความยาวด้าน N ซึ่งเป็นกำลัง 2 มันจะลดลง
2เข้าสู่ระบบ( N) - 1= N/ 2
ตามที่ใช้ในกระดาษ
ในแง่ง่ายยิ่งขึ้นให้ปัดความยาวด้านสูงสุดขึ้นเป็นกำลังสองถัดไปจากนั้นลดครึ่งหนึ่งเพื่อให้ได้ขนาดกระโดดสูงสุด
ซึ่งเพียงพอที่จะครอบคลุมทุกพิกเซลในภาพจากทุกพิกเซลในภาพเนื่องจากออฟเซ็ตไปยังพิกเซลใด ๆ จะอยู่ในช่วง 0 ถึง N-1 หากความยาวด้านที่ยาวที่สุดคือ N การรวมกันของ 2 0 ถึง N / 2 จะครอบคลุมจำนวนเต็มทุกค่าสูงสุดถึง N-1 ถ้า N เป็นกำลัง 2 และถ้า N ไม่ใช่พลัง 2 ช่วงครอบคลุมจะใหญ่กว่าที่ต้องการได้เพียงเนื่องจากเพดานของลอการิทึม ( การปัดเศษขึ้นเป็นกำลังต่อไปของ 2)
รูปภาพที่มีด้านข้างไม่ใช่กำลัง 2 จะไม่ลดลงอย่างมาก
จำนวนของการกระโดดขึ้นอยู่กับความยาวของด้านที่ยาวที่สุดพูดลิตรถ้า L เป็นอำนาจของ 2 แล้วจำนวนกระโดดเป็น(L) ถ้า L ไม่ได้เป็นอำนาจของ 2 แล้วจำนวนกระโดดเป็น\สำหรับภาพที่มีขนาดใหญ่พอสมควรจะไม่แตกต่างกันมากเข้าสู่ระบบ( L )⌈ บันทึก( L ) ⌉
ตัวอย่างเช่นภาพ 1024 x 1024 จะต้องมีการกระโดดซ้ำ 10 ครั้ง รูปภาพขนาด 512 x 512 จะต้องมีการวนซ้ำ 9 ครั้ง สิ่งใดระหว่างสองขนาดจะต้องมีการซ้ำ 10 ครั้ง แม้ในกรณีที่เลวร้ายที่สุดของภาพเพียงแค่กำลัง 2 เท่านั้นเช่น 513 x 513 ภาพมันจะต้องใช้การวนซ้ำเพิ่มอีก 1 ครั้งเท่านั้นซึ่งในระดับนี้จะเพิ่มขึ้นประมาณ 11% (10 แทนที่จะเป็น 9)
รูปภาพที่ไม่ใช่รูปสี่เหลี่ยมจัตุรัสมีประสิทธิภาพต่อพื้นที่น้อยกว่า
เนื่องจากจำนวนการวนซ้ำที่ต้องการนั้นถูกกำหนดโดยความยาวด้านที่ยาวที่สุดเวลาที่ใช้สำหรับ 1024 ถึง 1024 ภาพจะเท่ากับสำหรับ 1024 ถึง 16 ภาพ ภาพสี่เหลี่ยมจัตุรัสอนุญาตให้ครอบคลุมพื้นที่ขนาดใหญ่กว่าในจำนวนการวนซ้ำที่เท่ากัน
แกนแยกมีแนวโน้มที่จะลดคุณภาพ
ส่วนที่ 5 ของบทความอธิบายถึงข้อผิดพลาดที่อาจเกิดขึ้น ทุกพิกเซลสามารถเข้าถึงได้โดยเส้นทางจากพิกเซลอื่น ๆ แต่บางเส้นทางไม่สามารถนำเมล็ดที่ใกล้ที่สุดมาใช้ได้เนื่องจากเมล็ดนั้นไม่ได้ใกล้เคียงกับพิกเซลก่อนหน้าในเส้นทาง พิกเซลที่ไม่อนุญาตให้มีการแพร่กระจายเมล็ดพันธุ์ในอดีตมันถูกกล่าวว่ามี "ฆ่า" เมล็ดนั้น หากเมล็ดที่ใกล้ที่สุดไปยังพิกเซลถูกฆ่าในทุกเส้นทางไปยังพิกเซลนั้นพิกเซลจะบันทึกเมล็ดพันธุ์อื่นและจะมีสีที่ไม่ถูกต้องในภาพสุดท้าย
มีเพียงหนึ่งพา ธ ที่ต้องมีอยู่ซึ่งไม่ได้ฆ่าเมล็ดเพื่อให้ผลลัพธ์สุดท้ายถูกต้อง สีที่ไม่ถูกต้องเกิดขึ้นเฉพาะเมื่อเส้นทางทั้งหมดจากเมล็ดที่ถูกต้องไปยังพิกเซลที่กำหนดจะถูกบล็อก
หากเส้นทางเกี่ยวข้องกับการสลับการกระโดดในแนวนอนและแนวตั้งการแยกแกนจะทำให้เส้นทางนี้เป็นไปไม่ได้ (การกระโดดข้ามแนวนอนทั้งหมดจะต้องดำเนินการก่อนการกระโดดแนวตั้งทั้งหมดทำให้การสลับเป็นไปไม่ได้) การกระโดดในแนวทแยงจะไม่สามารถทำได้เลย ดังนั้นเส้นทางใดก็ตามที่มีการสลับหรือมีการข้ามในแนวทแยงจะถูกแยกออก พิกเซลทุกพิกเซลจะยังคงมีเส้นทางไปสู่พิกเซลอื่น ๆ ทั้งหมด แต่เนื่องจากขณะนี้มีเส้นทางน้อยลงจึงมีโอกาสที่พิกเซลที่กำหนดจะถูกบล็อกไม่ให้รับเมล็ดที่ถูกต้องดังนั้นผลลัพธ์สุดท้ายจะเกิดข้อผิดพลาดได้ง่ายขึ้น
การแยกแกนจะทำให้อัลกอริทึมใช้เวลานานขึ้น
ประสิทธิภาพอาจจะลดลงโดยการแยกแกนเนื่องจากน้ำท่วมจะไม่ทำแบบขนานอีกต่อไป แต่จะทำซ้ำสำหรับแต่ละแกนแทน สำหรับ 2D สิ่งนี้น่าจะใช้เวลาประมาณสองเท่าและสำหรับ 3D ประมาณ 3 เท่านาน
นี่อาจลดลงบ้างจากการกระโดดข้ามเส้นทแยงมุม แต่ฉันก็ยังคาดหวังว่าประสิทธิภาพโดยรวมจะลดลง