ตรวจจับแม่น้ำที่คดเคี้ยวในภาพ


14

ฉันมีพื้นผิว:มีแอตทริบิวต์วัด (ตัวแปร) ในแต่ละพื้นผิว:y) ส่วนใหญ่ของพื้นผิวจะมีการกระจายแบบสุ่มของคุณสมบัติทั่วพื้นผิว แต่บางพื้นผิว (ที่น่าสนใจ) จะแสดงรูปแบบแม่น้ำที่คดเคี้ยว:nZผม(x,Y)aผม(x,Y)

ป้อนคำอธิบายรูปภาพที่นี่

ฉันต้องการความช่วยเหลือจากคุณในการวัดที่จะบอกเราว่าพื้นผิวใดของที่น่าจะมีลวดลายดังกล่าวมากที่สุดn

มีแผนที่ที่เป็นไปได้มากมายที่มีฮิสโตแกรมเดียวกันดังแสดงด้านล่าง ดังนั้นการวัดจำเป็นต้อง "ให้รางวัล" ความต่อเนื่องเชิงพื้นที่ เพื่อแสดงสิ่งนี้ฉันได้สร้างภาพสุ่มที่มีฮิสโตแกรมเกือบเท่ากับภาพแม่น้ำ: ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้นสถิติรูปภาพ Ala Entropy อาจเป็นเพียงส่วนหนึ่งของการแก้ปัญหา

นี่คือตัวอย่างของภาพที่ไม่มีรูปแบบของแม่น้ำที่คดเคี้ยว: ป้อนคำอธิบายรูปภาพที่นี่

ภาพของฉันเป็นแบบสังเคราะห์ (ทำใน Matlab) ในชีวิตจริงภาพที่ไม่มีรูปแบบอาจมีความต่อเนื่องเชิงพื้นที่มากกว่าในรูปแบบของหยดเล็ก ๆ ที่มีค่าใกล้เคียงกัน

นี่คือภาพในโทนสีเทา:

ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่


1
คุณสามารถโพสต์ภาพที่เกิดขึ้นจริง (โดยไม่มีแกนจานสีฮิสโตแกรมดังนั้นเราจึงสามารถลองใช้อัลกอริทึมที่แตกต่างกันได้หรือไม่) อีกทั้ง: "แม่น้ำที่คดเคี้ยว" จริง ๆ แล้วเป็นไซน์หรือมีรูปร่างใด ๆ
Niki Estner

1
สวัสดีนิกกี้ ในตัวอย่างของฉัน (ข้อมูลสังเคราะห์ใน Matlab) แม่น้ำเป็นไซน์ ในชีวิตจริงมันเป็น "ไซน์เช่น"; บางครั้งมันกว้างไปจากเส้นกลาง
Andy

คำตอบ:


13

การวัดที่ง่ายมากคือการเปรียบเทียบแต่ละแถวในภาพกับแถวด้านบนทำให้สามารถเลื่อนตามแนวนอนได้

ฉันแฮ็กอัลกอริทึมง่ายๆนี้ใน Mathematica:

Mean[MapThread[
  Function[{line1, line2},
   Min[Table[Norm[line1 - RotateLeft[line2, shift]], {shift, -5, 5}]]
   ], {s[[2 ;;]], s[[;; -2]]}]]

มันใช้เวลาเพียงแถวคู่หนึ่งที่อยู่ติดกันหมุนหนึ่งแถวด้วย -5..5 พิกเซลและใช้ระยะทางแบบยุคลิดเล็กที่สุด สิ่งนี้ให้ผล euclidean ระยะหนึ่งสำหรับแต่ละแถวคู่ ฉันใช้ค่าเฉลี่ย (แต่ขึ้นอยู่กับข้อมูลจริงของคุณค่าเฉลี่ยที่ถูกตัดทอนหรือค่ามัธยฐานอาจมีค่ามากกว่า)

นี่คือผลลัพธ์ที่ฉันได้รับสำหรับตัวอย่างที่สร้างขึ้นเอง (สูตร: ทำให้เป็นมาตรฐาน (เสียงรบกวนแบบสุ่ม * (ปัจจัย 1 ตัว) + สัญญาณ * ปัจจัย)

ป้อนคำอธิบายรูปภาพที่นี่

หากฉันพล็อตผลลัพธ์กับความแรงของสัญญาณอัลกอริทึมดูเหมือนจะวัด "ความแรงของสัญญาณแม่น้ำที่คดเคี้ยว" ค่อนข้างดี:

ป้อนคำอธิบายรูปภาพที่นี่

แก้ไข : ฉันลืมที่จะทำให้ปกติตัวอย่างอินพุต แก้ไขว่ารูปภาพผลลัพธ์ใหม่ที่อัปโหลด


คำตอบที่ดี. อย่างไรก็ตามฉันคิดว่าการวัดของคุณสามารถถูกหลอกได้โดยโค้งต่อเนื่องอื่นเช่นเส้นตรง ฉันจะปรับปรุงให้ดีขึ้นเล็กน้อยโดยการเปลี่ยนขั้นตอนสุดท้ายเพื่อปรับไซน์ให้ตรงกับจุด (x, y) ที่คุณพบด้วยแอมพลิจูดเฟสและความถี่ จากนั้นแอมพลิจูดสามารถใช้เป็นการวัดถึง "ความแรงของแม่น้ำ"
Andrey Rubshtein

4

ดูเหมือนว่าคุณจะอยู่ในตำแหน่งที่ถูกต้องด้วยฮิสโตแกรมนั้น หากนี่คือภาพตัวแทนจากตัวอย่างของคุณฮิสโตแกรมนั้นแสดงให้เห็นว่าภาพที่มีรูปแบบการวกวนอยู่นั้นสามารถตรวจพบได้เพียงแค่ตรวจสอบว่าพวกมันมีค่าที่สูงกว่าเกณฑ์ที่กำหนดหรือไม่

นอกเหนือจากนี้คุณสามารถลองรับความเป็นเอนโทรปีของแต่ละภาพได้ ที่จะให้คุณหนึ่งหมายเลขต่อภาพที่มีลักษณะการสุ่มของมัน หลังจากนั้นคุณสามารถรับฮิสโตแกรมของภาพเอนโทรปีของภาพได้ หากคุณแน่ใจว่าภาพนั้นถูกแบ่งออกเป็น "เต็มเปา - สุ่ม" และ "สุ่ม - กับ - a - คดเคี้ยว" (เช่นสุ่มน้อยกว่า) ฮิสโตแกรมของเอนโทรปีจะเป็น bimodal โหมดด้านซ้ายจะสอดคล้องกับภาพที่มีค่าความเป็นเอนโทรปีต่ำกว่าและมีการสุ่มน้อยลง

(BTW MATLAB มีฟังก์ชั่นที่เกี่ยวข้อง )

แก้ไข: เพื่อเป็นการตอบสนองต่อความคิดเห็น OP และการอัปโหลดข้อมูลเพิ่มเติมเกี่ยวกับปัญหาในภายหลังนี่เป็นจุดเพิ่มเติมสำหรับคำตอบนี้:

เอนโทรปีจะยังคงทำงานได้ แต่ไม่ใช่กรณีที่ไม่มีหน่วยความจำธรรมดาธรรมดาที่อธิบายโดยสูตรของแชนนอน

เป็นทางเลือกที่ง่ายแล้วคุณอาจจะลองตรวจสอบคุณสมบัติของภาพของอัต


สวัสดี A_A ฉันคิดว่าสถิติภาพเป็นส่วนหนึ่งของการแก้ปัญหา แต่เราต้องการน้ำหนักเป็นพิกเซลของเพื่อนบ้านเพื่อให้รางวัลความต่อเนื่องเชิงพื้นที่ (ดูแผนที่ของแอตทริบิวต์แบบสุ่มด้านบน)
Andy

สวัสดีฉันเห็นด้วยและเพิ่มคำตอบ
A_A
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.