二、 基於二階微分的邊緣檢測方法
一階微分組成的梯度是一種向量, 不但有大小還有方向, 和標量比較, 資料存放區量比較大。Lap lac ian 運算元是對二維函數進行運算的二階導數運算元 , 與方向無關, 對取向不敏感, 因而計算量要小。根據邊緣的特性,Laplacian運算元可以作為邊緣提取運算元, 計算數位影像的Laplacian值可以藉助模板實現, 但是它對雜訊相當敏感, 它相當於高通濾波, 常會出現一些虛假邊緣。因此, Marr提出首先對映像用G auss函數進行平滑,然後利用Lap lac ian運算元對平滑的映像求二階導數後得到的零交叉點作為候選邊緣,
這就是LOG運算元 。LOG運算元就是對映像進行濾波和微分的過程, 是利用旋轉對稱的LOG 模板與映像做卷積, 確定濾波器輸出的零交叉位置, 模板。
//laplace運算元會產生負的像素值,因此需要歸一化處理,另外靶心圖表像深度需要注意
cvLaplace(src,pLaplaceImg_32,5);cvConvertScale(pLaplaceImg_32,pLaplaceImg); //將映像轉化為8位cvMinMaxLoc(pLaplaceImg,&min_val,&max_val); printf("max_val = %f\nmin_val = %f\n",max_val,min_val);cvNormalize(pLaplaceImg,pLaplaceImg,0,255,CV_MINMAX,0);cvNamedWindow("laplace",1);cvShowImage("laplace",pLaplaceImg);cvSaveImage("LaplaceImg.jpg", pLaplaceImg);//把映像存入檔案cvReleaseImage(&pLaplaceImg);
//Marr運算元void log(IplImage *src,IplImage *dst){//dst = cvCloneImage(src);IplImage* dst1 = cvCreateImage(cvGetSize(src),32,1);IplImage* SmoothImg = cvCloneImage(src);dst = cvCreateImage(cvGetSize(src),8,1);cvSmooth(src,SmoothImg,CV_GAUSSIAN,3,3); //對映像做3*3的高斯平滑濾波cvLaplace(SmoothImg,dst1,3);cvConvertScale(dst1,dst); //將映像轉化為8位double min_val = 0;double max_val = 0;cvMinMaxLoc(dst,&min_val,&max_val); //取映像中的最大最小像素值printf("max_val = %f\nmin_val = %f\n",max_val,min_val);cvNormalize(dst,dst,0,255,CV_MINMAX); //歸一化處理//對梯度圖加門限,二值化 /*int x,y;char* p = dst->imageData;int w = dst->widthStep;for(x = 0;x<dst->width;x++){for(y = 0;y<dst->height;y++){if(p[x+y*w]>50)p[x+y*w] = 255;else p[x+y*w] = 0;}}*/cvSaveImage("LogImg.jpg", dst);//把映像存入檔案cvNamedWindow("log",1);cvShowImage("log",dst);cvReleaseImage(&dst1);cvReleaseImage(&SmoothImg);}