[Opencv]圖像的梯度與邊緣檢測(轉)

文章來源:https://blog.csdn.net/on2way/article/details/46851451

  • 梯度簡單來講就是求導,在圖像上表現出來的就是提取圖像的邊緣(無論是橫向的、縱向的、斜方向的等等),所須要的無非也是一個核模板,模板的不一樣結果也不一樣。因此能夠看到,全部的這些個算子函數,歸結到底均可以用函數cv2.filter2D()來表示,不一樣的方法給予不一樣的核模板,而後演化爲不一樣的算子而已。而且這只是這類濾波函數的一個用途,曾經寫過一個關於matlab下濾波函數imfilter()的擴展應用(等同於opencv的cv2.filter2D函數):python

    圖像濾波函數imfilter函數的應用及其擴展web

    就是不少複雜的計算都是能夠經過這個濾波函數組合實現,這樣的話速度快。數組

(一)關於Sobel算子與Scharr算子

Sobel算子是高斯平滑與微分操做的結合體,因此其抗噪能力很強,用途較多。通常的sobel算子包括x與y兩個方向,算子模板爲:
markdown

s o b e l x = [ 1 0 1 2 0 2 1 0 1 ]

s o b e l y = [ 1 2 1 0 0 0 1 2 1 ]

在opencv函數中,還能夠設置卷積核(ksize)的大小,若是ksize=-1,就演變爲3*3的Scharr算子,模板無非變了個數字:
s c h a r r x = [ 3 0 3 10 0 10 3 0 3 ]

s c h a r r y = [ 3 10 3 0 0 0 3 10 3 ]

貼一個相關詳細參考:

OpenCV-Python教程(六、Sobel算子)svg

(二)關於拉普拉斯(Laplacian)算子

拉普拉斯算子能夠實現圖像的二階倒數的定義,至於二階倒數有什麼意義,能夠看這位博主的詳細介紹:函數

OpenCV-Python教程(七、Laplacian算子)ui

其核模板爲:
lua

k e r n e l = [ 0 1 0 1 4 1 0 1 0 ]

下面是對上述三種模板的實例:

import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('flower.jpg',0)
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)#默認ksize=3
sobely = cv2.Sobel(img,cv2.CV_64F,0,1)
sobelxy = cv2.Sobel(img,cv2.CV_64F,1,1)
laplacian = cv2.Laplacian(img,cv2.CV_64F)#默認ksize=3
#人工生成一個高斯核,去和函數生成的比較
kernel = np.array([[0,-1,0],[-1,4,-1],[0,-1,0]],np.float32)#
img1 = np.float64(img)#轉化爲浮點型的
img_filter = cv2.filter2D(img1,-1,kernel)
sobelxy1 = cv2.Sobel(img1,-1,1,1)

plt.subplot(221),plt.imshow(sobelx,'gray')
plt.subplot(222),plt.imshow(sobely,'gray')
plt.subplot(223),plt.imshow(sobelxy,'gray')
plt.subplot(224),plt.imshow(laplacian,'gray')

plt.figure()
plt.imshow(img_filter,'gray')

這裏寫圖片描述
這裏寫圖片描述
上述一個很重要的問題須要明白的就是,在濾波函數第二個參數,當咱們使用-1表示輸出圖像與輸入圖像的數據類型一致時,若是原始圖像是uint8型的,那麼在通過算子計算之後,獲得的圖像可能會有負值,若是與原圖像數據類型一致,那麼負值就會被截斷變成0或者255,使得結果錯誤,那麼針對這種問題有兩種方式改變(上述程序中都有):一種就是改變輸出圖像的數據類型(第二個參數cv2.CV_64F),另外一種就是改變原始圖像的數據類型(此時第二個參數能夠爲-1,與原始圖像一致)。
上述程序從結果上也說明使用函數cv2.filter2D也能達到相同的效果。spa

(三)Canny邊緣檢測算子

關於canny邊緣檢測算子,細究的話還算比較的複雜,給出一個介紹比較詳細的博客吧:.net

canny算子

那麼opencv中的函數也很是簡單,直接cv2.Canny(),這個函數須要五個參數,原始圖像,兩個範圍控制值minVal和maxVal(見上述原理介紹),第四個參數用於規定核模板的大小(默認3),最後一個是true與false(默認)的選擇,有一點不一樣,不過重要,能夠試着那個好用那個。

import cv2
import matplotlib.pyplot as plt

img = cv2.imread('flower.jpg',0)
edges = cv2.Canny(img,100,200)#其餘的默認
plt.subplot(121),plt.imshow(img,'gray')
plt.subplot(122),plt.imshow(edges,'gray')

這裏寫圖片描述

相關文章
相關標籤/搜索