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


20

ฉันมีรูปภาพมากกว่า 10,000 ภาพซึ่งมีประมาณ 2000 ซ้ำในรูปแบบอื่น (เช่นใน JPEG, PNG, GIF) ตัวเลขทั้งสองนี้เพิ่มขึ้นทุกวัน ฉันต้องการลบรายการที่ซ้ำกันเหล่านั้นและเพื่อที่ฉันจะต้องรู้วิธีค้นหาพวกเขาก่อน

ความคิดแรกของฉันคือการตรวจสอบพิกเซลภาพและค้นหารูปภาพอื่นที่มีพิกเซลสีเดียวกันในพิกัดเดียวกัน แต่ตัวเลือกนี้ไม่ได้ผลเสมอไป สมมติว่าฉันค้นหาซ้ำ สำหรับวัตถุที่ค้นหาได้ฉันเลือกไฟล์ PNG 8 บิต มันจะค้นหาภาพที่ซ้ำกันทั้งหมด แต่มีเพียง PNG 8 บิตบางครั้ง 8 บิต GIF และ JPEG น้อยมาก (เพราะอัลกอริทึมภาพที่ฉันคิดว่า?)

ความคิดที่สองของฉันคือการทำซ้ำรูปภาพเหล่านั้นทั้งหมดและเปลี่ยนสีใหม่ในจานสีสองสีที่เข้มงวด (สมมติว่าขาวดำ) และทำการสแกนแบบเดียวกันตามที่ระบุข้างต้น ภาพ JPEG อีกครั้งไม่เหมือน 100% กับรูปแบบ PNG หรือ GIF (เหมือนเหตุผลด้านบนใช่หรือไม่)

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

ความคิดใด ๆ



รูปแบบที่มีการบีบอัดแบบ lossy จะนำไปสู่ภาพที่ไม่เหมือน 100% กับเวอร์ชั่นที่ไม่มีความชัดเจน คุณต้องมียูทิลิตี commandline หรือคุณสามารถเรียกใช้โปรแกรม gui ที่ให้คำแนะนำแล้วแสดงภาพที่มี> 90% พิกเซลที่คล้ายกัน (คำนวณค่าเบี่ยงเบนเฉลี่ย) (และแน่นอนขนาดพิกเซลควรจะเหมือนกันในรูปแบบใด)
Thorsten Müller


1
จะมีชื่อไฟล์เท่าไหร่ แต่มีนามสกุลต่างกัน
JeffO

4
คำตอบที่เป็นประโยชน์ที่ไม่ต้องใช้เวลาในการเข้ารหัสนานหลายสัปดาห์: stackoverflow.com/questions/596262/…
mac

คำตอบ:


17

การรับรู้แฮชอาจเป็นคำตอบ:

http://www.phash.org/

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


9
  1. ตรวจสอบขนาด หากภาพ = = แตกต่างกันจะไม่เหมือนกัน
  2. ตรวจสอบรูปแบบ หากเหมือนกัน => ทำการเปรียบเทียบที่แม่นยำพิกเซลต่อพิกเซล
  3. หากรูปแบบที่แตกต่างกันทำสิ่งนี้:

อย่าเปรียบเทียบ RGB (แดง, เขียว, น้ำเงิน) เปรียบเทียบความสว่างเท่ากับน้ำหนักเพียงครึ่งหนึ่งและเปรียบเทียบสี / เฉดสีกับอีกครึ่งหนึ่ง (หรือ 2 / 3rds เทียบกับ 1 / 3rd) คำนวณความแตกต่างในค่าและขึ้นอยู่กับค่า 'ความอดทน' พวกเขาจะเหมือนกันหรือไม่

JPEG บีบอัดข้อมูลสีอย่างหนัก แต่พยายามไม่ทำลายค่าลิมิต


6

เมื่อฉันทำการคัดกรองภาพหลายภาพมาเป็นเวลาหลายปีที่ผ่านมาฉันพบว่าการลดทุกอย่างให้เป็นภาพขนาดย่อ 8x8 แล้วคำนวณคะแนนความคล้ายคลึงกันโดยอิงตามกำลังสองของระยะทาง โปรดทราบว่าคุณสามารถเก็บภาพขนาดย่อจำนวน 8x8 จำนวนมากในหน่วยความจำ

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

นอกจากนี้ยังมีประสิทธิภาพในการจับภาพที่ซ้ำซ้อนยกเว้นบางคนลดความละเอียดหรือคุณภาพในภาพเดียวเพื่อลดขนาดไฟล์


1
โดยทั่วไปแล้ว YUV นั้นดีกว่า RGB ไม่ไวต่อการเปลี่ยนแปลงเล็กน้อยของความสมดุลของสี
Martin Beckett

เทคนิคภาพขนาดย่อเพื่อเลือกการจับคู่ที่เป็นไปได้นั้นถูกต้อง YUV เป็นระบบสัมผัสที่ดีและฉันเห็นว่ามันกลายเป็นแผนที่ความส่องสว่างที่บริสุทธิ์ด้วยเหตุผลเดียวกัน
Patrick Hughes

@ มาร์ตินเบ็คเก็ตต์: ผลรวมของความแตกต่างของ RGB เป็นสิ่งแรกที่ฉันพยายามและมันก็ทำงานได้ดีพอที่ฉันไม่ได้พยายามที่จะปรับปรุง - และในตอนนั้นมันก็จับคู่กับการแก้ไข ด้วยคำจำกัดความที่เข้มงวดของ dupe มันดีพอที่ฉันจะปล่อยให้มันลบอัตโนมัติ
Loren Pechtel

@ Loren ถ้าพวกเขาแก้ไขพิกเซลเล็กน้อยของภาพเดียวกันที่ควรจะทำงาน เป็นเพียงสิ่งต่าง ๆ เช่น jpeg ทำให้ RGB ยุ่งเหยิงมากกว่าพื้นที่สี YUV เพียงปลาย ;-)
Martin Beckett

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

1

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

วิธีที่เป็นไปได้อาจเป็นเช่นนี้: แบ่งภาพในโซนต่างๆ สแกนสีและ / หรือความสว่างเฉลี่ยของโซนเพื่อเปรียบเทียบภาพสองภาพเพื่อดูภาพที่เหมือนกัน

ถ้ามากกว่าพูด 90% ของโซนตรงกันคุณเลือกหนึ่งรายการเพื่อย้ายไปยังรายการตัวเลือกการลบ วิธีนี้คุณจะมีรายชื่อผู้สมัคร คุณสามารถใช้อัตราส่วนภาพเพื่อจัดหมวดหมู่รูปภาพในภาพแนวนอนและแนวตั้งเพื่อเร่งการเปรียบเทียบ วิธีนี้คุณสามารถชดเชยอัลกอริธึมที่สูญเสียซึ่งไม่ได้สร้างพิกเซลสีที่ถูกต้องทีละพิกเซล คุณรันโปรแกรมในชั่วข้ามคืนและในตอนเช้าคุณทำเสร็จแล้ว :) ใน. Net สิ่งนี้สามารถทำได้อย่างง่ายดายด้วย GDI + lib

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