opencv讀影象C語言實現canny邊緣檢測
阿新 • • 發佈:2019-02-02
1 ////////第四步:非極大值抑制 2 //注意事項 權重的選取,也就是離得近權重大 3 ///////////////////////////////////////////////////////////////// 4 IplImage * N;//非極大值抑制結果 5 N=cvCreateImage(cvGetSize(ColorImage),ColorImage->depth,1); 6 IplImage * OpencvCannyimg;//非極大值抑制結果 7 OpencvCannyimg=cvCreateImage(cvGetSize(ColorImage),ColorImage->depth,1); 8 int g1=0, g2=0, g3=0, g4=0; //用於進行插值,得到亞畫素點座標值 9 double dTmp1=0.0, dTmp2=0.0; //儲存兩個亞畫素點插值得到的灰度資料 10 double dWeight=0.0; //插值的權重 11 12 for(int i=1;i<nWidth-1;i++) 13 { 14 for(int j=1;j<nHeight-1;j++) 15 { 16 //如果當前點梯度為0,該點就不是邊緣點17 if (M[i+j*nWidth]==0) 18 { 19 N->imageData[i+j*nwidthstep]=0; 20 }else 21 { 22 ////////首先判斷屬於那種情況,然後根據情況插值/////// 23 ////////////////////第一種情況/////////////////////// 24 ///////// g1 g2 ///////////// 25 ///////// C///////////// 26 ///////// g3 g4 ///////////// 27 ///////////////////////////////////////////////////// 28 if((Theta[i+j*nWidth]>=90&&Theta[i+j*nWidth]<135)||(Theta[i+j*nWidth]>=270&&Theta[i+j*nWidth]<315)) 29 { 30 g1=M[i-1+(j-1)*nWidth]; 31 g2=M[i+(j-1)*nWidth]; 32 g3=M[i+(j+1)*nWidth]; 33 g4=M[i+1+(j+1)*nWidth]; 34 dWeight=fabs(P[i+j*nWidth])/fabs(Q[i+j*nWidth]); 35 dTmp1=g1*dWeight+(1-dWeight)*g2; 36 dTmp2=g4*dWeight+(1-dWeight)*g3; 37 ////////////////////第二種情況/////////////////////// 38 ///////// g1 ///////////// 39 ///////// g2 C g3 ///////////// 40 ///////// g4 ///////////// 41 ///////////////////////////////////////////////////// 42 }else if((Theta[i+j*nWidth]>=135&&Theta[i+j*nWidth]<180)||(Theta[i+j*nWidth]>=315&&Theta[i+j*nWidth]<360)) 43 { 44 g1=M[i-1+(j-1)*nWidth]; 45 g2=M[i-1+(j)*nWidth]; 46 g3=M[i+1+(j)*nWidth]; 47 g4=M[i+1+(j+1)*nWidth]; 48 dWeight=fabs(Q[i+j*nWidth])/fabs(P[i+j*nWidth]); 49 dTmp1=g1*dWeight+(1-dWeight)*g2; 50 dTmp2=g4*dWeight+(1-dWeight)*g3; 51 ////////////////////第三種情況/////////////////////// 52 ///////// g1 g2 ///////////// 53 ///////// C ///////////// 54 ///////// g4 g3 ///////////// 55 ///////////////////////////////////////////////////// 56 }else if((Theta[i+j*nWidth]>=45&&Theta[i+j*nWidth]<90)||(Theta[i+j*nWidth]>=225&&Theta[i+j*nWidth]<270)) 57 { 58 g1=M[i+1+(j-1)*nWidth]; 59 g2=M[i+(j-1)*nWidth]; 60 g3=M[i+(j+1)*nWidth]; 61 g4=M[i-1+(j+1)*nWidth]; 62 dWeight=fabs(P[i+j*nWidth])/fabs(Q[i+j*nWidth]); 63 dTmp1=g1*dWeight+(1-dWeight)*g2; 64 dTmp2=g4*dWeight+(1-dWeight)*g3; 65 ////////////////////第四種情況/////////////////////// 66 ///////// g1 ///////////// 67 ///////// g4 C g2 ///////////// 68 ///////// g3 ///////////// 69 ///////////////////////////////////////////////////// 70 }else if((Theta[i+j*nWidth]>=0&&Theta[i+j*nWidth]<45)||(Theta[i+j*nWidth]>=180&&Theta[i+j*nWidth]<225)) 71 { 72 g1=M[i+1+(j-1)*nWidth]; 73 g2=M[i+1+(j)*nWidth]; 74 g3=M[i-1+(j)*nWidth]; 75 g4=M[i-1+(j+1)*nWidth]; 76 dWeight=fabs(Q[i+j*nWidth])/fabs(P[i+j*nWidth]); 77 dTmp1=g1*dWeight+(1-dWeight)*g2; 78 dTmp2=g4*dWeight+(1-dWeight)*g3; 79 80 } 81 82 } 83 84 if ((M[i+j*nWidth]>=dTmp1)&&(M[i+j*nWidth]>=dTmp2)) 85 { 86 N->imageData[i+j*nwidthstep]=200; 87 88 }else N->imageData[i+j*nwidthstep]=0; 89 90 } 91 } 92 93 94 //cvNamedWindow("Limteimg",0); 95 //cvShowImage("Limteimg",N); //顯示非抑制 96 //cvWaitKey(0); 97 //cvDestroyWindow("Limteimg");