ตัวอย่างในบทความนี้อธิบายวิธีการใช้การจดจำรูปภาพที่คล้ายกันโดยอิงจากแอปพลิเคชันฮิสโตแกรมใน Java ซึ่งเป็นเทคนิคที่ใช้งานได้จริง แบ่งปันกับทุกคนสำหรับการอ้างอิงของคุณ การวิเคราะห์เฉพาะมีดังนี้:
1. ภาพรวมอัลกอริทึม:
ขั้นแรก รวบรวมข้อมูลฮิสโตแกรมของรูปภาพต้นฉบับและรูปภาพที่จะกรอง ปรับระดับฮิสโตแกรมรูปภาพที่รวบรวมให้เป็นมาตรฐาน จากนั้นใช้อัลกอริธึมค่าสัมประสิทธิ์ Babbitt เพื่อคำนวณข้อมูลฮิสโตแกรม และสุดท้ายจะได้ค่าความคล้ายคลึงของรูปภาพ และช่วงค่าระหว่าง [0 , 1]
0 หมายถึงแตกต่างอย่างมาก 1 หมายถึงคล้ายกันมาก (เหมือนกัน)
2. คำอธิบายโดยละเอียดของขั้นตอนอัลกอริทึม:
สามารถแบ่งคร่าวๆ ได้เป็นสองขั้นตอน โดยขึ้นอยู่กับข้อมูลพิกเซลของรูปภาพต้นฉบับและรูปภาพที่เป็นตัวเลือก ข้อมูลฮิสโตแกรมที่เกี่ยวข้องจะถูกสร้างขึ้น ขั้นตอนที่ 2: ใช้เอาต์พุตผลลัพธ์ฮิสโตแกรมจากขั้นตอนแรก และใช้อัลกอริธึมสัมประสิทธิ์ภัตตาชารยาเพื่อคำนวณค่าความคล้ายคลึงกัน
ขั้นตอนที่ 1: การคำนวณฮิสโตแกรม
ฮิสโตแกรมแบ่งออกเป็นฮิสโตแกรมระดับสีเทาและฮิสโตแกรม RGB การคำนวณฮิสโตแกรมภาพระดับสีเทานั้นง่ายมาก เพียงเริ่มต้นอาร์เรย์ฮิสโตแกรม H ด้วยขนาด 256 จากนั้นให้กรอกสถิติการกระจายความถี่ตามค่าพิกเซล คือ 124 จากนั้น H[124] += 1 สำหรับพิกเซล RGB สี มีสองวิธีในการแสดงฮิสโตแกรมแบบหนึ่งและอีกแบบคือฮิสโตแกรมสามมิตินั้นค่อนข้างง่ายและชัดเจน ฮิสโตแกรมสามอัน HR, HG, HB สมมติว่าค่า RGB ของจุดพิกเซล P คือ (4, 231,129) ดังนั้นการคำนวณฮิสโตแกรมคือ HR[4] += 1, HG[231] += 1 HB[129] += 1 หลังจากเสร็จสิ้นสถิติสำหรับแต่ละพิกเซลแล้ว ข้อมูลฮิสโตแกรมสี RGB จะถูกสร้างขึ้น
ฮิสโตแกรม SH ของพิกเซล RGB นั้นซับซ้อนกว่าเล็กน้อย ช่วงค่าของแต่ละสีอยู่ระหว่าง 0 ถึง 255 สันนิษฐานว่าสามารถแบ่งออกเป็นส่วนเท่า ๆ กันในช่วงหนึ่ง ๆ เมื่อมี 8 ส่วนเท่ากัน ช่วงค่า ของแต่ละส่วนที่เท่ากัน เมื่อมีจำนวน 32 และ 16 ส่วนเท่ากัน ช่วงค่าของแต่ละส่วนที่เท่ากันคือ 16 เมื่อมีจำนวน 4 ส่วนเท่ากัน ช่วงของค่าแต่ละส่วนที่เท่ากันคือ 64 สมมติว่าค่า RGB คือ (14, 68 , 221) หลังจาก 16 ส่วนเท่ากัน ค่าดัชนีฮิสโตแกรมที่สอดคล้องกันคือ: (0, 4, 13) ตามสูตรในการคำนวณค่าดัชนี: ดัชนี = R + G*16 + B*16*16
ดัชนีฮิสโตแกรมที่สอดคล้องกัน = 0 + 4*16 + 13 * 16 * 16, SH[3392] += 1
ด้วยวิธีนี้ ค่าพิกเซล RGB ทั้งหมดจะถูกข้ามไปเพื่อทำการคำนวณข้อมูลฮิสโตแกรมให้เสร็จสิ้น
ขั้นตอนที่ 2: คำนวณค่าสัมประสิทธิ์ Babbitt สูตรการคำนวณมีดังนี้:
ในหมู่พวกเขา P และ P' เป็นตัวแทนของข้อมูลฮิสโตแกรมรูปภาพต้นฉบับและข้อมูลผู้สมัครตามลำดับ รากที่สองของผลิตภัณฑ์ของแต่ละจุดข้อมูลที่มี i เหมือนกันจะถูกรวมเข้าด้วยกัน
ผลลัพธ์คือค่าความคล้ายคลึงกันของภาพ (ค่าสัมประสิทธิ์แบทช์) ซึ่งอยู่ในช่วงตั้งแต่ 0 ถึง 1
ผลของโปรแกรมแสดงในรูปด้านล่าง:
ความคล้ายคลึงกันมากกว่า 99% คล้ายกันมาก
ความคล้ายคลึงกัน: 72% โดยทั่วไปคล้ายกัน
3. ซอร์สโค้ดการคำนวณฮิสโตแกรมของโปรแกรมมีดังนี้:
โมฆะสาธารณะ setGreenBinCount (int greenBinCount) { this.greenBins = greenBinCount; } โมฆะสาธารณะ setBlueBinCount (int blueBinCount) { this.blueBins = blueBinCount; } ตัวกรองสาธารณะ (BufferedImage src, BufferedImage dest) { int width = src.getWidth ( ความสูง int = src.getHeight(); inPixels = new int[width*height]; float[] histogramData = new float[redBins * greenBins * blueBins]; greenIdx = 0, blueIdx = 0; int singleIndex = 0; row=0; row<height; row++) { int ta = 0, tr = 0, tg = 0, tb = 0; for(int col=0; col<width; col++) { ดัชนี = แถว * ความกว้าง + คอลัมน์; ta = (inPixels[ดัชนี] >> 24) & 0xff; tr = (inPixels[ดัชนี] >> 16) & 0xff; (inPixels[ดัชนี] >> 8) & 0xff; tb = inPixels[ดัชนี] & 0xff; redIdx = (int)getBinIndex(redBins, tr, 255); = (int)getBinIndex(blueBins, tb, 255); singleIndex = redIdx + greenIdx * redBins + blueIdx * redBins * greenBins; histogramData[singleIndex] += 1; รวม += 1; } } // เริ่มทำให้ข้อมูลฮิสโตแกรมเป็นปกติสำหรับ (int i = 0; i < histogramData .length; i++) { histogramData[i] = histogramData[i] / รวม; ฮิสโตแกรมข้อมูล; }รหัสในการคำนวณค่าสัมประสิทธิ์การอาบน้ำมีดังนี้:
/** * ค่าสัมประสิทธิ์ Bhattacharyya * http://www.cse.yorku.ca/~kosta/CompVis_Notes/bhattacharyya.pdf * * @return */ public double modelMatch() { HistogramFilter hfilter = new HistogramFilter(); sourceData = hfilter.filter(sourceImage, null); float[] ผู้สมัครข้อมูล = hfilter.filter(candidateImage, null); double[] mixData = new double[sourceData.length]; for(int i=0; i<sourceData.length; i++ ) { mixData[i] = Math.sqrt(sourceData[i] * CandidateData[i] } // ค่าของสัมประสิทธิ์ Bhattacharyya อยู่ระหว่าง 0 ถึง 1, ความคล้ายคลึงกันสองเท่า = 0; for(int i=0; i<mixedData.length; i++ ) { ความคล้ายคลึงกัน += mixData[i]; } // ระดับความคล้ายคลึงกลับความคล้ายคลึงกัน }ฉันหวังว่าบทความนี้จะเป็นประโยชน์กับการเขียนโปรแกรม Java ของทุกคน