版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、canny邊緣檢測(cè)算子的c源代碼canny算子代碼voidCreatGauss(doublesigma,double*pdKernel,int*pnWidowSize);voidGaussianSmooth(SIZEsz,LPBYTEpGray,LPBYTEpResult,doublesigma);voidGrad(SIZEsz,LPBYTEpGray,int*pGradX,int*pGradY,int*pMag);voidNonmaxSuppress(int*pMag,int*pGradX,int*pGradY,SIZEsz,LPBYTEpNSRst);voidEstimateThresho
2、ld(int*pMag,SIZEsz,int*pThrHigh,int*pThrLow,LPBYTEpGray,doubledRatHigh,doubledRatLow);voidHysteresis(int*pMag,SIZEsz,doubledRatLow,doubledRatHigh,LPBYTEpResult);voidTraceEdge(inty,intx,intnThrLow,LPBYTEpResult,int*pMag,SIZEsz);voidCanny(LPBYTEpGray,SIZEsz,doublesigma,doubledRatLow,doubledRatHigh,LPB
3、YTEpResult);#includeafx.h#includemath.h#includecanny.h/一維高斯分布函數(shù),用于平滑函數(shù)中生成的高斯濾波系數(shù)voidCreatGauss(doublesigma,double*pdKernel,int*pnWidowSize)LONGi;/數(shù)組中心點(diǎn)intnCenter;/數(shù)組中一點(diǎn)到中心點(diǎn)距離doubledDis;/中間變量doubledValue;doubledSum;dSum=0;/-3*sigma,3*sigma以內(nèi)數(shù)據(jù),會(huì)覆蓋絕大部分濾波系數(shù)pnWidowSize=1+2*ceil(3*sigma);nCenter=(*pnWido
4、wSize)/2;*pdKernel=newdouble*pnWidowSize;/生成高斯數(shù)據(jù)for(i=0;i(*pnWidowSize);i+)dDis=double(i-nCenter);dValue=exp(-(1/2)*dDis*dDis/(sigma*sigma)/(sqrt(2*3.1415926)*sigma);(*pdKernel)i=dValue;dSum+=dValue;/歸一化for(i=0;i(*pnWidowSize);i+)(*pdKernel)i/=dSum;/用高斯濾波器平滑原圖像voidGaussianSmooth(SIZEsz,LPBYTEpGray,L
5、PBYTEpResult,doublesigma)LONGx,y;LONGi;/高斯濾波器長(zhǎng)度intnWindowSize;/窗口長(zhǎng)度intnLen;/一維高斯濾波器double*pdKernel;/高斯系數(shù)與圖像數(shù)據(jù)的點(diǎn)乘doubledDotMul;/濾波系數(shù)總和doubledWeightSum;double*pdTemp;pdTemp=newdoublesz.cx*sz.cy;/產(chǎn)生一維高斯數(shù)據(jù)CreatGauss(sigma,&pdKernel,&nWindowSize);nLen=nWindowSize/2;/X方向?yàn)V波for(y=0;ysz.cy;y+)for(X=0;Xsz.cX;
6、X+)dDotMul=0;dWeightSum=0;for(i=(-nLen);i=0&(i+X)sz.cX)dDotMul+=(double)pGrayy*sz.cX+(i+X)*pdKernelnLen+i;dWeightSum+=pdKernelnLen+i;pdTempy*sz.cX+X=dDotMul/dWeightSum;/y方向?yàn)V波for(X=0;Xsz.cX;X+)for(y=0;ysz.cy;y+)dDotMul=0;dWeightSum=0;for(i=(-nLen);i=0&(i+y)sz.cy)dDotMul+=(double)pdTemp(y+i)*sz.cX+X*p
7、dKernelnLen+i;dWeightSum+=pdKernelnLen+i;pResulty*sz.cX+X=(unsignedchar)dDotMul/dWeightSum;deletepdKernel;pdKernel=NULL;deletepdTemp;pdTemp=NULL;/方向?qū)?shù),求梯度voidGrad(SIZEsz,LPBYTEpGray,int*pGradX,int*pGradY,int*pMag)LONGy,x;/X方向的方向?qū)?shù)for(y=1;ysz.cy-1;y+)for(X=1;Xsz.cX-1;X+)pGradXy*sz.cX+X=(int)(pGrayy*s
8、z.cX+X+1-pGrayy*sz.cX+X-1);/y方向方向?qū)?shù)for(X=1;Xsz.cX-1;X+)for(y=1;ysz.cy-1;y+)pGradYy*sz.cX+X=(int)(pGray(y+1)*sz.cX+X-pGray(y-1)*sz.cX+X);/求梯度/中間變量doubledSqt1;doubledSqt2;for(y=0;ysz.cy;y+)for(X=0;Xsz.cX;X+)/二階范數(shù)求梯度dSqt1=pGradXy*sz.cx+x*pGradXy*sz.cx+x;dSqt2=pGradYy*sz.cx+x*pGradYy*sz.cx+x;pMagy*sz.cx
9、+x=(int)(sqrt(dSqt1+dSqt2)+0.5);/非最大抑制voidNonmaxSuppress(int*pMag,int*pGradX,int*pGradY,SIZEsz,LPBYTEpNSRst)LONGy,x;intnPos;/梯度分量intgx;intgy;/中間變量intg1,g2,g3,g4;doubleweight;doubledTmp,dTmp1,dTmp2;/設(shè)置圖像邊緣為不可能的分界點(diǎn)for(x=0;xsz.cx;x+)pNSRstx=0;pNSRst(sz.cy-1)*sz.cx+x=0;for(y=0;ysz.cy;y+)pNSRsty*sz.cx=0;
10、pNSRsty*sz.cx+sz.cx-1=0;for(y=1;ysz.cy-1;y+)for(x=1;xabs(gx)/計(jì)算插值比例weight=fabs(gx)/fabs(gy);g2=pMagnPos-sz.cx;g4=pMagnPos+sz.cx;/如果x,y兩個(gè)方向?qū)?shù)的符號(hào)相同/C為當(dāng)前像素,與g1-g4的位置關(guān)系為:/g1g2/C/g4g3if(gx*gy0)g1=pMagnPos-sz.cx-1;g3=pMagnPos+sz.cx+1;如果x,y兩個(gè)方向的方向?qū)?shù)方向相反/C是當(dāng)前像素,與g1-g4的關(guān)系為:/g2g1/C/g3g4elseg1=pMagnPos-sz.cx+1
11、;g3=pMagnPos+sz.cx-1;如果方向?qū)?shù)x分量比y分量大,說(shuō)明導(dǎo)數(shù)的方向趨向于x分量else/插值比例weight=fabs(gy)/fabs(gx);g2=pMagnPos+1;g4=pMagnPos-1;如果x,y兩個(gè)方向的方向?qū)?shù)符號(hào)相同當(dāng)前像素C與gl-g4的關(guān)系為/g3/g4Cg2/g1if(gx*gy0)g1=pMagnPos+sz.cx+1;g3=pMagnPos-sz.cx-1;如果x,y兩個(gè)方向?qū)?shù)的方向相反/C與g1-g4的關(guān)系為/g1/g4Cg2/g3elseg1=pMagnPos-sz.cx+1;g3=pMagnPos+sz.cx-1;/利用g1-g4對(duì)梯
12、度進(jìn)行插值dTmp1=weight*g1+(1-weight)*g2;dTmp2=weight*g3+(1-weight)*g4;/當(dāng)前像素的梯度是局部的最大值/該點(diǎn)可能是邊界點(diǎn)if(dTmp=dTmp1&dTmp=dTmp2)pNSRstnPos=128;else/不可能是邊界點(diǎn)pNSRstnPos=0;/統(tǒng)計(jì)pMag的直方圖,判定閾值voidEstimateThreshold(int*pMag,SIZEsz,int*pThrHigh,int*pThrLow,LPBYTEpGray,doubledRatHigh,doubledRatLow)LONGy,x,k;/該數(shù)組的大小和梯度值的范圍有關(guān)
13、,如果采用本程序的算法/那么梯度的范圍不會(huì)超過pow(2,10)intnHist256;/可能邊界數(shù)intnEdgeNum;/最大梯度數(shù)intnMaxMag;intnHighCount;nMaxMag=0;/初始化for(k=0;k256;k+)nHistk=0;/統(tǒng)計(jì)直方圖,利用直方圖計(jì)算閾值for(y=0;ysz.cy;y+)for(x=0;xsz.cx;x+)if(pGrayy*sz.cx+x=128)nHistpMagy*sz.cx+x+;nEdgeNum=nHist0;nMaxMag=0;/統(tǒng)計(jì)經(jīng)過“非最大值抑制”后有多少像素for(k=1;k256;k+)if(nHistk!=0)
14、nMaxMag=k;/梯度為0的點(diǎn)是不可能為邊界點(diǎn)的/經(jīng)過non-maximumsuppression后有多少像素nEdgeNum+=nHistk;梯度比高閾值*pThrHigh小的像素點(diǎn)總書目nHighCount=(int)(dRatHigh*nEdgeNum+0.5);k=1;nEdgeNum=nHist1;/計(jì)算高閾值while(k(nMaxMag-1)&(nEdgeNumnHighCount)k+;nEdgeNum+=nHistk;*pThrHigh=k;/低閾值*pThrLow=(int)(*pThrHigh)*dRatLow+0.5);/利用函數(shù)尋找邊界起點(diǎn)voidHysteres
15、is(int*pMag,SIZEsz,doubledRatLow,doubledRatHigh,LPBYTEpResult)LONGy,x;intnThrHigh,nThrLow;intnPos;/估計(jì)TraceEdge函數(shù)需要的低閾值,以及Hysteresis函數(shù)使用的高閾值EstimateThreshold(pMag,sz,&nThrHigh,&nThrLow,pResult,dRatHigh,dRatLow);尋找大于dThrHigh的點(diǎn),這些點(diǎn)用來(lái)當(dāng)作邊界點(diǎn),/然后用TraceEdge函數(shù)跟蹤該點(diǎn)對(duì)應(yīng)的邊界for(y=0;ysz.cy;y+)for(x=0;x=nThrHigh)/設(shè)置
16、該點(diǎn)為邊界點(diǎn)pResultnPos=255;TraceEdge(y,x,nThrLow,pResult,pMag,sz);/其他點(diǎn)已經(jīng)不可能為邊界點(diǎn)for(y=0;ysz.cy;y+)for(x=0;xsz.cx;x+)nPos=y*sz.cx+x;if(pResultnPos!=255)pResultnPos=0;根據(jù)Hysteresis執(zhí)行的結(jié)果,從一個(gè)像素點(diǎn)開始搜索,搜索以該像素點(diǎn)為邊界起點(diǎn)的一條邊界的/一條邊界的所有邊界點(diǎn),函數(shù)采用了遞歸算法/從(x,y)坐標(biāo)出發(fā),進(jìn)行邊界點(diǎn)的跟蹤,跟蹤只考慮pResult中沒有處理并且可能是邊界/點(diǎn)的像素(=128),像素值為0表明該點(diǎn)不可能是邊界點(diǎn)
17、,像素值為255表明該點(diǎn)已經(jīng)是邊界點(diǎn)voidTraceEdge(inty,intx,intnThrLow,LPBYTEpResult,int*pMag,SIZEsz)/對(duì)8鄰域像素進(jìn)行查詢intxNum8=1,1,0,-1,-1,-1,0,1;intyNum8=0,1,1,1,0,-1,-1,-1;LONGyy,xx,k;for(k=0;k=nThrLow)/該點(diǎn)設(shè)為邊界點(diǎn)pResultyy*sz.cx+xx=255;/以該點(diǎn)為中心再進(jìn)行跟蹤TraceEdge(yy,xx,nThrLow,pResult,pMag,sz);/Canny算子voidCanny(LPBYTEpGray,SIZEsz
18、,doublesigma,doubledRatLow,doubledRatHigh,LPBYTEpResult)/經(jīng)過高斯濾波后的圖像LPBYTEpGaussSmooth;pGaussSmooth=newunsignedcharsz.cx*sz.cy;/x方向?qū)?shù)的指針int*pGradX;pGradX=newintsz.cx*sz.cy;/y方向int*pGradY;pGradY=newintsz.cx*sz.cy;/梯度的幅度int*pGradMag;pGradMag=newintsz.cx*sz.cy;/對(duì)原圖高斯濾波GaussianSmooth(sz,pGray,pGaussSmooth,sigma);/計(jì)算方向?qū)?shù)和梯度的幅度Grad(sz,pGaussSmooth,pGradX,pGradY,pGradMag);/應(yīng)用非最大抑制NonmaxSuppress(pGradMag,pGradX,pGradY,sz,pResult);應(yīng)用Hysteresis,找到所有邊界Hysteresis(pGradMag,sz,dRatLow,dRatHigh
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年實(shí)習(xí)律師面試題庫(kù)及標(biāo)準(zhǔn)解答
- 機(jī)械前沿新技術(shù)
- AI行情:市場(chǎng)動(dòng)態(tài)分析
- 2025 小學(xué)四年級(jí)思想品德上冊(cè)公共場(chǎng)合禮儀示范課件
- 2026年5G+工業(yè)互聯(lián)網(wǎng)融合報(bào)告
- 2025年生態(tài)環(huán)保型河道治理工程雨水收集利用技術(shù)創(chuàng)新可行性分析報(bào)告
- 2025年鈉離子電池電解液商業(yè)化應(yīng)用案例報(bào)告
- 優(yōu)化門診護(hù)理教學(xué):教師技能大賽課件集錦
- 僑胞之家維權(quán)制度
- 倉(cāng)庫(kù)理貨獎(jiǎng)罰制度
- 2026院感知識(shí)考試題及答案
- 《紅樓夢(mèng)》導(dǎo)讀 (教學(xué)課件) -高中語(yǔ)文人教統(tǒng)編版必修下冊(cè)
- 安徽省九師聯(lián)盟2025-2026學(xué)年高三(1月)第五次質(zhì)量檢測(cè)英語(yǔ)(含答案)
- (2025年)四川省自貢市紀(jì)委監(jiān)委公開遴選公務(wù)員筆試試題及答案解析
- 2025年度骨科護(hù)理部年終工作總結(jié)及工作計(jì)劃
- 2026安徽省農(nóng)村信用社聯(lián)合社面向社會(huì)招聘農(nóng)商銀行高級(jí)管理人員參考考試試題及答案解析
- 室外供熱管道安裝監(jiān)理實(shí)施細(xì)則
- 巖板采購(gòu)合同范本
- 通信管道施工質(zhì)量管理流程解析
- popchrio歐可芮小紅書營(yíng)銷方案
- (零模)2026屆廣州市高三年級(jí)調(diào)研測(cè)試英語(yǔ)試卷(含答案解析)
評(píng)論
0/150
提交評(píng)論