พื้นฐานก่อน:
การแบ่งส่วน Mean Shift เป็นเทคนิคการทำให้เป็นเนื้อเดียวกันเฉพาะที่ซึ่งมีประโยชน์มากสำหรับการลดทอนการแรเงาหรือความแตกต่างของโทนสีในวัตถุที่แปลเป็นภาษาท้องถิ่น ตัวอย่างดีกว่าหลาย ๆ คำ:
การดำเนินการ: แทนที่แต่ละพิกเซลด้วยค่าเฉลี่ยของพิกเซลในย่าน range-r และมีค่าอยู่ภายในระยะทาง d
ค่าเฉลี่ยกะมักจะใช้ 3 อินพุต:
- ฟังก์ชันระยะทางสำหรับการวัดระยะทางระหว่างพิกเซล โดยปกติจะเป็นระยะทางแบบยุคลิด แต่สามารถใช้ฟังก์ชันระยะทางอื่น ๆ ที่กำหนดไว้อย่างดีได้ แมนฮัตตันระยะทางเป็นอีกหนึ่งทางเลือกที่มีประโยชน์บางครั้ง
- รัศมี พิกเซลทั้งหมดที่อยู่ในรัศมีนี้ (วัดตามระยะทางด้านบน) จะถูกนำมาคำนวณ
- ความแตกต่างของมูลค่า จากพิกเซลทั้งหมดภายในรัศมี r เราจะใช้เฉพาะพิกเซลที่มีค่าอยู่ในความแตกต่างนี้ในการคำนวณค่าเฉลี่ย
โปรดทราบว่าอัลกอริทึมไม่ได้กำหนดไว้อย่างชัดเจนที่เส้นขอบดังนั้นการใช้งานที่แตกต่างกันจะให้ผลลัพธ์ที่แตกต่างกัน
ฉันจะไม่ได้หารือเกี่ยวกับรายละเอียดทางคณิตศาสตร์ที่เต็มไปด้วยเลือดที่นี่ที่พวกเขาเป็นไปไม่ได้ที่จะแสดงได้โดยไม่ต้องสัญกรณ์คณิตศาสตร์ที่เหมาะสมไม่สามารถใช้ได้ใน StackOverflow และยังเพราะพวกเขาสามารถพบได้จากแหล่งที่ดีอื่น ๆ
ลองดูที่ศูนย์กลางของเมทริกซ์ของคุณ:
153 153 153 153
147 96 98 153
153 97 96 147
153 153 147 156
ด้วยตัวเลือกที่เหมาะสมสำหรับรัศมีและระยะทางพิกเซลกลางทั้งสี่จะได้รับค่า 97 (ค่าเฉลี่ย) และจะแตกต่างจากพิกเซลที่อยู่ติดกัน
ลองคำนวณในMathematica แทนที่จะแสดงตัวเลขจริงเราจะแสดงรหัสสีเพื่อให้เข้าใจสิ่งที่เกิดขึ้นได้ง่ายขึ้น:
การเข้ารหัสสีสำหรับเมทริกซ์ของคุณคือ:
จากนั้นเราทำการกะค่าเฉลี่ยที่สมเหตุสมผล:
MeanShiftFilter[a, 3, 3]
และเราได้รับ:
โดยที่องค์ประกอบตรงกลางทั้งหมดมีค่าเท่ากัน (ถึง 97, BTW)
คุณอาจทำซ้ำหลาย ๆ ครั้งด้วย Mean Shift โดยพยายามให้สีเป็นเนื้อเดียวกันมากขึ้น หลังจากทำซ้ำสองสามครั้งคุณจะมาถึงการกำหนดค่าที่ไม่เสถียรของ isotropic:
ในตอนนี้ควรระบุให้ชัดเจนว่าคุณไม่สามารถเลือกจำนวน "สี" ได้หลังจากใช้ Mean Shift แล้ว มาดูวิธีทำกันดีกว่าเพราะนั่นคือส่วนที่สองของคำถามของคุณ
สิ่งที่คุณจะต้องมีความสามารถที่จะกำหนดจำนวนของกลุ่มส่งออกล่วงหน้าเป็นสิ่งที่ต้องการKmeans การจัดกลุ่ม
มันทำงานในลักษณะนี้สำหรับเมทริกซ์ของคุณ:
b = ClusteringComponents[a, 3]
{{1, 1, 1, 1, 1, 1, 1, 1},
{1, 2, 2, 3, 2, 3, 3, 1},
{1, 3, 3, 3, 3, 3, 3, 1},
{1, 3, 2, 1, 1, 3, 3, 1},
{1, 3, 3, 1, 1, 2, 3, 1},
{1, 3, 3, 2, 3, 3, 3, 1},
{1, 3, 3, 2, 2, 3, 3, 1},
{1, 1, 1, 1, 1, 1, 1, 1}}
หรือ:
ซึ่งคล้ายกับผลลัพธ์ก่อนหน้านี้มาก แต่อย่างที่คุณเห็นตอนนี้เรามีเอาต์พุตเพียงสามระดับเท่านั้น
เฮ้!