![(Canny+算法)的Java實現(xiàn).doc_第1頁](http://file.renrendoc.com/FileRoot1/2020-1/6/eaaea375-15ac-4ffd-a7e9-a94a163f5359/eaaea375-15ac-4ffd-a7e9-a94a163f53591.gif)
![(Canny+算法)的Java實現(xiàn).doc_第2頁](http://file.renrendoc.com/FileRoot1/2020-1/6/eaaea375-15ac-4ffd-a7e9-a94a163f5359/eaaea375-15ac-4ffd-a7e9-a94a163f53592.gif)
![(Canny+算法)的Java實現(xiàn).doc_第3頁](http://file.renrendoc.com/FileRoot1/2020-1/6/eaaea375-15ac-4ffd-a7e9-a94a163f5359/eaaea375-15ac-4ffd-a7e9-a94a163f53593.gif)
![(Canny+算法)的Java實現(xiàn).doc_第4頁](http://file.renrendoc.com/FileRoot1/2020-1/6/eaaea375-15ac-4ffd-a7e9-a94a163f5359/eaaea375-15ac-4ffd-a7e9-a94a163f53594.gif)
![(Canny+算法)的Java實現(xiàn).doc_第5頁](http://file.renrendoc.com/FileRoot1/2020-1/6/eaaea375-15ac-4ffd-a7e9-a94a163f5359/eaaea375-15ac-4ffd-a7e9-a94a163f53595.gif)
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
邊緣檢測算法的基本步驟 (1)濾波。邊緣檢測主要基于導數(shù)計算,但受噪聲影響。但濾波器在降低噪聲的同時也導致邊緣強度的損失。 (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 255)throw new EdgeDetectorException(The value of the threshold is out of its valid range.);if (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 intpicsize;magnitude = new intpicsize;orientation = new intpicsize;float f = 1.0F;canny_core(f, widGaussianKernel);thresholding_tracker(threshold1, threshold2);for (int i = 0; i threshold)datai = 0xff000000;elsedatai = -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 intpicsize;float af4 = new floati;float af5 = new floati;float af6 = new floati;data = image2pixels(sourceImage);int k4 = 0;do if (k4 = i)break;float f1 = gaussian(k4, f);if (f1 = 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);af4k4 = (f1 + f2 + f3) / 3F / (6.283185F * f * f);af5k4 = f3 - f2;af6k4 = 1.6F * f4 - f1;k4+; while (true);int j = k4;float af = new floatpicsize;float af1 = new floatpicsize;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) datak1 * af40;float f10 = f8;int l6 = 1;int k7 = k1 - width;for (int i8 = k1 + width; l6 j; i8 += width) f8 += af4l6 * (float) (datak7 + datai8);f10 += af4l6 * (float) (datak1 - l6 + datak1 + l6);l6+;k7 -= width;afk1 = f8;af1k1 = f10;float af2 = new floatpicsize;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 += af5i7 * (afl1 - i7 - afl1 + i7);af2l1 = f9;af = null;float af3 = new floatpicsize;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 += af5j7 * (af1i2 - l7 - af1i2 + l7);j7+;af3i2 = 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 = 256 ? 255 : k;float f13 = hypotenuse(af2k2, af3k2);float f14 = hypotenuse(af2l2, af3l2);float f15 = hypotenuse(af2i3, af3i3);float f16 = hypotenuse(af2j3, af3j3);float f18 = hypotenuse(af2l3, af3l3);float f20 = hypotenuse(af2j4, af3j4);float f19 = hypotenuse(af2i4, af3i4);float f17 = hypotenuse(af2k3, af3k3);float f5;if (f6 * f7 = 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) magnitudej2 = derivative_magj2;orientationj2 = (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;elsereturn (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+)datak = 0;for (int l = 0; l width; l+) for (int i1 = 0; 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 = width)j1 = width - 1;if (k1 j1)break;int i1 = i2;do if (i1 l1)break;int k2 = l + i1 * width;if (i1 != j | l != i)& magnitudek2 = 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 intpicsize;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 = (aik1 & 0xff0000) 16;int k = (aik1 & 0xff00) 8;int i1 = aik1 & 0xff;if (i != k | k != i1) flag = true;break;k1+; while (true);if (flag) for (int l1 = 0; l1 16;int l = (ail1 & 0xff00) 8;int j1 = ail1 & 0xff;ail1 =(int) (0.29799999999999999D * (double) j+ 0.58599999999999997D * (double) l+ 0.113D * (double) j1); else for (int i2 = 0; i2 picsize; i2+)aii2 = aii2 & 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 t
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025合同模板中央空調銷售合同范本
- 北京億歐網(wǎng)盟科技有限公司-新質生產(chǎn)力系列:2025中國消費級AI硬件價值洞察及GEEK50榜單報告
- 2024年三年級道德與法治下冊 第四單元 多樣的交通和通信 11四通八達的交通第二課時說課稿 新人教版
- 2024年秋七年級地理上冊 第五章 世界的發(fā)展差異 5.2《國際經(jīng)濟合作》說課稿2 (新版)湘教版
- 9 古代科技 耀我中華(說課稿)2024-2025學年統(tǒng)編版道德與法治五年級上冊
- 養(yǎng)殖設備銷售合同范例
- 2024年一年級道德與法治上冊 第16課 我有一雙明亮的眼睛說課稿 未來版
- 9 種豆子 說課稿-2023-2024學年科學二年級下冊冀人版
- 出售電廠鍋爐合同范例
- 人員轉公司合同范例
- 2024-2025年江蘇專轉本英語歷年真題(含答案)
- 投標廢標培訓
- 腦卒中課件完整版本
- 藥房保潔流程規(guī)范
- 電子信息工程基礎知識單選題100道及答案解析
- 血液透析器課件
- 吊車司機雇傭合同協(xié)議書
- 新華師大版八年級下冊初中數(shù)學全冊課時練(課后作業(yè)設計)
- 致命性大出血急救專家共識
- 住院成人高血糖患者血糖監(jiān)測醫(yī)護協(xié)議處方共識
- JTS-169-2017碼頭附屬設施技術規(guī)范
評論
0/150
提交評論