openCV中cvSobel函數的用法淺析


第一步:開辟兩個和原始圖像一樣大小的圖像內存區,只是 
其深度為IPL_DEPTH_16S,假設原始圖像為pSrc(iplimage結構) 
IplImage *p16SX = cvCreateImage(cvSize(pSrc->width,pSrc->height) 
,IPL_DEPTH_16S,1); 
IplImage *p16SY = cvCreateImage(cvSize(pSrc->width,pSrc->height) 
,IPL_DEPTH_16S,1); 
p16SX->origin = pSrc->origin; 
p16SY->origin = pSrc->origin; 
第二步:調用cvSobel進行邊緣計算 
cvSobel(pSrc,p16SX,1,0,3);//x方向的邊緣 
cvSobel(pSrc,p16SY,0,1,3);//y方向的邊緣 
第三步:計算sqrt(x^2+y^2),得到幅值圖像 
cvMul(p16SX,p16SX,p16SX,1.0); 
cvMul(p16SY,p16SY,p16SY,1.0); 
cvAdd(p16SX,p16SY,p16SX,0); 
最后一步:將16S圖像轉化成8bit圖像 
cvConvert(p16SX,pDst); 

或者使用:

IplImage *sobel8u=cvCreateImage(cvGetSize(pSrc),IPL_DEPTH_8U,1);

cvConvertScaleAbs(p16SX,sobel8u,1,0);


兩點說明: 
1、如果對時間要求不太高,建議在做完第二步后,第三步之前, 
將得到的16S圖像轉換成32F圖像,這樣得到的結果會更加精確。 
2、第三步中cvAdd,你可以另外開辟一個內存區存放結果, 

轉自:http://www.newsmth.net/nForum/#!article/Graphics/29028


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM