غالبًا ما يستخدم تحويل المسافة في معالجة الصور في التعرف على مطابقة الكائن. تقوم الخوارزمية بإنشاء قيمة المسافة لكل بكسل بشكل أساسي على أساس نافذة 3 × 3 ، ويتم تقسيمها إلى خطوتين لإكمال تحول المسافة. تبدأ الخطوة الأولى من الركن الأيسر العلوي ، ومسح كل بكسل من اليسار إلى اليمين ، من أعلى إلى أسفل ، واكتشاف أربعة بكسل حول بكسل الوسط ، ويوفر الحد الأدنى للمسافة والموضع كنتيجة. الشكل كما يلي:
الخطوة الثانية هي اكتشاف الحد الأدنى للمسافة وموضع البكسلات المجاورة 4 ، 5 ، 6 ، 7 من أسفل إلى اليمين إلى اليسار ، كنتيجة ، لكل بكسل:
بعد الانتهاء من هاتين الخطوتين ، يكون الناتج الناتج هو نتيجة تحول مسافة شامفر. يمكن تقسيم تنفيذ رمز تحويل مسافة الشفاف الكامل إلى الخطوات التالية:
1. تهيئة صفيف البكسل ، والمسافة الأولية لجميع وحدات البكسل ذات اللون الخلفية غير محدودة ، ومسافة البكسلات المقدمة هي 0.
2. ابدأ الخطوة الأولى في تحويل المسافة الشامرف وحفظ النتيجة
3. أكمل الخطوة الثانية في تحويل مسافة الشامرف بناءً على نتائج الخطوة الأولى
4. عرض جميع قيم الرمادي المختلفة وفقًا لنتائج تحويل المسافة لتشكيل صورة
يتم عرض النتيجة النهائية على النحو التالي (يشير اليسار إلى الصورة الأصلية ويشير اليمين إلى النتيجة بعد CDT)
الكود المصدري لتحويل مسافة شطب الصورة الثنائية الكاملة هو كما يلي:
حزمة com.gloomyfish.image.transform ؛ استيراد java.awt.color ؛ استيراد java.awt.image.bufferedImage ؛ استيراد java.util.arrays ؛ استيراد com.gloomyfish.filter.study.abstractBufferedImageOp ؛ الطبقة العامة cdtfilter يمتد ملخص agressbufferedImageOp {private float [] dis ؛ // nn-distances private int [] pos ؛ // nn-positions ، 32 bit index private color BakcgroundColor ؛ cdtfilter العامة (color bgcolor) {this.bakcgroundColor = bgColor ؛ } override public bufferedimage filter (bufferedImage SRC ، bufferedImage dest) {int width = src.getWidth () ؛ ارتفاع int = src.getheight () ؛ if (dest == null) dest = createCompatiLedestImage (SRC ، NULL) ؛ int [] inpixels = new int [العرض * الارتفاع] ؛ pos = new int [العرض * الارتفاع] ؛ dis = تعويم جديد [العرض * الارتفاع] ؛ src.getrgb (0 ، 0 ، العرض ، الارتفاع ، inpixels ، 0 ، العرض) ؛ // نقطة تحويل المسافة التي تم إنشاؤها عشوائيا الفهرس int = 0 ؛ arrays.fill (dis ، float.max_value) ؛ int numoffc = 0 ؛ لـ (int row = 0 ؛ row <height ؛ row ++) {for (int col = 0 ؛ col <width ؛ col ++) {index = row * width+col ؛ if (inpixels [index]! = BakcgroundColor.getRgb ()) {dis [index] = 0 ؛ pos [index] = index ؛ numoffc ++ ؛ }}} Final Float D1 = 1 ؛ Final Float D2 = (Float) Math.Sqrt (D1 * D1 + D1 * D1) ؛ system.out.println (numoffc) ؛ Float nd ، nd_tmp ؛ int i ، in ، cols ، الصفوف ، أقرب pixel ؛ // 1 2 3 // 0 i 4 // 7 6 5 // pass first: forward -> l-> r ، tb for (raws = 1 ؛ rows <height - 1 ؛ rows ++) {for (cols = 1 ؛ cols <width - 1 ؛ cols ++) {for (cols = 1 ؛ cols - 1 ؛ cols ++) {i = nd = dis [i] ؛ أقرب pixel = pos [i] ؛ if (nd! = 0) {// تخطي البكسلات الخلفية في = i ؛ في += -1 ؛ // 0 if ((nd_tmp = d1 + dis [in]) <nd) {nd = nd_tmp ؛ أقرب pixel = pos [في] ؛ } في += -width ؛ // 1 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp ؛ أقرب pixel = pos [في] ؛ } في += +1 ؛ // 2 if ((nd_tmp = d1 + dis [in]) <nd) {nd = nd_tmp ؛ أقرب pixel = pos [في] ؛ } في += +1 ؛ // 3 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp ؛ أقرب pixel = pos [في] ؛ } dis [i] = nd ؛ pos [i] = أقرب pixel ؛ }}} // Pass Second: backwards-> r-> l ، bt // نفسه تمامًا مثل الممر الأول ، فقط في الاتجاه العكسي لـ (lead = height-2 ؛ rows> = 1 ؛ rows-) {for (cols = width-2 ؛ cols> = 1 ؛ cols--) {i = dows * width + cols ؛ nd = dis [i] ؛ أقرب pixel = pos [i] ؛ if (nd! = 0) {in = i ؛ في += +1 ؛ // 4 if ((nd_tmp = d1 + dis [in]) <nd) {nd = nd_tmp ؛ أقرب pixel = pos [في] ؛ } في += +عرض ؛ // 5 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp ؛ أقرب pixel = pos [في] ؛ } في += -1 ؛ // 6 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp ؛ أقرب pixel = pos [في] ؛ } في += -1 ؛ // 6 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp ؛ أقرب pixel = pos [في] ؛ } في += -1 ؛ // 6 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp ؛ أقرب pixel = pos [في] ؛ } في += -1 ؛ // 6 if ((nd_tmp = d1 + dis [in]) <nd) {nd = nd_tmp ؛ أقرب pixel = pos [في] ؛ } في += -1 ؛ // 7 if ((nd_tmp = d2 + dis [in]) <nd) {nd = nd_tmp ؛ أقرب pixel = pos [في] ؛ } dis [i] = nd ؛ pos [i] = أقرب pixel ؛ }}} لـ (int row = 0 ؛ row <height ؛ row ++) {for (int col = 0 ؛ col <width ؛ col ++) {index = row * width+col ؛ if (float.max_value! = dis [index]) {int gray = clamp ((int) (dis [index])) ؛ inpixels [index] = (255 << 24) | (رمادي << 16) | (رمادي << 8) | رمادي؛ }}} setrgb (dest ، 0 ، 0 ، العرض ، الارتفاع ، inpixels) ؛ إعادة القدر } private int clamp (int i) {return i> 255؟ 255: (i <0؟ 0: i) ؛ }}ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.