ฉันจะวัดความเหมือนระหว่างสองภาพได้อย่างไร? [ปิด]


96

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

มีไลบรารี / เครื่องมือที่ทำเช่นนั้นอยู่แล้วหรือไม่? คุณจะใช้มันอย่างไร?


1
มีคำตอบที่ดีในคำถามอื่นที่คล้ายคลึงกันนี้: stackoverflow.com/questions/75891/…
blak

1
และอื่น ๆ ที่นี่: stackoverflow.com/questions/189943/…
Anoyz

1
ถึงเวลาอัปเดตคำตอบโดยคำนึงถึงความก้าวหน้าล่าสุดใน Machine Learning และโดยเฉพาะอย่างยิ่ง "Deep Learning"
jldupont

ห้องทดลองของฉันก็ต้องแก้ปัญหานี้เช่นกันและใช้ขั้นตอนการทำงานที่อธิบายไว้ที่นี่: douglasduhaime.com/posts/…
duhaime

คำตอบ:


75

สิ่งนี้ขึ้นอยู่กับว่าคุณต้องการให้อัลกอริทึมฉลาดแค่ไหน

ตัวอย่างเช่นนี่คือปัญหาบางประการ:

  • ภาพที่ครอบตัดกับภาพที่ไม่ได้ตัด
  • รูปภาพที่มีการเพิ่มข้อความเทียบกับรูปภาพอื่นที่ไม่มี
  • ภาพมิเรอร์

อัลกอริทึมที่ง่ายและง่ายที่สุดที่ฉันเคยเห็นคือทำตามขั้นตอนต่อไปนี้กับแต่ละภาพ:

  1. ปรับขนาดให้เล็กลงเช่น 64x64 หรือ 32x32 โดยไม่คำนึงถึงอัตราส่วนกว้างยาวใช้อัลกอริทึมการปรับขนาดแบบรวมแทนพิกเซลที่ใกล้ที่สุด
  2. ปรับขนาดช่วงสีให้มืดที่สุดเป็นสีดำและสีอ่อนที่สุดคือสีขาว
  3. หมุนและพลิกภาพเพื่อให้สีที่ใหญ่ที่สุดอยู่ด้านซ้ายบนจากนั้นด้านขวาบนจะเข้มขึ้นถัดไปซ้ายล่างจะเข้มขึ้น (เท่าที่จะทำได้)

แก้ไขขั้นตอนวิธีการปรับรวมเป็นหนึ่งว่าเมื่อปรับ 10 พิกเซลลงไปหนึ่งจะทำโดยใช้ฟังก์ชั่นที่ใช้สีของทุกคน 10 พิกเซลและรวมพวกเขาเข้าไปในหนึ่ง สามารถทำได้โดยใช้อัลกอริทึมเช่นการหาค่าเฉลี่ยค่าเฉลี่ยหรือค่าที่ซับซ้อนมากขึ้นเช่นเส้นแบ่งสองขั้ว

จากนั้นคำนวณระยะทางเฉลี่ยพิกเซลต่อพิกเซลระหว่างสองภาพ

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

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


14
"อัลกอริทึมการปรับขนาดรวม" คืออะไร
Gregg Lind

32

วิธีการวัดแบบ 'คลาสสิก' คือการแบ่งภาพออกเป็นจำนวนส่วนตามมาตรฐาน (เช่นตาราง 10x10) จากนั้นคำนวณฮิสโตแกรมของค่า RGB ภายในแต่ละเซลล์และเปรียบเทียบฮิสโตแกรมที่เกี่ยวข้อง อัลกอริทึมประเภทนี้เป็นที่ต้องการเนื่องจากทั้งความเรียบง่ายและความไม่สอดคล้องกับการปรับขนาดและการแปล (ขนาดเล็ก!)


6
สิ่งนี้ไม่คล้ายกับการทำฮิสโตแกรมเดียวสำหรับทั้งภาพ แต่มีข้อเสียเพิ่มเติมจากการไม่ยืดหยุ่นต่อการสะท้อนและหมุน?
dodgy_coder

2 ฮิสโตแกรมจาก 2 ครึ่งของภาพจะมีความแม่นยำในการจับคู่ดีกว่า 1 ฮิสโตแกรมของทั้งหมด แม้ว่าจะมีข้อเสียที่คุณกล่าวถึง แต่ก็ขึ้นอยู่กับว่าคุณกำลังแก้ปัญหาอะไร
psycho brm

25

ใช้ฮิสโตแกรมสีปกติ (อ่านหัวข้อเกี่ยวกับแอปพลิเคชันที่นี่ ) โดยทั่วไปจะใช้ในระบบดึงข้อมูล / จับคู่ภาพและเป็นวิธีมาตรฐานในการจับคู่ภาพที่มีความน่าเชื่อถือค่อนข้างรวดเร็วและใช้งานง่ายมาก

โดยพื้นฐานแล้วฮิสโตแกรมสีจะจับการกระจายสีของภาพ จากนั้นสามารถเปรียบเทียบกับภาพอื่นเพื่อดูว่าการกระจายสีตรงกันหรือไม่

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

หลีกเลี่ยงการเปรียบเทียบแบบพิกเซลต่อพิกเซลเช่นหากภาพถูกหมุน / เลื่อนเล็กน้อยอาจทำให้มีการรายงานความแตกต่างอย่างมาก

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


14

ไม่อัลกอริทึมการเข้ารหัสวิดีโอเช่น MPEG คำนวณความแตกต่างระหว่างแต่ละเฟรมของวิดีโอเพื่อให้สามารถเข้ารหัสเดลต้าได้หรือไม่? คุณอาจดูว่าอัลกอริทึมการเข้ารหัสวิดีโอคำนวณความแตกต่างของเฟรมเหล่านั้นอย่างไร

ดูแหล่งที่มาเปิดโปรแกรมนี้การค้นหาภาพhttp://www.semanticmetadata.net/lire/ มันอธิบายถึงความคล้ายคลึงกันของภาพหลายประการซึ่งสามในนั้นมาจากมาตรฐาน MPEG-7: ScalableColor, ColorLayout, EdgeHistogram และ Auto Color Correlogram


1
สิ่งนี้จะไม่ตอบคำถามที่นี่ คำถามไม่เกี่ยวกับการเปรียบเทียบพิกเซลต่อพิกเซล
Kousha

@Kousha True แต่ยังคงเป็นทิศทางที่น่าสนใจสำหรับการคิด
ความหมาย - เรื่อง

13

คุณสามารถใช้วิธีการทางคณิตศาสตร์ที่บริสุทธิ์O(n^2)แต่จะมีประโยชน์ก็ต่อเมื่อคุณมั่นใจว่าไม่มีการชดเชยหรืออะไรทำนองนั้น (แม้ว่าคุณจะมีวัตถุสองสามชิ้นที่มีการระบายสีเป็นเนื้อเดียวกันมันก็ยังใช้งานได้ดี)

อย่างไรก็ตามแนวคิดคือการคำนวณผลคูณดอทปกติของเมทริกซ์ทั้งสอง C = sum(Pij*Qij)^2/(sum(Pij^2)*sum(Qij^2)).

สูตรนี้คือ "โคไซน์" ของมุมระหว่างเมทริกซ์ (wierd) ความคล้ายคลึงกันยิ่งมากขึ้น (สมมติว่าPij=Qij) C จะเป็น 1 และถ้ามันแตกต่างกันอย่างสิ้นเชิงให้พูดสำหรับทุกๆi,j Qij = 1(หลีกเลี่ยงการหารศูนย์) Pij = 255สำหรับขนาดnxnยิ่งใหญ่เท่าไหร่nเราก็จะยิ่งเข้าใกล้ศูนย์มากขึ้นเท่านั้น ได้รับ (โดยการคำนวณคร่าวๆ :) C=1/n^2.


8

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


7

คุณสามารถหาวิธีแก้ปัญหาทับทิมได้ที่นี่

จาก readme:

Phashion เป็นกระดาษห่อทับทิมรอบ ๆ ไลบรารี pHash "แฮชการรับรู้" ซึ่งตรวจจับไฟล์มัลติมีเดียที่ซ้ำกันและใกล้เคียงกับไฟล์มัลติมีเดีย


5

วิธีการวัดความคล้ายคลึงกันระหว่างภาพสองภาพนั้นขึ้นอยู่กับสิ่งที่คุณต้องการวัดเช่นความคมชัดความสว่างกิริยาเสียง ... แล้วเลือกการวัดความคล้ายคลึงที่เหมาะสมที่สุดสำหรับคุณ คุณสามารถเลือกจากMAD (ค่าความแตกต่างสัมบูรณ์), MSD (ค่าความแตกต่างกำลังสองเฉลี่ย) ซึ่งเหมาะสำหรับการวัดความสว่าง ... นอกจากนี้ยังมีCR (สัมประสิทธิ์สหสัมพันธ์) ที่ใช้ได้ซึ่งดีในการแสดงความสัมพันธ์ระหว่างสองภาพ นอกจากนี้คุณยังสามารถเลือกจากการวัดความคล้ายคลึงกันตามฮิสโตแกรมเช่นSDH (ค่าเบี่ยงเบนมาตรฐานของฮิสโตแกรมภาพที่แตกต่างกัน) หรือการวัดความคล้ายคลึงกันหลายรูปแบบเช่นMI (ข้อมูลร่วมกัน) หรือNMI (ข้อมูลร่วมที่ทำให้เป็นมาตรฐาน)

เนื่องจากการวัดความคล้ายคลึงกันนี้มีค่าใช้จ่ายค่อนข้างมากจึงขอแนะนำให้ย่อขนาดภาพก่อนที่จะใช้มาตรการเหล่านี้


4

ฉันสงสัย (และฉันก็แค่โยนความคิดออกไปที่นั่นเพื่อที่จะถูกยิงออกไป) หากบางสิ่งได้มาจากการลบภาพหนึ่งภาพออกจากอีกภาพหนึ่งจากนั้นบีบอัดภาพที่ได้เป็น jpeg ของ gif และใช้ขนาดไฟล์เป็น การวัดความคล้ายคลึงกัน

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

อาจไม่ใช่การทดสอบที่ดีที่สุดและอาจช้ากว่าที่จำเป็นมาก แต่อาจใช้งานได้อย่างรวดเร็วและสกปรก


คิดเกี่ยวกับการหมุน 90 องศา ภาพยังคงคล้ายกัน
ความหมาย - เรื่อง

3

คุณอาจดูโค้ดสำหรับเครื่องมือโอเพนซอร์สfindimagedupesแม้ว่าดูเหมือนว่าจะถูกเขียนด้วย perl ดังนั้นฉันไม่สามารถพูดได้ว่าการแยกวิเคราะห์จะง่ายแค่ไหน ...

อ่านหน้า findimagedupes ที่ฉันชอบผมเห็นว่ามีความเป็นC ++ การดำเนินการตามขั้นตอนวิธีการเดียวกัน คงจะเข้าใจง่ายกว่านี้

และดูเหมือนว่าคุณสามารถใช้gqviewได้


2

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

ฉันสงสัยว่าพวกเขามีไลบรารีหรือตัวอย่างโค้ดในบล็อกหรือไม่


1
เทคโนโลยีนี้ ถูกยกเลิก
Joseph Rosson

2

เพื่อขยายความเกี่ยวกับบันทึกของ Vaibhav Huginเป็น 'autostitcher' แบบโอเพ่นซอร์สซึ่งควรมีความเข้าใจในปัญหานี้


2

มีซอฟต์แวร์สำหรับการดึงข้อมูลรูปภาพตามเนื้อหาซึ่งทำ (บางส่วน) ในสิ่งที่คุณต้องการ การอ้างอิงและคำอธิบายทั้งหมดเชื่อมโยงจากไซต์โครงการและยังมีหนังสือข้อความสั้น ๆ (Kindle): LIRE


1

คุณสามารถใช้ Siamese Network เพื่อดูว่าทั้งสองภาพเหมือนหรือแตกต่างกันหรือไม่ตามบทแนะนำนี้ บทช่วยสอนนี้จัดกลุ่มรูปภาพที่คล้ายกันในขณะที่คุณสามารถใช้L2ระยะทางเพื่อวัดความเหมือนของสองภาพ


0

หากนี่เป็นสิ่งที่คุณจะทำเป็นครั้งคราวและไม่จำเป็นต้องทำงานอัตโนมัติคุณสามารถทำได้ในโปรแกรมแก้ไขภาพที่รองรับเลเยอร์เช่น Photoshop หรือ Paint Shop Pro (อาจเป็น GIMP หรือ Paint.Net ด้วย แต่ฉัน ' ฉันไม่แน่ใจเกี่ยวกับสิ่งเหล่านี้) เปิดภาพหน้าจอทั้งสองภาพแล้ววางภาพหนึ่งเป็นเลเยอร์ที่ด้านบนของอีกภาพหนึ่ง เปลี่ยนโหมดการผสมเลเยอร์เป็นความแตกต่างและทุกสิ่งที่เหมือนกันระหว่างทั้งสองจะกลายเป็นสีดำ คุณสามารถย้ายเลเยอร์บนสุดไปรอบ ๆ เพื่อลดความแตกต่างของการจัดแนว


เครื่องมืออีกอย่างที่ทำให้ความแตกต่างประเภทนี้ง่ายมากคือ kaleidoscopeapp.com
Michael Osofsky

0

Beyond Compareมีการเปรียบเทียบแบบพิกเซลต่อพิกเซลสำหรับรูปภาพเช่น

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


@xilpex OP ถาม: มีไลบรารี / เครื่องมือที่ทำเช่นนั้นอยู่แล้วหรือไม่? คำตอบของฉันมีลิงก์ไปยังไลบรารี / เครื่องมือดังกล่าว
emallove

-1

วิธีการระดับพื้นฐานจริงๆที่จะใช้สามารถใช้ทุกสีของพิกเซลและเปรียบเทียบกับสีพิกเซลที่สอดคล้องกันในภาพที่สอง - แต่นั่นอาจเป็นวิธีแก้ปัญหาที่ช้ามาก

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