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