
在 Sobel 算子算法函數中,如果設置 ksize=-1 就會使用 3x3 的 Scharr 濾波器。Scharr 算子是 Soble 算子在 ksize=3 時的優化,與 Soble 的速度相同,且精度更高。Scharr 算子與 Sobel
算子的不同點是在平滑部分,其中心元素占的權重更重,相當于使用較小標準差的高斯函數,也就是更瘦高的模板。
Scharr 算子的卷積核為:

cv2.Scharr 函數功能:
使用 Scharr 算子進行邊緣檢測。
函數原型:
dst = cv2.Scharr(src, ddepth, dx, dy[, dst[, scale[, delta[, borderType]]]])
參數定義:
dst 代表目標圖像。
src 代表原始圖像。
ddepth 代表輸出圖像的深度。
dx 代表 x 方向上的求導階數。
dy 代表 y 方向上的求導階數。
scale 代表計算導數值時所采用的縮放因子,默認情況下該值是 1,是沒有縮放的。
delta 代表加在目標圖像 dst 上的值,該值是可選的,默認為 0。
borderType 代表邊界樣式。
實驗:
實驗要求:
使用 cv2.Scharr 函數,分別對 x 軸和 y 軸進行邊緣檢測,隨后使用 cv2.addWeighted 函數以 0.5:0.5 的比例將兩個圖像進行融合,最后使用 cv2.imshow()函數對原圖和邊緣檢測的三個圖像進行展示
實驗步驟:
首先進入到 ubuntu 的終端界面將“iTOP-3568 開發板\03_【iTOP-RK3568 開發板】指南教程\04_OpenCV 開發配套資料\33”路徑下的 number.png 拷貝到 ubuntu 虛擬機上,拷貝完成如
下圖所示:

然后來到 ubuntu 虛擬機的終端界面,輸入以下命令來創建 demo33_Scharr.py 文件,如下圖所示:
vim demo33_Scharr.py

然后向該文件中添加以下內容:
1 import cv2 #opencv 的縮寫為 cv2,導入 opencv
2 img = cv2.imread('number.png',1) #flags 參數為 1,返回彩色圖像
3 cv2.imshow('原圖',img)#通過 cv2.imshow()函數展示原圖
4 scharrx = cv2.Scharr(img,cv2.CV_64F,1,0)# 使用 Sobel 算子進行邊緣檢測,數據類型設置為 cv2.CV_64F,只算 x
5 方向梯度,Sobel 核大小設置為 3
6 scharrx = cv2.convertScaleAbs(scharrx) # 計算絕對值
7 cv2.imshow('scharrx',scharrx)#通過 cv2.imshow()函數展示 x 方向梯度邊緣檢測計算之后的圖像
8 scharry = cv2.Scharr(img,cv2.CV_64F,0,1) #使用 Sobel 算子進行邊緣檢測,數據類型設置為 cv2.CV_64F,只算 x
9 方向梯度,Sobel 核大小設置為 3
10 scharry = cv2.convertScaleAbs(scharry) #計算絕對值
11 cv2.imshow('scharry',scharry)#通過 cv2.imshow()函數展示 y 方向梯度邊緣檢測計算之后的圖像
12 scharrxy = cv2.addWeighted(scharrx,0.5,scharry,0.5,0) # 圖像融合的系數比為 0.5:0.5,0 表示偏置項
13 cv2.imshow('sobelxy',scharrxy)#通過 cv2.imshow()函數展示融合之后的圖像
14 cv2.waitKey(0)#等待下一次按鍵按下
15
第 1 行導入了 opencv 庫;
第 2 行使用了 imread()函數對 number.png 圖片進行讀取;
第 3 行使用了 imshow()函數對原圖像進行展示;
第 4 行使用 Scharr 算子進行邊緣檢測計算,數據類型設置為 cv2.CV_64F,只算 x 方向梯度;
第 8 行使用 Scharr 算子進行邊緣檢測計算,數據類型設置為 cv2.CV_64F,只算 y 方向梯度;
第 6 行和第 10 行使用了 convertScaleAbs()函數獲取絕對值,并將圖像轉換為 8 位;
第 7 行和第 11 行使用了 imshow()函數對兩個方向梯度進行邊緣檢測計算之后的圖像進行展示;
第 12 行使用了 addWeighted()函數進行圖像融合,兩個圖像的融合系數比為 0.5:0.5;
第 14 行使用了 imshow()函數對融合之后的圖像進行展示;
第 15 行使用了 waitKey()函數,持續顯示展示照片直到按鍵的按下。
保存退出之后,在終端界面中輸入以下命令進行 python 代碼的運行,運行結果如下圖所示:
python demo33_Scharr.py

第 1 張圖為原圖,一個數獨圖像被顯示了出來,第 2 張圖像為 x 軸方向梯度經過邊緣檢測計算的圖像,可以看到縱向的線條被很好的區分了出來,第 3 張圖像為 y 軸方向梯度經過邊緣
檢測計算的圖像,可以看到橫向的線條被很好的區分了出來,第 4 張圖像為兩張邊緣計算圖像的融合,可以看到圖像的邊緣特點被很好的展現了出來。至此 Scharr 算子邊緣計算相關的實驗就結束了。
更多文檔可以查看
B站搜索-北京迅為RK3568開發板,
公眾Hao關注:北京迅為,