OpenCV中有專門的Canny邊緣檢測算法的函數Canny(image,threshold1,threshold2,edges=None,apertureSize=None,L2gradient=None),我們可以直接調用它輕松實現圖像的邊緣檢測。
但是Canny()函數內部並沒有對圖像進行很好地降噪,因此為了保證結果更准確,我們在調用Canny()函數前常常會先通過高斯濾波降噪。OpenCV中提供了
GaussianBlur(src,ksize,sigmax,dst=None,sigmaY=None,borderType=None)函數來實現高斯濾波器降噪
高斯濾波-高斯降噪:
import cv2 image = cv2.imread("1.png",1) image_info =image.shape height=image_info[0] width=image_info[1] gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) cv2.imshow('gray',gray) image_G=cv2.GaussianBlur(gray,(5,5),0) #高斯濾波-高斯降噪 ''' 參數1 src:必選參數。待處理的圖像。它可以是單獨的任意通道數的圖像,但圖片深度必須為CV_8U,CV_16U,CV_16S,CV_32F以及CV_64F之一 參數2 ksize:必選參數。高斯內核的大小。其中ksize.width和ksize.height可以不同,但他們都必須為正數和奇數或者它們都為零。【用來計算的像素點】 參數3 sigmaX:必選參數。表示高斯內核函數在X方向的的標准偏差。 參數4 可選參數。sigmaY: 高斯核函數在Y方向上的標准偏差,如果sigmaY是0,則函數會自動將sigmaY的值設置為與sigmaX相同的值,如果sigmaX和sigmaY都是0,這兩個值將由ksize.width和ksize.height計算而來 ''' cv2.imshow("dst",image_G) cv2.waitKey()
效果圖:
可以看到,經過高斯平滑濾波降噪后的圖像會比原圖像模糊,因此通常高斯濾波我們也叫高斯模糊。這種模糊技術生成的圖像,其視覺效果就像是經過一個半透明屏幕在觀察圖像,其結果就是減少圖像的噪聲並降低細節層次。
import cv2 image = cv2.imread("wuhuan.jpg",1) image_info =image.shape height=image_info[0] width=image_info[1] gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) cv2.imshow('gray',gray) image_G=cv2.GaussianBlur(gray,(5,5),0) dst=cv2.Canny(image_G,50,50) #邊緣檢測 ''' 參數1 image:必選參數。表示原圖像數組,即8位輸入圖像 參數2 threshold1:必選參數。用於設置最小閾值 參數3 threshold2:必選參數。用於設置最大閾值--用於進一步刪選邊緣信息
最后決定哪些是邊緣,哪些是真正的邊,哪些不是邊。Canny邊緣檢測會設置兩個閾值,我們稱為高閾值(MaxVal)和低閾值(MinVal)。當像素點的幅值超過高閾值時,該像素點被保留為邊緣像素;當像素點的幅值小於低閩值時,該像素點被排除;當像素點位於低閾值和高閾值之間時,只有當像素點連接一個超過高閾值的像素時才被保留。
'''
cv2.imshow("dst",dst) cv2.waitKey()
效果圖: