การเปรียบเทียบภาพ - อัลกอริทึมที่รวดเร็ว


393

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

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

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

คำตอบ:


459

ด้านล่างมีสามวิธีในการแก้ไขปัญหานี้ (และมีอีกหลายวิธี)

  • วิธีแรกคือวิธีมาตรฐานในการมองเห็นคอมพิวเตอร์การจับคู่คีย์พอยท์ สิ่งนี้อาจต้องใช้ความรู้พื้นฐานเพื่อนำไปใช้และอาจช้า

  • วิธีที่สองใช้การประมวลผลภาพระดับประถมศึกษาเท่านั้นและอาจเร็วกว่าวิธีแรกและจะนำไปใช้โดยตรง อย่างไรก็ตามสิ่งที่ได้รับในความเข้าใจนั้นขาดในความทนทาน - การจับคู่ล้มเหลวในภาพที่ปรับสัดส่วนหมุนหรือเปลี่ยนสี

  • วิธีที่สามนั้นรวดเร็วและมีประสิทธิภาพ แต่อาจเป็นวิธีที่ยากที่สุดในการติดตั้ง

การจับคู่ Keypoint

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

ข้อเสียอย่างหนึ่งของการจับคู่จุดสำคัญคือเวลาใช้งานของการปรับใช้ที่ไร้เดียงสา: O (n ^ 2m) โดยที่ n คือจำนวนของจุดสำคัญในแต่ละภาพและ m คือจำนวนภาพในฐานข้อมูล อัลกอริทึมที่ฉลาดบางคนอาจพบว่าการจับคู่ที่ใกล้เคียงที่สุดเร็วขึ้นเช่นควอดทรีหรือการแบ่งพื้นที่ไบนารี


ทางเลือกอื่น: วิธีฮิสโตแกรม

อีกวิธีที่มีประสิทธิภาพน้อยกว่า แต่อาจเร็วกว่าคือการสร้างฮิสโตแกรมฟีเจอร์สำหรับแต่ละภาพและเลือกภาพที่มีฮิสโตแกรมใกล้เคียงกับฮิสโตแกรมของภาพอินพุต ฉันใช้สิ่งนี้เป็น undergrad และเราใช้ฮิสโตแกรมสี 3 สี (แดงเขียวและน้ำเงิน) และฮิสโทแกรมพื้นผิวสองทิศทางและสเกล ฉันจะให้รายละเอียดด้านล่าง แต่ฉันควรทราบว่ามันใช้งานได้ดีสำหรับการจับคู่ภาพเท่านั้นคล้ายกับอิมเมจฐานข้อมูล ปรับขนาดภาพหมุนหรือเปลี่ยนสีใหม่อาจล้มเหลวด้วยวิธีนี้ แต่การเปลี่ยนแปลงเล็กน้อยเช่นการปลูกพืชจะไม่ทำให้อัลกอริทึมแตก

การคำนวณฮิสโทแกรมสีนั้นตรงไปตรงมาเพียงแค่เลือกช่วงสำหรับที่เก็บฮิสโตแกรมของคุณและสำหรับแต่ละช่วงนั้นจะนับจำนวนพิกเซลด้วยสีในช่วงนั้น ตัวอย่างเช่นพิจารณาฮิสโตแกรม "สีเขียว" และสมมติว่าเราเลือก 4 ถังสำหรับฮิสโตแกรมของเรา: 0-63, 64-127, 128-191 และ 192-255 จากนั้นสำหรับแต่ละพิกเซลเราจะดูค่าสีเขียวและเพิ่มจำนวนลงในที่ฝากข้อมูลที่เหมาะสม เมื่อเราทำการบันทึกเสร็จเราจะแบ่งผลรวมของที่เก็บข้อมูลแต่ละอันด้วยจำนวนพิกเซลในภาพทั้งหมดเพื่อให้ได้ฮิสโตแกรมที่ถูกทำให้เป็นมาตรฐานสำหรับช่องสีเขียว

สำหรับฮิสโตแกรมทิศทางพื้นผิวเราเริ่มต้นด้วยการตรวจจับขอบบนภาพ แต่ละจุดขอบมีเวกเตอร์ปกติที่ชี้ไปในทิศทางที่ตั้งฉากกับขอบ เราวัดมุมของเวกเตอร์ปกติเป็นหนึ่งใน 6 ถังระหว่าง 0 และ PI (เนื่องจากขอบมีสมมาตร 180 องศาเราจึงแปลงมุมระหว่าง -PI และ 0 ให้อยู่ระหว่าง 0 และ PI) หลังจากสรุปจำนวนจุดขอบในแต่ละทิศทางแล้วเราจะมีฮิสโตแกรมที่ไม่ทำให้เป็นเส้นปกติซึ่งแสดงทิศทางพื้นผิวซึ่งเราได้ทำการทำให้เป็นปกติโดยการหารที่ฝากข้อมูลแต่ละอันด้วยจำนวนจุดขอบทั้งหมดในภาพ

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

ตอนนี้คุณมี 5 ฮิสโตแกรมสำหรับแต่ละภาพ ในการเปรียบเทียบภาพสองภาพคุณรับค่าสัมบูรณ์ของความแตกต่างระหว่างที่เก็บข้อมูลฮิสโตแกรมแต่ละอันจากนั้นรวมค่าเหล่านี้ ตัวอย่างเช่นในการเปรียบเทียบภาพ A และ B เราจะคำนวณ

|A.green_histogram.bucket_1 - B.green_histogram.bucket_1| 

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


ตัวเลือกที่สาม - ประเด็นสำคัญ + ต้นไม้การตัดสินใจ

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

อัปเดต :

ความผิดพลาดของฉัน - กระดาษ Semantic Texton ไม่ได้เกี่ยวกับการจับคู่ภาพโดยเฉพาะ แต่เป็นการติดฉลากภูมิภาค กระดาษเดิมที่ไม่ตรงกับเป็นหนึ่งในนี้: Keypoint การรับรู้โดยใช้แบบสุ่มต้นไม้ นอกจากนี้เอกสารด้านล่างยังคงพัฒนาความคิดและเป็นตัวแทนของสถานะของศิลปะ (c. 2010):


วิธีฮิสโตแกรมดูเหมือนจะสมเหตุสมผลที่สุด ฉันสมมติว่าคุณสามารถหมุนภาพเพื่อทำสิ่งนี้ได้ทุกด้านในกรณีที่ภาพที่ถูกเปรียบเทียบถูกหมุน (รักษาภาพเดียวกันกับ 4) ขอบคุณ
meade

4
@meade ถูกต้องแล้ว สิ่งอื่นที่ควรพิจารณา: ขึ้นอยู่กับปัญหาของคุณคุณอาจไม่จำเป็นต้องใช้ฮิสโตแกรมทั้ง 5 ตัวในอัลกอริทึมของคุณ การยกเลิกฮิสโตแกรมทิศทางของพื้นผิวจะช่วยให้คุณจับคู่รูปภาพที่หมุนได้ การยกเลิกฮิสโตแกรมมาตรวัดพื้นผิวจะช่วยให้คุณจับคู่รูปภาพที่ปรับขนาดได้ใหม่ คุณจะสูญเสียความสามารถในการเปรียบเทียบความคล้ายคลึงกัน แต่สิ่งนี้อาจไม่เป็นปัญหาขึ้นอยู่กับสถานการณ์ของคุณ นอกจากนี้เนื่องจากข้อมูลการคำนวณพื้นผิวเป็นส่วนหนึ่งของอัลกอริทึมที่มีราคาแพงที่สุดซึ่งจะทำให้อัลกอริทึมของคุณรวดเร็วเช่นกัน
Kyle Simek

@redmoskito: ฉันมีคำถาม คุณจะได้รับค่าตัวเลขของฮิสโตแกรมของสีเขียวได้อย่างไร ดังนั้นคุณสามารถลบมันด้วยฮิสโตแกรมภาพอื่นได้หรือไม่ สมมติว่าเรามีฮิสโตแกรมสีเขียวที่มี 3 พิกเซลเป็นที่เก็บข้อมูล 0-63 และ 5 พิกเซลเป็น 64-127 ค่าใด
แบบไดนามิก

3
@Ikaso ถ้ามันเป็นภาพเดียวกันอย่างยอดเยี่ยมคุณอาจไม่ต้องการใช้อะไรแบบนั้นและลองใช้การเปรียบเทียบ CRC หรือ MD5 อย่างง่าย หากนี่ไม่เพียงพอเช่นมีพิกเซลเดียวที่แตกต่างกันหรือเปลี่ยนแปลงข้อมูลเมตาวิธีฮิสโตแกรมก็เพียงพอเช่นกัน หากภาพของคุณเหมือนกัน แต่หมุนหรือปรับขนาดวิธีฮิสโตแกรมอาจพอเพียง แต่อาจล้มเหลว หากภาพของคุณเปลี่ยนสีคุณต้องใช้อัลกอริธึมตามจุดสนใจ
reox

5
ฉันต้องการที่จะเพิ่มว่าในปัจจุบันมีทางเลือกที่รวดเร็วหลายอย่างสำหรับ SIFT อยู่เช่นตัวตรวจจับ FAST และตัวอธิบายไบนารี (BRIEF, BRISK, ORB, FREAK, BinBoost) เพื่อตั้งชื่อไม่กี่คน การสอนเกี่ยวกับตัวอธิบายไบนารีสามารถดูได้ที่นี่: gilscvblog.wordpress.com/2013/08/26/ …
GilLevi

85

วิธีที่ดีที่สุดที่ฉันรู้คือใช้ Perceptual Hash ดูเหมือนว่าจะมีการนำโอเพนซอร์สที่ดีมาใช้ของแฮชที่:

http://phash.org/

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

phash เสนอแฮชหลายประเภทและสามารถใช้กับรูปภาพเสียงหรือวิดีโอ


ใครที่น่าสนใจในวิธีการนี้สามารถค้นหาการรับรู้ข้อมูลแฮชของ Objective-C โดยลิงก์github.com/ameingast/cocoaimagehashing
Alexey Voitenko

@AlexeyVoitenko สิ่งนี้เข้ากันได้กับแฮชที่สร้างโดย phash.org ในการกำหนดค่าเริ่มต้นหรือไม่
Michael

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

39

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

สำหรับวิธีแก้ปัญหาทั่วไปควรใช้กลยุทธ์หลายวิธี อัลกอริทึมแต่ละอันเหมาะที่สุดสำหรับการแปลงภาพบางประเภทและคุณสามารถใช้ประโยชน์จากมันได้

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

  • file-hash based (md5, sha1, ฯลฯ ) สำหรับการทำซ้ำที่แน่นอน
  • การรับรู้การแฮ็ช (phash) สำหรับภาพที่ได้รับการปรับลด
  • คุณสมบัติตาม (SIFT) สำหรับภาพที่แก้ไข

ฉันมีผลลัพธ์ที่ดีมากกับ phash ความแม่นยำนั้นดีสำหรับภาพที่ได้รับการปรับสภาพ มันไม่ดีสำหรับภาพที่ถูกแก้ไข (รับรู้) (เกรียน, หมุน, ทำมิเรอร์และอื่น ๆ ) ในการจัดการกับความเร็วการแฮชเราต้องใช้แคชดิสก์ / ฐานข้อมูลเพื่อรักษาแฮชของกองหญ้า

สิ่งที่ดีจริงๆเกี่ยวกับ phash คือเมื่อคุณสร้างฐานข้อมูลแฮช (ซึ่งสำหรับฉันคือประมาณ 1,000 ภาพ / วินาที) การค้นหาอาจเร็วมากโดยเฉพาะอย่างยิ่งเมื่อคุณสามารถเก็บฐานข้อมูลแฮชทั้งหมดไว้ในหน่วยความจำ วิธีนี้ค่อนข้างใช้งานได้จริงเนื่องจากแฮชมีเพียง 8 ไบต์

ตัวอย่างเช่นหากคุณมี 1 ล้านภาพก็จะต้องใช้อาร์เรย์ค่าแฮช 64- บิต 1 ล้าน (8 MB) ในซีพียูบางตัวจะเหมาะกับ L2 / L3 cache! ในการใช้งานจริงฉันได้เห็น corei7 เปรียบเทียบที่มากกว่า 1 Giga-hamm / วินาทีมันเป็นเพียงคำถามของแบนด์วิดธ์หน่วยความจำกับ CPU ฐานข้อมูลภาพ 1 พันล้านใช้งานได้จริงบน CPU 64 บิต (จำเป็นต้องใช้ RAM 8GB) และการค้นหาจะไม่เกิน 1 วินาที!

สำหรับภาพที่ถูกปรับเปลี่ยน / ครอบตัดดูเหมือนว่าจะเป็นตัวตรวจจับคุณสมบัติ / จุดเปลี่ยนสำคัญอย่าง SIFT ซึ่งเป็นวิธีที่จะไป SIFT จะสร้างจุดสำคัญที่ดีที่จะตรวจจับการครอบตัด / หมุน / กระจกเป็นต้นอย่างไรก็ตามตัวเปรียบเทียบจะช้ามากเมื่อเทียบกับระยะการแฮ็กที่ใช้โดย phash นี่เป็นข้อ จำกัด ที่สำคัญ มีการเปรียบเทียบที่ต้องทำมากมายเนื่องจากมีตัวบ่งชี้ IxJxK สูงสุดเปรียบเทียบกับการค้นหาภาพหนึ่งภาพ (I = ภาพกองหญ้าแห้ง J, J = จุดสำคัญเป้าหมายต่อภาพกองหญ้า, K = จุดเป้าหมายต่อภาพเข็ม)

เพื่อแก้ไขปัญหาความเร็วฉันลองใช้ phash รอบแต่ละประเด็นที่พบโดยใช้ขนาด / รัศมีของคุณสมบัติเพื่อกำหนดสี่เหลี่ยมผืนผ้าย่อย เคล็ดลับในการทำให้การทำงานเป็นไปด้วยดีนี้คือการเพิ่ม / ลดขนาดรัศมีเพื่อสร้างระดับ sub-rect ที่แตกต่างกัน (ในรูปเข็ม) โดยทั่วไปแล้วระดับแรก (ไม่ปรับสัดส่วน) จะจับคู่ แต่บ่อยครั้งจะใช้เวลาเพิ่มขึ้นเล็กน้อย ฉันไม่แน่ใจ 100% ว่าทำไมสิ่งนี้ถึงใช้ได้ แต่ฉันสามารถจินตนาการได้ว่ามันเปิดใช้งานฟีเจอร์ที่เล็กเกินกว่าที่ phash จะทำงานได้ (phash ลดขนาดภาพลงเหลือ 32x32)

ปัญหาอื่นคือ SIFT จะไม่กระจายจุดสำคัญอย่างเหมาะสม หากมีส่วนของภาพที่มีขอบจำนวนมากจุดสำคัญจะจับกลุ่มที่นั่นและคุณจะไม่ได้รับสิ่งใดในบริเวณอื่น ฉันใช้ GridAdaptedFeatureDetector ใน OpenCV เพื่อปรับปรุงการกระจาย ไม่แน่ใจว่าขนาดกริดที่ดีที่สุดคืออะไรฉันใช้กริดขนาดเล็ก (1x3 หรือ 3x1 ขึ้นอยู่กับการวางแนวของภาพ)

คุณอาจต้องการปรับขนาดภาพหญ้าแห้ง (และเข็ม) ให้มีขนาดเล็กลงก่อนที่จะทำการตรวจจับคุณสมบัติ (ฉันใช้ 210px ตามขนาดสูงสุด) สิ่งนี้จะช่วยลดจุดรบกวนในภาพ (มักเป็นปัญหาสำหรับอัลกอริธึมการมองเห็นของคอมพิวเตอร์) และจะเน้นการตรวจจับด้วยคุณสมบัติที่โดดเด่น

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

เครื่องตรวจจับ keypoint นั้นทำงานได้ดีที่สุดเมื่อมันกลับมาน้อยกว่าจำนวนคุณสมบัติที่คุณต้องการ ตัวอย่างเช่นถ้าคุณขอ 400 และได้รับ 300 คืนมันก็ดี หากคุณได้รับคืน 400 ทุกครั้งอาจต้องมีฟีเจอร์ที่ดีบางอย่างออกมา

ภาพเข็มสามารถมีประเด็นสำคัญน้อยกว่าภาพที่กองหญ้าและยังได้ผลลัพธ์ที่ดี การเพิ่มมากขึ้นไม่จำเป็นต้องทำให้คุณได้กำไรมากเช่น J = 400 และ K = 40 อัตราการตีของฉันอยู่ที่ประมาณ 92% ด้วย J = 400 และ K = 400 อัตราการเข้าชมจะสูงถึง 96% เท่านั้น

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


8

คุณสามารถใช้ค่าแฮชเพื่อค้นหารายการที่ซ้ำกัน

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


7

ฉันมีความคิดซึ่งสามารถทำงานได้และเป็นไปได้อย่างรวดเร็วที่สุด คุณสามารถสุ่มภาพตัวอย่างเพื่อบอกความละเอียด 80x60 หรือเทียบเท่าและแปลงเป็นระดับสีเทา (หลังจากการสุ่มตัวอย่างจะเร็วขึ้น) ประมวลผลภาพทั้งสองที่คุณต้องการเปรียบเทียบ จากนั้นเรียกใช้ผลรวมปกติของความแตกต่างยกกำลังสองระหว่างภาพสองภาพ (ภาพแบบสอบถามและแต่ละภาพจากฐานข้อมูล) หรือดีกว่า Normalized Cross Correlation ซึ่งให้การตอบสนองใกล้เคียงกับ 1 หากภาพทั้งสองมีความคล้ายคลึงกัน จากนั้นหากภาพมีลักษณะคล้ายกันคุณสามารถใช้เทคนิคที่ซับซ้อนยิ่งขึ้นเพื่อตรวจสอบว่าเป็นภาพเดียวกัน เห็นได้ชัดว่าอัลกอริทึมนี้เป็นเชิงเส้นในแง่ของจำนวนภาพในฐานข้อมูลของคุณดังนั้นแม้ว่ามันจะเร็วถึง 10,000 ภาพต่อวินาทีบนฮาร์ดแวร์ที่ทันสมัย หากคุณต้องการความแปรปรวนของการหมุนคุณสามารถคำนวณการไล่ระดับสีที่เด่นชัดสำหรับภาพขนาดเล็กนี้ได้ และจากนั้นระบบพิกัดทั้งหมดสามารถหมุนเป็นแนวตั้งแบบบัญญัติซึ่งจะช้ากว่า และไม่ไม่มีการแปรผันที่นี่

หากคุณต้องการอะไรที่กว้างกว่านี้หรือใช้ฐานข้อมูลขนาดใหญ่ (ล้านรูป) คุณต้องดูทฤษฎีการดึงภาพ (โหลดเอกสารปรากฏขึ้นในช่วง 5 ปีที่ผ่านมา) มีคำแนะนำอื่น ๆ แต่มันอาจ overkill และวิธีฮิสโทแกรมแนะนำจะทำงาน แม้ว่าฉันจะคิดว่าการผสมผสานของวิธีการที่แตกต่างกันจำนวนมากจะดียิ่งขึ้น


7

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

ฉันอยากจะบอกว่าฉันได้ทำการสืบค้นอินเทอร์เน็ตไปทั่วเพื่อพยายามหาทางออกที่ดีที่สุด ฉันยังพัฒนาอัลกอริทึมการตรวจจับขอบของฉันเอง
ฉันได้ประเมินความเร็วและความแม่นยำของรุ่นต่างๆแล้ว รูปภาพของฉันที่มีพื้นหลังสีขาวทำงานได้ดีมากกับการ phashing เช่นredcalxกล่าวว่าฉันแนะนำ phash หรือ ahash อย่าใช้ MD5 Hashing หรือการเข้ารหัสลับอื่นใด ยกเว้นว่าคุณต้องการจับคู่รูปภาพที่ตรงกันเท่านั้น การปรับขนาดหรือการปรับแต่งใด ๆ ที่เกิดขึ้นระหว่างภาพจะทำให้แฮชแตกต่างกัน

สำหรับ phash / ahash ให้ตรวจสอบสิ่งนี้: imagehash

ฉันต้องการขยายการโพสต์ของ * redcalx โดยการโพสต์โค้ดและความแม่นยำของฉัน

สิ่งที่ฉันทำ:

from PIL import Image
from PIL import ImageFilter
import imagehash

img1=Image.open(r"C:\yourlocation")
img2=Image.open(r"C:\yourlocation")
if img1.width<img2.width:
    img2=img2.resize((img1.width,img1.height))
else:
    img1=img1.resize((img2.width,img2.height))
img1=img1.filter(ImageFilter.BoxBlur(radius=3))
img2=img2.filter(ImageFilter.BoxBlur(radius=3))
phashvalue=imagehash.phash(img1)-imagehash.phash(img2)
ahashvalue=imagehash.average_hash(img1)-imagehash.average_hash(img2)
totalaccuracy=phashvalue+ahashvalue

นี่คือผลลัพธ์ของฉันบางส่วน:

item1  item2  totalsimilarity
desk1  desk1       3
desk1  phone1     22
chair1 desk1      17
phone1 chair1     34

หวังว่านี่จะช่วยได้!


6

ฉันเชื่อว่าการลดขนาดของรูปภาพลงเป็นขนาดเกือบไอคอนกล่าวคือขนาด 48x48 แล้วแปลงเป็นเฉดสีเทาจากนั้นรับความแตกต่างระหว่างพิกเซลหรือเดลต้าควรทำงานได้ดี เนื่องจากเรากำลังเปรียบเทียบการเปลี่ยนแปลงสีของพิกเซลมากกว่าสีของพิกเซลจริงจึงไม่สำคัญว่าภาพจะเบาหรือเข้มขึ้นเล็กน้อย การเปลี่ยนแปลงครั้งใหญ่จะเกิดขึ้นเนื่องจากพิกเซลที่มีแสงน้อยเกินไปจะหายไป คุณสามารถใช้สิ่งนี้ข้ามแถวเดียวหรือมากเท่าที่คุณต้องการเพื่อเพิ่มความแม่นยำ อย่างมากคุณต้องมีการลบ 47x47 = 2,209 เพื่อสร้างคีย์ที่เทียบเท่า


3

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

คุณสามารถลองทำให้มันเล็ก ๆ ถ้าหากพวกมันเหมือนกันทำการเปรียบเทียบอีกครั้งกับขนาดที่ใหญ่กว่า - อาจเป็นการผสมผสานระหว่างความเร็วและความแม่นยำที่ดี ...


หากคุณกำลังมองหารายการที่ซ้ำกัน แต่มีรูปแบบ / เมตาดาต้าที่แตกต่างกันคุณสามารถแฮช (เช่น MD5) ของค่าพิกเซลที่แท้จริง Imagemagick เรียกลายเซ็นนี้ (ไม่เกี่ยวข้องกับการเซ็นชื่อเข้ารหัส) คุณสามารถลดได้ก่อนเช่นตัดให้เหลือ 4 บิตต่อพิกเซลเพื่อลดผลกระทบของสิ่งประดิษฐ์ JPEG หรือแปลงเป็นโทนสีเทาเพื่อให้ตรงกับภาพที่ได้รับการเปลี่ยนสีเล็กน้อย
Rena

2

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


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

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