ลายนิ้วมือของภาพเพื่อเปรียบเทียบความเหมือนของหลาย ๆ ภาพ


96

ฉันต้องการสร้างลายนิ้วมือของภาพจำนวนมาก (ที่มีอยู่ประมาณ 100.000 ภาพใหม่ 1,000 ภาพต่อวัน RGB JPEG ขนาดสูงสุด 800x800) เพื่อเปรียบเทียบทุกภาพกับภาพอื่น ๆ เร็วมาก ฉันไม่สามารถใช้วิธีการเปรียบเทียบแบบไบนารีได้เนื่องจากภาพที่ใกล้เคียงกันควรได้รับการยอมรับ

ดีที่สุดคือไลบรารีที่มีอยู่ แต่คำแนะนำบางอย่างเกี่ยวกับอัลกอริทึมที่มีอยู่จะช่วยฉันได้มาก


1
ภาษาที่ห้องสมุดควรใช้?
Ben S

คำตอบ:


57

อัลกอริธึมการคำนวณการแฮชหรือ CRC แบบปกติใช้ไม่ได้กับข้อมูลรูปภาพ ต้องคำนึงถึงลักษณะมิติของข้อมูลด้วย

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

วิธีแก้ปัญหาง่ายๆสองสามอย่างเป็นไปได้:

  1. สร้างฮิสโตแกรมความส่องสว่างสำหรับภาพเป็นลายนิ้วมือ
  2. สร้างภาพแต่ละรุ่นที่ลดขนาดลงเป็นลายนิ้วมือ
  3. รวมเทคนิค (1) และ (2) เข้ากับแนวทางแบบผสมผสานเพื่อปรับปรุงคุณภาพการเปรียบเทียบ

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

การใช้รูปภาพที่ปรับขนาดเป็นอีกวิธีหนึ่งในการลดความหนาแน่นของข้อมูลให้อยู่ในระดับที่ง่ายต่อการเปรียบเทียบ การลดลงต่ำกว่า 10% ของขนาดภาพต้นฉบับโดยทั่วไปจะสูญเสียข้อมูลมากเกินไปที่จะใช้งานได้ดังนั้นภาพขนาด 800x800 พิกเซลจึงสามารถลดขนาดลงเหลือ 80x80 และยังให้ข้อมูลเพียงพอสำหรับการพิมพ์ลายนิ้วมือที่เหมาะสม ซึ่งแตกต่างจากข้อมูลฮิสโตแกรมคุณต้องทำการปรับขนาดของข้อมูลภาพแบบแอนไอโซโทรปิกเมื่อความละเอียดของแหล่งที่มามีอัตราส่วนภาพที่แตกต่างกัน กล่าวอีกนัยหนึ่งการลดขนาดภาพ 300x800 ลงในภาพขนาดย่อ 80x80 ทำให้ภาพเสียรูปดังนั้นเมื่อเปรียบเทียบกับภาพขนาด 300x500 (ซึ่งคล้ายกันมาก) จะทำให้เกิดผลลบที่ผิดพลาด ลายนิ้วมือของภาพขนาดย่อมักจะสร้างเชิงลบที่ผิดพลาดเมื่อเกี่ยวข้องกับการแปลงความสัมพันธ์ หากคุณพลิกหรือหมุนภาพ

การรวมเทคนิคทั้งสองเป็นวิธีที่เหมาะสมในการป้องกันความเสี่ยงการเดิมพันของคุณและลดโอกาสที่จะเกิดขึ้นทั้งผลบวกเท็จและผลลบเท็จ


เกี่ยวกับ CRC เห็นด้วย อย่างไรก็ตามหากต้องการใช้ควรใช้แฮช MD5 ดีกว่า CRC32
mloskot

6
คุณคงไม่อยากใช้ MD5 เพราะเป็นแฮชการเข้ารหัสทางเดียว คุณต้องใช้วิธีแฮชที่จะให้ผลลัพธ์ที่คล้ายกันสำหรับอินพุตที่คล้ายกันเพื่อให้คุณสามารถเปรียบเทียบความแตกต่างระหว่างแฮชได้โดยตรง
AJ Quick

ฉันคิดว่าสิ่งนี้เรียกว่าการแฮชที่
คำนึงถึงท้องถิ่น

34

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

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

ถ้าคุณหาผลคูณของ dot product ของเวกเตอร์ปกติสองตัวนั้นมันจะช่วยให้คุณมีค่าความเหมือนโดยที่ 1 เกือบจะเหมือนกัน ผมโพสต์ข้อมูลเพิ่มเติมมากกว่าที่นี่


20

คุณควรดูที่phashอย่างแน่นอน

สำหรับการเปรียบเทียบภาพมีโครงการphpนี้: https://github.com/kennethrapp/phasher

และโคลนจาวาสคริปต์ตัวน้อยของฉัน: https://redaktor.me/phasher/demo_js/index.html

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


นี่คือ npm ใช่ไหม ฉันกำลังมองหาวิธีเปรียบเทียบความคล้ายคลึงกันระหว่างสองภาพโดยใช้ javascript
chovy

อืมฉันคิดว่า "ถูกสำหรับ npm" มันเป็นเพียงการสาธิตที่เขียนขึ้นอย่างรวดเร็วตั้งแต่เริ่มต้น อย่างไรก็ตามอย่าลังเลที่จะทำสิ่งที่คุณต้องการกับแหล่งที่มา ถ้าทำได้ฉันจะดูทีหลังและส่งไปที่ github github.com/redaktor ...
sebilasse

@SebastianLasse ฉันเพิ่งตรวจสอบพอร์ต JS ของคุณและมันยอดเยี่ยมมาก! ฉันหวังว่าคุณจะสามารถส่ง URI รูปภาพไปยังCompare()ฟังก์ชันแทนที่จะต้องดาวน์โหลดรูปภาพก่อน นอกจากนี้จากการทดสอบของฉันเกณฑ์สำหรับ "รูปภาพที่คล้ายกันมาก" ควรเป็น> 90% ไม่ใช่> 98%
thdoan

12

เมื่อนานมาแล้วฉันทำงานกับระบบที่มีลักษณะคล้ายกันและนี่คือการประมาณอัลกอริทึมที่เราติดตาม:

  1. แบ่งภาพออกเป็นโซน ในกรณีของเราเรากำลังจัดการกับวิดีโอความละเอียด 4: 3 ดังนั้นเราจึงใช้ 12 โซน การทำเช่นนี้จะทำให้ความละเอียดของภาพต้นฉบับออกมาจากภาพ
  2. สำหรับแต่ละโซนให้คำนวณสีโดยรวม - ค่าเฉลี่ยของพิกเซลทั้งหมดในโซน
  3. สำหรับภาพทั้งหมดให้คำนวณสีโดยรวม - ค่าเฉลี่ยของโซนทั้งหมด

ดังนั้นสำหรับแต่ละภาพคุณกำลังจัดเก็บn + 1ค่าจำนวนเต็มnจำนวนโซนที่คุณติดตามอยู่ที่ใด

สำหรับการเปรียบเทียบคุณต้องดูที่ช่องสีแต่ละช่องด้วย

  1. สำหรับภาพโดยรวมให้เปรียบเทียบช่องสีสำหรับสีโดยรวมเพื่อดูว่าอยู่ในเกณฑ์ที่กำหนดหรือไม่เช่น 10%
  2. หากรูปภาพอยู่ในเกณฑ์ถัดไปให้เปรียบเทียบแต่ละโซน หากโซนทั้งหมดอยู่ในเกณฑ์ด้วยเช่นกันรูปภาพจะมีความชัดเจนเพียงพอที่อย่างน้อยคุณสามารถตั้งค่าสถานะเพื่อเปรียบเทียบเพิ่มเติมได้

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


6

คล้ายกับคำตอบของ Ic - คุณอาจลองเปรียบเทียบภาพที่ความละเอียดหลาย ๆ ดังนั้นแต่ละภาพจะได้รับการบันทึกเป็น 1x1, 2x2, 4x4 .. 800x800 หากความละเอียดต่ำสุดไม่ตรงกัน (ขึ้นอยู่กับเกณฑ์) คุณสามารถปฏิเสธได้ทันที หากไม่ตรงกันคุณสามารถเปรียบเทียบด้วยความละเอียดที่สูงขึ้นถัดไปและอื่น ๆ ..

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


ฉันคิดว่าแผนที่นี้เป็นการค้นหาต้นไม้บางประเภท มันน่าสนใจ.
André Laszlo

3

ในปี 2015 (ย้อนกลับไปในอนาคต ... ในคำถามปี 2009 ซึ่งตอนนี้ติดอันดับสูงใน Google) ความคล้ายคลึงกันของภาพสามารถคำนวณได้โดยใช้เทคนิค Deep Learning กลุ่มของอัลกอริทึมที่เรียกว่าตัวเข้ารหัสอัตโนมัติสามารถสร้างการแสดงเวกเตอร์ที่สามารถค้นหาความคล้ายคลึง มีการสาธิตเป็นที่นี่


เป็นไปได้ไหมที่จะสร้างภาพลายนิ้วมือจากข้อมูลไบนารี
SwR

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

คำถามเดิมไม่ได้ระบุว่า "เสร็จสิ้นอย่างไร" แต่กล่าวว่า "คำแนะนำบางอย่างเกี่ยวกับอัลกอริทึมที่มีอยู่จะช่วยฉันได้มาก" ซึ่งเป็นสิ่งที่ฉันให้ไว้
Alex R

คุณไม่ได้เชื่อมโยง "แย้ม" เพื่ออัลกอริทึมในความเป็นจริงหน้าที่เชื่อมโยงกล่าวว่า "การทำงาน แต่ไม่มีใครรู้ว่าทำไมกรุณาอย่าคาดหวังมากเกินไปเกี่ยวกับผล." ...
odyth

deeplearning4j.org/deepautoencoder#use-casesนี้ให้ความชัดเจนมากขึ้นเกี่ยวกับวิธีใช้ตัวเข้ารหัสอัตโนมัติเพื่อสร้างลายนิ้วมือจากนั้นคุณจะใช้การพิมพ์ลายนิ้วมือเพื่อค้นหาความคล้ายคลึงกันในภาพอื่น ๆ ได้อย่างไรโดยพิจารณาจากจุดยอดที่คล้ายกัน
odyth

2

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

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

หลังจากใช้งาน 400 วันคุณจะมีภาพ 500,000 ภาพซึ่งหมายความว่า (ลดเวลาในการปรับขนาดภาพลง) 200(H)*200(W)*500,000(images)*3(RGB)= 60,000,000,000 เปรียบเทียบ หากทุกภาพตรงกันทุกประการคุณจะต้องตกอยู่เบื้องหลัง แต่นั่นอาจจะไม่เป็นเช่นนั้นจริงไหม? โปรดจำไว้ว่าคุณสามารถลดราคารูปภาพได้ทันทีที่การเปรียบเทียบเพียงรายการเดียวอยู่นอกเกณฑ์ของคุณ


2

คุณต้องการเปรียบเทียบทุกภาพกับภาพอื่น ๆ หรือไม่? แอพพลิเคชั่นคืออะไร? บางทีคุณอาจต้องการการจัดทำดัชนีและการเรียกคืนรูปภาพตามตัวอธิบายบางอย่าง? ตัวอย่างเช่นคุณสามารถดูมาตรฐาน MPEG-7 สำหรับอินเทอร์เฟซคำอธิบายเนื้อหามัลติมีเดีย จากนั้นคุณสามารถเปรียบเทียบตัวอธิบายภาพที่แตกต่างกันซึ่งจะไม่แม่นยำ แต่เร็วกว่ามาก


อาจจะเลือกระหว่างครบถ้วนสมบูรณ์และถูก จำกัด
จอห์นนี่

2

คุณจึงต้องการ "จับคู่ลายนิ้วมือ" ที่ค่อนข้างแตกต่างจาก "การจับคู่ภาพ" การวิเคราะห์ลายนิ้วมือได้รับการศึกษาอย่างลึกซึ้งในช่วง 20 ปีที่ผ่านมาและอัลกอริทึมที่น่าสนใจหลายอย่างได้รับการพัฒนาเพื่อให้แน่ใจว่ามีอัตราการตรวจจับที่ถูกต้อง (ตามมาตรการFARและFRR - อัตราการยอมรับผิดและอัตราการปฏิเสธที่ผิดพลาด )

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

ดูข้อมูลอ้างอิงเพิ่มเติมได้ที่นี่


คุณรู้วิธีคำนวณอัตราการยอมรับที่ผิดหรือไม่หากคุณมีการแจกแจงคะแนนแบบเกาส์เซียนสำหรับระบบไบโอเมตริกซ์ที่กำหนด
GobiasKoffi

2
OP ต้องการ "สร้างลายนิ้วมือของรูปภาพจำนวนมาก" ไม่เปรียบเทียบภาพลายนิ้วมือของมนุษย์
นาวิน

2

สำหรับการเปรียบเทียบภาพ iPhone และการพัฒนาความคล้ายคลึงกันของภาพโปรดดู: http://sites.google.com/site/imagecomparison/

หากต้องการดูการใช้งานจริงโปรดดู eyeBuy Visual Search บน iTunes AppStore


0

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

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

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