(Canny+算法)的Java實(shí)現(xiàn).doc_第1頁
(Canny+算法)的Java實(shí)現(xiàn).doc_第2頁
(Canny+算法)的Java實(shí)現(xiàn).doc_第3頁
(Canny+算法)的Java實(shí)現(xiàn).doc_第4頁
(Canny+算法)的Java實(shí)現(xiàn).doc_第5頁
免費(fèi)預(yù)覽已結(jié)束,剩余6頁可下載查看

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

邊緣檢測算法的基本步驟 (1)濾波。邊緣檢測主要基于導(dǎo)數(shù)計(jì)算,但受噪聲影響。但濾波器在降低噪聲的同時(shí)也導(dǎo)致邊緣強(qiáng)度的損失。 (2)增強(qiáng)。增強(qiáng)算法將鄰域中灰度有顯著變化的點(diǎn)突出顯示。一般通過計(jì)算梯度幅值完成。 (3)檢測。但在有些圖象中梯度幅值較大的并不是邊緣點(diǎn)。最簡單的邊緣檢測是梯度幅值閾值判定。 (4)定位。精確確定邊緣的位置。Canny邊緣檢測算法 step1:用高斯濾波器平滑圖象; step2:用一階偏導(dǎo)的有限差分來計(jì)算梯度的幅值和方向; step3:對(duì)梯度幅值進(jìn)行非極大值抑制; 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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論