新闻  |   论坛  |   博客  |   在线研讨会
迅为RK3568开发板Scharr滤波器算子边缘检测
红李亚 | 2023-10-09 10:58:32    阅读:80   发布文章

本小节代码在配套资料“iTOP-3568 开发板\03_【iTOP-RK3568 开发板】指南教程\04_OpenCV 开发配套资料\33”目录下,如下图所示:

在 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关注:北京迅为,


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
推荐文章
最近访客