分享
分销 收藏 举报 申诉 / 11
播放页_导航下方通栏广告

类型(Canny-算法)的Java实现-.doc

  • 上传人:仙人****88
  • 文档编号:12072929
  • 上传时间:2025-09-06
  • 格式:DOC
  • 页数:11
  • 大小:123KB
  • 下载积分:10 金币
  • 播放页_非在线预览资源立即下载上方广告
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    Canny 算法 Java 实现
    资源描述:
    边缘检测算法的基本步骤 (1)滤波。边缘检测主要基于导数计算,但受噪声影响。但滤波器在降低噪声的同时也导致边缘强度的损失。 (2)增强。增强算法将邻域中灰度有显著变化的点突出显示。一般通过计算梯度幅值完成。 (3)检测。但在有些图象中梯度幅值较大的并不是边缘点。最简单的边缘检测是梯度幅值阈值判定。 (4)定位。精确确定边缘的位置。 Canny边缘检测算法 step1:用高斯滤波器平滑图象; step2:用一阶偏导的有限差分来计算梯度的幅值和方向; step3:对梯度幅值进行非极大值抑制; step4:用双阈值算法检测和连接边缘。 效果图如下: 代码如下: package tools;   import java.awt.*; import java.awt.image.*;   public class EdgeDetector extends Component {   public EdgeDetector() { threshold1 = 50; threshold2 = 230; setThreshold(128); setWidGaussianKernel(15); }   public void process() throws EdgeDetectorException { if (threshold < 0 || threshold > 255) throw new EdgeDetectorException("The value of the threshold is out of its valid range."); if (widGaussianKernel < 3 || widGaussianKernel > 40) throw new EdgeDetectorException("The value of the widGaussianKernel is out of its valid range."); width = sourceImage.getWidth(this); height = sourceImage.getHeight(this); picsize = width * height; data = new int[picsize]; magnitude = new int[picsize]; orientation = new int[picsize]; float f = 1.0F; canny_core(f, widGaussianKernel); thresholding_tracker(threshold1, threshold2); for (int i = 0; i < picsize; i++) if (data[i] > threshold) data[i] = 0xff000000; else data[i] = -1;   edgeImage = pixels2image(data); data = null; magnitude = null; orientation = null; }   private void canny_core(float f, int i) { boolean flag = false; boolean flag1 = false; derivative_mag = new int[picsize]; float af4[] = new float[i]; float af5[] = new float[i]; float af6[] = new float[i]; data = image2pixels(sourceImage); int k4 = 0; do { if (k4 >= i) break; float f1 = gaussian(k4, f); if (f1 <= 0.005F && k4 >= 2) break; float f2 = gaussian((float) k4 - 0.5F, f); float f3 = gaussian((float) k4 + 0.5F, f); float f4 = gaussian(k4, f * 0.5F); af4[k4] = (f1 + f2 + f3) / 3F / (6.283185F * f * f); af5[k4] = f3 - f2; af6[k4] = 1.6F * f4 - f1; k4++; } while (true); int j = k4; float af[] = new float[picsize]; float af1[] = new float[picsize]; int j1 = width - (j - 1); int l = width * (j - 1); int i1 = width * (height - (j - 1)); for (int l4 = j - 1; l4 < j1; l4++) { for (int l5 = l; l5 < i1; l5 += width) { int k1 = l4 + l5; float f8 = (float) data[k1] * af4[0]; float f10 = f8; int l6 = 1; int k7 = k1 - width; for (int i8 = k1 + width; l6 < j; i8 += width) { f8 += af4[l6] * (float) (data[k7] + data[i8]); f10 += af4[l6] * (float) (data[k1 - l6] + data[k1 + l6]); l6++; k7 -= width; }   af[k1] = f8; af1[k1] = f10; }   }   float af2[] = new float[picsize]; for (int i5 = j - 1; i5 < j1; i5++) { for (int i6 = l; i6 < i1; i6 += width) { float f9 = 0.0F; int l1 = i5 + i6; for (int i7 = 1; i7 < j; i7++) f9 += af5[i7] * (af[l1 - i7] - af[l1 + i7]);   af2[l1] = f9; }   }   af = null; float af3[] = new float[picsize]; for (int j5 = k4; j5 < width - k4; j5++) { for (int j6 = l; j6 < i1; j6 += width) { float f11 = 0.0F; int i2 = j5 + j6; int j7 = 1; for (int l7 = width; j7 < j; l7 += width) { f11 += af5[j7] * (af1[i2 - l7] - af1[i2 + l7]); j7++; }   af3[i2] = f11; }   }   af1 = null; j1 = width - j; l = width * j; i1 = width * (height - j); for (int k5 = j; k5 < j1; k5++) { for (int k6 = l; k6 < i1; k6 += width) { int j2 = k5 + k6; int k2 = j2 - width; int l2 = j2 + width; int i3 = j2 - 1; int j3 = j2 + 1; int k3 = k2 - 1; int l3 = k2 + 1; int i4 = l2 - 1; int j4 = l2 + 1; float f6 = af2[j2]; float f7 = af3[j2]; float f12 = hypotenuse(f6, f7); int k = (int) ((double) f12 * 20D); derivative_mag[j2] = k >= 256 ? 255 : k; float f13 = hypotenuse(af2[k2], af3[k2]); float f14 = hypotenuse(af2[l2], af3[l2]); float f15 = hypotenuse(af2[i3], af3[i3]); float f16 = hypotenuse(af2[j3], af3[j3]); float f18 = hypotenuse(af2[l3], af3[l3]); float f20 = hypotenuse(af2[j4], af3[j4]); float f19 = hypotenuse(af2[i4], af3[i4]); float f17 = hypotenuse(af2[k3], af3[k3]); float f5; if (f6 * f7 <= (float) 0 ? Math.abs(f6) >= Math.abs(f7) ? (f5 = Math.abs(f6 * f12)) >= Math.abs(f7 * f18 - (f6 + f7) * f16) && f5 > Math.abs(f7 * f19 - (f6 + f7) * f15) : ( f5 = Math.abs(f7 * f12)) >= Math.abs(f6 * f18 - (f7 + f6) * f13) && f5 > Math.abs(f6 * f19 - (f7 + f6) * f14) : Math.abs(f6) >= Math.abs(f7) ? (f5 = Math.abs(f6 * f12)) >= Math.abs(f7 * f20 + (f6 - f7) * f16) && f5 > Math.abs(f7 * f17 + (f6 - f7) * f15) : ( f5 = Math.abs(f7 * f12)) >= Math.abs(f6 * f20 + (f7 - f6) * f14) && f5 > Math.abs(f6 * f17 + (f7 - f6) * f13)) { magnitude[j2] = derivative_mag[j2]; orientation[j2] = (int) (Math.atan2(f7, f6) * (double) 40F); } }   }   derivative_mag = null; af2 = null; af3 = null; }   private float hypotenuse(float f, float f1) { if (f == 0.0F && f1 == 0.0F) return 0.0F; else return (float) Math.sqrt(f * f + f1 * f1); }   private float gaussian(float f, float f1) { return (float) Math.exp((-f * f) / ((float) 2 * f1 * f1)); }   private void thresholding_tracker(int i, int j) { for (int k = 0; k < picsize; k++) data[k] = 0;   for (int l = 0; l < width; l++) { for (int i1 = 0; i1 < height; i1++) if (magnitude[l + width * i1] >= i) follow(l, i1, j);   }   }   private boolean follow(int i, int j, int k) { int j1 = i + 1; int k1 = i - 1; int l1 = j + 1; int i2 = j - 1; int j2 = i + j * width; if (l1 >= height) l1 = height - 1; if (i2 < 0) i2 = 0; if (j1 >= width) j1 = width - 1; if (k1 < 0) k1 = 0; if (data[j2] == 0) { data[j2] = magnitude[j2]; boolean flag = false; int l = k1; do { if (l > j1) break; int i1 = i2; do { if (i1 > l1) break; int k2 = l + i1 * width; if ((i1 != j || l != i) && magnitude[k2] >= k && follow(l, i1, k)) { flag = true; break; } i1++; } while (true); if (!flag) break; l++; } while (true); return true; } else { return false; } }   private Image pixels2image(int ai[]) { MemoryImageSource memoryimagesource = new MemoryImageSource( width, height, ColorModel.getRGBdefault(), ai, 0, width); return Toolkit.getDefaultToolkit().createImage(memoryimagesource); }   private int[] image2pixels(Image image) { int ai[] = new int[picsize]; PixelGrabber pixelgrabber = new PixelGrabber(image, 0, 0, width, height, ai, 0, width); try { pixelgrabber.grabPixels(); } catch (InterruptedException interruptedexception) { interruptedexception.printStackTrace(); } boolean flag = false; int k1 = 0; do { if (k1 >= 16) break; int i = (ai[k1] & 0xff0000) >> 16; int k = (ai[k1] & 0xff00) >> 8; int i1 = ai[k1] & 0xff; if (i != k || k != i1) { flag = true; break; } k1++; } while (true); if (flag) { for (int l1 = 0; l1 < picsize; l1++) { int j = (ai[l1] & 0xff0000) >> 16; int l = (ai[l1] & 0xff00) >> 8; int j1 = ai[l1] & 0xff; ai[l1] = (int) (0.29799999999999999D * (double) j + 0.58599999999999997D * (double) l + 0.113D * (double) j1); }   } else { for (int i2 = 0; i2 < picsize; i2++) ai[i2] = ai[i2] & 0xff;   } return ai; }   public void setSourceImage(Image image) { sourceImage = image; }   public Image getEdgeImage() { return edgeImage; }   public void setThreshold(int i) { threshold = i; }   public void setWidGaussianKernel(int i) { widGaussianKernel = i; }   final float ORIENT_SCALE = 40F; private int height; private int width; private int picsize; private int data[]; private int derivative_mag[]; private int magnitude[]; private int orientation[]; private Image sourceImage; private Image edgeImage; private int threshold1; private int threshold2; private int threshold; private int widGaussianKernel; }   //second file   package tools;   public class EdgeDetectorException extends Exception { public EdgeDetectorException() { //do something? } public EdgeDetectorException(String s) { super(s); } }     //使用示例 EdgeDetector edgeDetector=new EdgeDetector(); edgeDetector.setSourceImage(sourceImage); edgeDetector.setThreshold(128); edgeDetector.setWidGaussianKernel(5); try { edgeDetector.process(); } catch(EdgeDetectorException e) { System.out.println(e.getMessage()); } Image edgeImage=edgeDetector.getEdgeImage(); yourPanel.show(edgeImage);     Trackback:
    展开阅读全文
    提示  咨信网温馨提示:
    1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
    2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
    3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
    4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
    5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
    6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

    开通VIP折扣优惠下载文档

    自信AI创作助手
    关于本文
    本文标题:(Canny-算法)的Java实现-.doc
    链接地址:https://www.zixin.com.cn/doc/12072929.html
    页脚通栏广告

    Copyright ©2010-2026   All Rights Reserved  宁波自信网络信息技术有限公司 版权所有   |  客服电话:0574-28810668    微信客服:咨信网客服    投诉电话:18658249818   

    违法和不良信息举报邮箱:help@zixin.com.cn    文档合作和网站合作邮箱:fuwu@zixin.com.cn    意见反馈和侵权处理邮箱:1219186828@qq.com   | 证照中心

    12321jubao.png12321网络举报中心 电话:010-12321  jubao.png中国互联网举报中心 电话:12377   gongan.png浙公网安备33021202000488号  icp.png浙ICP备2021020529号-1 浙B2-20240490   


    关注我们 :微信公众号  抖音  微博  LOFTER               

    自信网络  |  ZixinNetwork