การแปลงระยะห่างระหว่างการประมวลผลภาพในการประมวลผลภาพมักใช้ในการจดจำการจับคู่วัตถุ อัลกอริทึมโดยทั่วไปจะสร้างค่าระยะทางของแต่ละพิกเซลตามหน้าต่าง 3x3 และแบ่งออกเป็นสองขั้นตอนเพื่อให้การแปลงระยะทางเสร็จสมบูรณ์ ขั้นตอนแรกเริ่มต้นจากมุมซ้ายบนสแกนแต่ละพิกเซลจากด้านซ้ายไปขวาจากบนลงล่างและตรวจจับสี่พิกเซลรอบ ๆ พิกเซลกลาง X และบันทึกระยะทางขั้นต่ำและตำแหน่งเป็นผล รูปมีดังนี้:
ขั้นตอนที่สองคือการตรวจจับระยะทางขั้นต่ำและตำแหน่งของพิกเซลที่อยู่ติดกัน 4, 5, 6, 7 จากด้านล่างไปทางขวาไปทางซ้ายเป็นผลสำหรับแต่ละพิกเซล:
หลังจากเสร็จสิ้นสองขั้นตอนนี้เอาต์พุตผลลัพธ์เป็นผลมาจากการแปลงระยะห่างของ Charmfer การใช้รหัสการแปลงรูประยะการจับภาพภาพที่สมบูรณ์สามารถแบ่งออกเป็นขั้นตอนต่อไปนี้:
1. เริ่มต้นอาร์เรย์พิกเซลระยะเริ่มต้นของพิกเซลสีพื้นหลังทั้งหมดไม่มีที่สิ้นสุดและระยะทางของพิกเซลเบื้องหน้าคือ 0
2. เริ่มขั้นตอนแรกในการแปลงระยะห่างของ Charmfer และบันทึกผลลัพธ์
3. ทำขั้นตอนที่สองให้เสร็จสิ้นในการแปลงระยะห่างของ Chamfer ตามผลลัพธ์ของขั้นตอนแรก
4. แสดงค่าสีเทาที่แตกต่างกันทั้งหมดตามผลการแปลงระยะทางเพื่อสร้างภาพ
ผลลัพธ์สุดท้ายจะปรากฏขึ้นดังนี้ (ด้านซ้ายระบุภาพต้นฉบับและด้านขวาระบุผลลัพธ์หลังจาก CDT)
ซอร์สโค้ดสำหรับการแปลงระยะการถ่ายภาพภาพไบนารีภาพที่สมบูรณ์มีดังนี้:
แพ็คเกจ com.gloomyfish.image.transform; นำเข้า Java.awt.Color; นำเข้า java.awt.image.bufferedimage; นำเข้า Java.util.Arrays; นำเข้า com.gloomyfish.filter.study.abstractbufferedimageop; คลาสสาธารณะ cdtfilter ขยาย AbstractBufferedImageop {private float [] dis; // nn-distances private int [] pos; // ตำแหน่ง nn, ดัชนี 32 บิตสีส่วนตัวสี bakcgroundcolor; public cdtfilter (สี bgcolor) {this.bakcgroundColor = bgColor; } @Override ตัวกรอง bufferedImage สาธารณะ (bufferedImage src, bufferedimage dest) {int width = src.getWidth (); ความสูง int = src.getheight (); if (dest == null) dest = createCompatibledestimage (src, null); int [] inpixels = new int [ความกว้าง * ความสูง]; pos = new int [ความกว้าง * ความสูง]; dis = ใหม่ลอย [ความกว้าง * ความสูง]; src.getRgb (0, 0, ความกว้าง, ความสูง, inpixels, 0, ความกว้าง); // จุดแปลงระยะทางที่สร้างขึ้นแบบสุ่มดัชนี int index = 0; array.fill (dis, float.max_value); int numoffc = 0; สำหรับ (int row = 0; row <ความสูง; แถว ++) {สำหรับ (int col = 0; col <width; col ++) {index = row * width+col; if (inpixels [index]! = bakcgroundcolor.getRgb ()) {dis [index] = 0; POS [ดัชนี] = ดัชนี; numoffc ++; }}} Final Float D1 = 1; ลอยสุดท้าย d2 = (ลอย) math.sqrt (d1 * d1 + d1 * d1); System.out.println (numoffc); ลอย nd, nd_tmp; int i, in, cols, แถว, pixel ที่ใกล้ที่สุด; // 1 2 3 // 0 I 4 // 7 6 5 // ผ่านครั้งแรก: ไปข้างหน้า -> l-> r, tb สำหรับ (แถว = 1; แถว <ความสูง - 1; แถว ++) {สำหรับ (cols = 1; cols <width - 1; cols ++) {สำหรับ (cols = 1; nd = dis [i]; ใกล้ที่สุด pixel = pos [i]; if (nd! = 0) {// ข้ามพิกเซลพื้นหลังใน = i; ใน += -1; // 0 ถ้า ((nd_tmp = d1 + dis [in]) <nd) {nd = nd_tmp; ใกล้ที่สุด pixel = pos [ใน]; } ใน += -width; // 1 ถ้า ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; ใกล้ที่สุด pixel = pos [ใน]; } ใน += +1; // 2 ถ้า ((nd_tmp = d1 + dis [in]) <nd) {nd = nd_tmp; ใกล้ที่สุด pixel = pos [ใน]; } ใน += +1; // 3 ถ้า ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; ใกล้ที่สุด pixel = pos [ใน]; } dis [i] = nd; pos [i] = ใกล้ที่สุด }}} // ผ่านครั้งที่สอง: ย้อนหลัง-> r-> l, bt // เหมือนกับการผ่านครั้งแรกเพียงในทิศทางย้อนกลับสำหรับ (แถว = ความสูง-2; แถว> = 1; แถว-) {สำหรับ (cols = ความกว้าง-2; cols> = 1; nd = dis [i]; ใกล้ที่สุด pixel = pos [i]; ถ้า (nd! = 0) {in = i; ใน += +1; // 4 ถ้า ((nd_tmp = d1 + dis [in]) <nd) {nd = nd_tmp; ใกล้ที่สุด pixel = pos [ใน]; } ใน += +ความกว้าง; // 5 ถ้า ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; ใกล้ที่สุด pixel = pos [ใน]; } ใน += -1; // 6 ถ้า ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; ใกล้ที่สุด pixel = pos [ใน]; } ใน += -1; // 6 ถ้า ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; ใกล้ที่สุด pixel = pos [ใน]; } ใน += -1; // 6 ถ้า ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; ใกล้ที่สุด pixel = pos [ใน]; } ใน += -1; // 6 ถ้า ((nd_tmp = d1 + dis [in]) <nd) {nd = nd_tmp; ใกล้ที่สุด pixel = pos [ใน]; } ใน += -1; // 7 ถ้า ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp; ใกล้ที่สุด pixel = pos [ใน]; } dis [i] = nd; pos [i] = ใกล้ที่สุด }}} สำหรับ (int row = 0; แถว <ความสูง; แถว ++) {สำหรับ (int col = 0; col <width; col ++) {index = row * width+col; if (float.max_value! = dis [index]) {int grey = clamp ((int) (dis [index])); inpixels [ดัชนี] = (255 << 24) | (สีเทา << 16) | (สีเทา << 8) | สีเทา; }}} setRgb (dest, 0, 0, ความกว้าง, ความสูง, inpixels); กลับมาแล้ว; } ตัวหนีบ int ส่วนตัว (int i) {return i> 255? 255: (i <0? 0: i); -ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น