Opencv笔记(十三)——图像的梯度
生活随笔
收集整理的這篇文章主要介紹了
Opencv笔记(十三)——图像的梯度
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目標
- 認識圖像梯度、邊界
- 學習函數cv2.Sobel(),cv2.Schar(),cv2.Laplacian()
原理
? 圖像梯度可以把圖像看成二維離散函數,圖像梯度其實就是這個二維離散函數的求導。OpenCV提供三種類型的梯度濾波器或高通濾波器,Sobel,Scharr和Laplacian.
Sobel 和 Scharr 算子
Sobel算子是結合了高斯平滑與微分運算的結合方法,所以它的抗噪聲能力很強,其是普通一階差分,是基于尋找梯度強度。每一個算子分別對應這x和y這兩個方向的模板,故在代碼中要分別在兩個方向上處理,最后用cv2.addWeighted(...)函數將其組合起來。
Sobel算子
Sobel函數原型如下:
cv2.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]])前四個是必須的參數:
- 第一個參數是需要處理的圖像;
- 第二個參數是圖像的深度(數據類型),-1表示采用的是與原圖像相同的深度。目標圖像的深度必須大于等于原圖像的深度;
- dx和dy表示的是求導的階數,0表示這個方向上沒有求導,一般為0、1、2;
其后是可選的參數:
- ksize是Sobel算子的大小,必須為1、3、5、7。如果ksize=-1,那么一個3*3的scharr濾波器會被使用;
- delta是一個可選的增量,將會加到最終的dst中,同樣,默認情況下沒有額外的值加到dst中;
- borderType是判斷圖像邊界的模式。這個參數默認值為cv2.BORDER_DEFAULT;
Laplacian算子
拉普拉斯算子是常用的邊緣檢測算子,它是各向同性的二階導數。
計算公式卷積核
代碼實踐
Sobel算子:
# coding=utf-8 import cv2 import numpy as npimg = cv2.imread("/home/wl/1.jpg", 0)x = cv2.Sobel(img, cv2.CV_16S, 1, 0) y = cv2.Sobel(img, cv2.CV_16S, 0, 1)absX = cv2.convertScaleAbs(x) # 轉回uint8 absY = cv2.convertScaleAbs(y)dst = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)while(1):cv2.imshow("absX", absX)cv2.imshow("absY", absY)cv2.imshow("Result", dst)k = cv2.waitKey(1) & 0XFFif k==ord('q'):break; cv2.destroyAllWindows()原圖:
效果圖:
Laplacian算子:
# coding=utf-8 import cv2 import numpy as npimg = cv2.imread("/home/wl/1.jpg", 0) laplacian=cv2.Laplacian(img,cv2.CV_64F) dst = cv2.convertScaleAbs(laplacian) #轉回uint8 while(1):cv2.imshow("Result",dst)k = cv2.waitKey(1) & 0XFFif k==ord('q'):break; cv2.destroyAllWindows()效果圖:
注意點
?? 代碼看了的話,會發現我們的sobel函數的第二個參數(數據類型)會換成cv2.CV_16S或cv2.CV_64F,最后再變回uint8。這是因為從黑到白的邊界點的導數是正數,而從白到黑是負數,如果還是使用uint8,那么所有的負數都會變為0,即被截斷。
轉載于:https://www.cnblogs.com/longwhite/p/10397752.html
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的Opencv笔记(十三)——图像的梯度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tablelayout的使用
- 下一篇: GIT学习笔记二(本地项目发布到GIT)