本小節(jié)代碼在配套資料“iTOP-3568 開發(fā)板\03_【iTOP-RK3568 開發(fā)板】指南教程\04_OpenCV 開發(fā)配套資料\33”目錄下,如下圖所示:
在 Sobel 算子算法函數(shù)中,如果設(shè)置 ksize=-1 就會使用 3x3 的 Scharr 濾波器。Scharr 算子是 Soble 算子在 ksize=3 時的優(yōu)化,與 Soble 的速度相同,且精度更高。Scharr 算子與 Sobel
算子的不同點是在平滑部分,其中心元素占的權(quán)重更重,相當(dāng)于使用較小標(biāo)準(zhǔn)差的高斯函數(shù),也就是更瘦高的模板。
Scharr 算子的卷積核為:
cv2.Scharr 函數(shù)功能:
使用 Scharr 算子進行邊緣檢測。
函數(shù)原型:
dst = cv2.Scharr(src, ddepth, dx, dy[, dst[, scale[, delta[, borderType]]]])
參數(shù)定義:
dst 代表目標(biāo)圖像。
src 代表原始圖像。
ddepth 代表輸出圖像的深度。
dx 代表 x 方向上的求導(dǎo)階數(shù)。
dy 代表 y 方向上的求導(dǎo)階數(shù)。
scale 代表計算導(dǎo)數(shù)值時所采用的縮放因子,默認(rèn)情況下該值是 1,是沒有縮放的。
delta 代表加在目標(biāo)圖像 dst 上的值,該值是可選的,默認(rèn)為 0。
borderType 代表邊界樣式。
實驗:
實驗要求:
使用 cv2.Scharr 函數(shù),分別對 x 軸和 y 軸進行邊緣檢測,隨后使用 cv2.addWeighted 函數(shù)以 0.5:0.5 的比例將兩個圖像進行融合,最后使用 cv2.imshow()函數(shù)對原圖和邊緣檢測的三個圖像進行展示
實驗步驟:
首先進入到 ubuntu 的終端界面將“iTOP-3568 開發(fā)板\03_【iTOP-RK3568 開發(fā)板】指南教程\04_OpenCV 開發(fā)配套資料\33”路徑下的 number.png 拷貝到 ubuntu 虛擬機上,拷貝完成如
下圖所示:
然后來到 ubuntu 虛擬機的終端界面,輸入以下命令來創(chuàng)建 demo33_Scharr.py 文件,如下圖所示:
vim demo33_Scharr.py
然后向該文件中添加以下內(nèi)容:
1 import cv2 #opencv 的縮寫為 cv2,導(dǎo)入 opencv
2 img = cv2.imread('number.png',1) #flags 參數(shù)為 1,返回彩色圖像
3 cv2.imshow('原圖',img)#通過 cv2.imshow()函數(shù)展示原圖
4 scharrx = cv2.Scharr(img,cv2.CV_64F,1,0)# 使用 Sobel 算子進行邊緣檢測,數(shù)據(jù)類型設(shè)置為 cv2.CV_64F,只算 x
5 方向梯度,Sobel 核大小設(shè)置為 3
6 scharrx = cv2.convertScaleAbs(scharrx) # 計算絕對值
7 cv2.imshow('scharrx',scharrx)#通過 cv2.imshow()函數(shù)展示 x 方向梯度邊緣檢測計算之后的圖像
8 scharry = cv2.Scharr(img,cv2.CV_64F,0,1) #使用 Sobel 算子進行邊緣檢測,數(shù)據(jù)類型設(shè)置為 cv2.CV_64F,只算 x
9 方向梯度,Sobel 核大小設(shè)置為 3
10 scharry = cv2.convertScaleAbs(scharry) #計算絕對值
11 cv2.imshow('scharry',scharry)#通過 cv2.imshow()函數(shù)展示 y 方向梯度邊緣檢測計算之后的圖像
12 scharrxy = cv2.addWeighted(scharrx,0.5,scharry,0.5,0) # 圖像融合的系數(shù)比為 0.5:0.5,0 表示偏置項
13 cv2.imshow('sobelxy',scharrxy)#通過 cv2.imshow()函數(shù)展示融合之后的圖像
14 cv2.waitKey(0)#等待下一次按鍵按下
15
第 1 行導(dǎo)入了 opencv 庫;
第 2 行使用了 imread()函數(shù)對 number.png 圖片進行讀??;
第 3 行使用了 imshow()函數(shù)對原圖像進行展示;
第 4 行使用 Scharr 算子進行邊緣檢測計算,數(shù)據(jù)類型設(shè)置為 cv2.CV_64F,只算 x 方向梯度;
第 8 行使用 Scharr 算子進行邊緣檢測計算,數(shù)據(jù)類型設(shè)置為 cv2.CV_64F,只算 y 方向梯度;
第 6 行和第 10 行使用了 convertScaleAbs()函數(shù)獲取絕對值,并將圖像轉(zhuǎn)換為 8 位;
第 7 行和第 11 行使用了 imshow()函數(shù)對兩個方向梯度進行邊緣檢測計算之后的圖像進行展示;
第 12 行使用了 addWeighted()函數(shù)進行圖像融合,兩個圖像的融合系數(shù)比為 0.5:0.5;
第 14 行使用了 imshow()函數(shù)對融合之后的圖像進行展示;
第 15 行使用了 waitKey()函數(shù),持續(xù)顯示展示照片直到按鍵的按下。
保存退出之后,在終端界面中輸入以下命令進行 python 代碼的運行,運行結(jié)果如下圖所示:
python demo33_Scharr.py
第 1 張圖為原圖,一個數(shù)獨圖像被顯示了出來,第 2 張圖像為 x 軸方向梯度經(jīng)過邊緣檢測計算的圖像,可以看到縱向的線條被很好的區(qū)分了出來,第 3 張圖像為 y 軸方向梯度經(jīng)過邊緣
檢測計算的圖像,可以看到橫向的線條被很好的區(qū)分了出來,第 4 張圖像為兩張邊緣計算圖像的融合,可以看到圖像的邊緣特點被很好的展現(xiàn)了出來。至此 Scharr 算子邊緣計算相關(guān)的實驗就結(jié)束了。
更多文檔可以查看
B站搜索-北京迅為RK3568開發(fā)板,
公眾Hao關(guān)注:北京迅為,