พื้นฐานก่อน:
การแบ่งส่วน 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}}  
หรือ:  

ซึ่งคล้ายกับผลลัพธ์ก่อนหน้านี้มาก แต่อย่างที่คุณเห็นตอนนี้เรามีเอาต์พุตเพียงสามระดับเท่านั้น
เฮ้!