天天看點

opencv-Canny 邊緣檢測

int main(){
 Mat src = imread("test.jpg");
  Mat src1 = src.clone();//将格式指派給src1
  namedWindow("效果圖視窗", 1); 
  namedWindow("效果圖視窗1", 1);
  Canny(src, src1, 150, 100, 3);
  imshow("效果圖視窗", src1);
  waitKey(30); Mat dst, edge, gray;
  dst.create(src.size(), src.type());//建立與src同類型和大小的矩陣(dst)
  cvtColor(src, gray, CV_BGR2GRAY);//将原圖像轉換為灰階圖像  
  blur(gray, edge, Size(3, 3));//先用使用 3x3核心來降噪  
  Canny(edge, edge, 3, 9, 3);//運作Canny算子
  dst = Scalar::all(0);//将g_dstImage内的所有元素設定為0 
  src.copyTo(dst, edge);//使用Canny算子輸出的邊緣圖
  //g_cannyDetectedEdges作為掩碼,來将原圖g_srcImage拷到目标圖g_dstImage中  
  imshow("效果圖視窗1", dst);//顯示效果圖  
  waitKey(30);
  return 0;
 }C++: void Canny(InputArray image,OutputArray edges, double threshold1, double threshold2, int apertureSize=3,bool L2gradient=false )      
  • 第二個參數,OutputArray類型的edges,輸出的邊緣圖,需要和源圖檔有一樣的尺寸和類型。
  • 第三個參數,double類型的threshold1,第一個滞後性門檻值。
  • 第四個參數,double類型的threshold2,第二個滞後性門檻值。
  • 第五個參數,int類型的apertureSize,表示應用Sobel算子的孔徑大小,其有預設值3。
  • 第六個參數,bool類型的L2gradient,一個計算圖像梯度幅值的辨別,有預設值false
  • 需要注意的是,這個函數門檻值1和門檻值2兩者的小者用于邊緣連接配接,而大者用來控制強邊緣的初始段,推薦的高低門檻值比在2:1到3:1之間。