Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
CSDN 技术社区
skill_tree_opencv
提交
14b4baeb
S
skill_tree_opencv
项目概览
CSDN 技术社区
/
skill_tree_opencv
通知
47
Star
9
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
2
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
skill_tree_opencv
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
2
Issue
2
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
14b4baeb
编写于
12月 10, 2021
作者:
youcans_
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
上传新文件
上级
13ed05ca
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
93 addition
and
0 deletion
+93
-0
data/1.OpenCV初阶/3.图像增强和滤波/4.梯度/Gradient.md
data/1.OpenCV初阶/3.图像增强和滤波/4.梯度/Gradient.md
+93
-0
未找到文件。
data/1.OpenCV初阶/3.图像增强和滤波/4.梯度/Gradient.md
0 → 100644
浏览文件 @
14b4baeb
# Sobel 梯度算子
在图像处理中,梯度反映了像素值的最大变化率的方向,能够突出和提取边缘,常用于工业检测中产品缺陷检测和自动检测的预处理。
OpenCV 提供了三种梯度算子:Sobel、Scharr 和 Laplacian。Sobel 梯度算子是高斯平滑和微分求导的联合运算,抗噪声能力强。
Sobel 梯度算子很容易通过卷积操作 cv.filter2D 实现,OpenCV 也提供了函数
**cv.Sobel**
实现 Sobel 梯度算子。
**函数说明:**
```
cv.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]]) → dst
```
我们用 Sobel 算子从 Lena 图像提取边缘,看看会产生什么样的效果吧。
![](
./gradientOutput.png
)
下面对 Sobel 梯度算子实现代码正确的是?
## 答案
```
import cv2 as cv
if __name__ == '__main__':
img = cv.imread("lena.png", flags=1)
imgGray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
SobelX = cv.Sobel(imgGray, cv.CV_16S, 1, 0) # 计算 x 轴方向
SobelY = cv.Sobel(imgGray, cv.CV_16S, 0, 1) # 计算 y 轴方向
absX = cv.convertScaleAbs(SobelX) # 转回 uint8
absY = cv.convertScaleAbs(SobelY) # 转回 uint8
SobelXY = cv.addWeighted(absX, 0.5, absY, 0.5, 0) # 用绝对值近似平方根
cv.imshow("Sobel gradient", SobelXY)
cv.waitKey(0)
```
## 选项
### 函数 cv.Sobel() 缺少参数:数据深度 ddepth
```
import cv2 as cv
if __name__ == '__main__':
img = cv.imread("lena.png", flags=1)
imgGray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
SobelX = cv.Sobel(imgGray, 1, 0)
SobelY = cv.Sobel(imgGray, 0, 1)
absX = cv.convertScaleAbs(SobelX)
absY = cv.convertScaleAbs(SobelY)
SobelXY = cv.addWeighted(absX, 0.5, absY, 0.5, 0)
cv.imshow("Sobel gradient", SobelXY)
cv.waitKey(0)
```
### 梯度运算结果有正负,绝对值或平方和处理后才能加权
```
import cv2 as cv
if __name__ == '__main__':
img = cv.imread("lena.png", flags=1)
imgGray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
SobelX = cv.Sobel(imgGray, cv.CV_16S, 1, 0) # 计算 x 轴方向
SobelY = cv.Sobel(imgGray, cv.CV_16S, 0, 1) # 计算 y 轴方向
SobelXY = cv.addWeighted(SobelX, 0.5, SobelY, 0.5, 0) # 用绝对值近似平方根
cv.imshow("Sobel gradient", SobelXY)
cv.waitKey(0)
```
### 只对 x 轴方向进行了梯度运算
```
import cv2 as cv
if __name__ == '__main__':
img = cv.imread("lena.png", flags=1)
imgGray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
SobelX = cv.Sobel(imgGray, cv.CV_16S, 1, 0) # 计算 x 轴方向
absX = cv.convertScaleAbs(SobelX) # 转回 uint8
cv.imshow("Sobel gradient", absX)
cv.waitKey(0)
```
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录