当前位置: 首页 > news >正文

opencv常用边缘检测算子示例

opencv常用边缘检测算子示例

    • 1. Canny算子
    • 2. Sobel算子
    • 3. Scharr算子
    • 4. Laplacian算子
    • 5. 对比


1. Canny算子

从不同视觉对象中提取有用的结构信息并大大减少要处理的数据量的一种技术,检测算法可以分为以下5个步骤:

  1. 噪声过滤(高斯滤波)
  2. 计算图像梯度(Sobel滤波)
  3. 非极大值抑制(消除边缘检测带来的杂散响应)
  4. 双阈值处理(确定真实和潜在的边缘)
  5. 滞后阈值(抑制孤立的弱边缘)
import cv2
import matplotlib.pyplot as plot

img = cv2.imread('tmp.jpg', cv2.IMREAD_GRAYSCALE)
# 第2、3参数分别是低、高阈值
es = cv2.Canny(img, 100, 200)

plot.figure(figsize=(6,3))
plot.subplot(1,2,1)
plot.title('Source image')
plot.imshow(img)
plot.subplot(1,2,2)
plot.title('Canny')
plot.imshow(es)

plt.show()

在这里插入图片描述

2. Sobel算子

一种离散一阶导数的边缘检测算子,用于计算图像灰度函数的近似梯度,常用于边缘检测和特征提取,可以分别计算图像在X、Y方向的梯度。

import cv2
import numpy as np
import matplotlib.pyplot as plot

img = cv2.imread('tmp.jpg', cv2.IMREAD_GRAYSCALE)
sx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5)
sy = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=5)
sxy = np.sqrt(sx**2 + sy**2)
sxy = np.clip(sxy,0,255)

plot.figure(figsize=(12,3))
plot.subplot(1,4,1)
plot.title('Source image')
plot.imshow(img)
plot.subplot(1,4,2)
plot.title('Sobel x')
plot.imshow(sx)
plot.subplot(1,4,3)
plot.title('Sobel y')
plot.imshow(sy)
plot.subplot(1,4,4)
plot.title('Sobel x+y')
plot.imshow(sxy)

plt.show()

在这里插入图片描述

3. Scharr算子

由Scharr提出的,用于替代Sobel算子,用于需要更高精度的边缘检测时,作为高精度边缘检测算子,用法跟Sobel类似。

import cv2
import numpy as np
import matplotlib.pyplot as plot

img = cv2.imread('tmp.jpg', cv2.IMREAD_GRAYSCALE)
sx = cv2.Sobel(img, ddepth=cv2.CV_64F, dx=1, dy=0)
sy = cv2.Sobel(img, ddepth=cv2.CV_64F, dx=0, dy=1)
sx = cv2.convertScaleAbs(sx)
sy = cv2.convertScaleAbs(sy)
sxy = cv2.addWeighted(sx,0.5, sy, 0.5, 0)

plot.figure(figsize=(12,3))
plot.subplot(1,4,1)
plot.title('Source image')
plot.imshow(img)
plot.subplot(1,4,2)
plot.title('Scharr x')
plot.imshow(sx)
plot.subplot(1,4,3)
plot.title('Scharr y')
plot.imshow(sy)
plot.subplot(1,4,4)
plot.title('Scharr x+y')
plot.imshow(sxy)

plt.show()

在这里插入图片描述

4. Laplacian算子

一种基于二阶导数的边缘检测方法,利用拉普拉斯算子来检测图像中强度变化的区域(边缘),即通过计算图像的二阶导数,找到图像亮度的突变点,从而定位边缘的位置。

import cv2
import matplotlib.pyplot as plot

img = cv2.imread('tmp.jpg', cv2.IMREAD_GRAYSCALE)
la = cv2.Laplacian(img, cv2.CV_64F)

plot.figure(figsize=(6,3))
plot.subplot(1,2,1)
plot.title('Source image')
plot.imshow(img)
plot.subplot(1,2,2)
plot.title('Laplacian')
plot.imshow(la)

plt.show()

在这里插入图片描述

5. 对比

算法优点缺点适用场景
Canny 算子噪声抑制能力强,边缘检测效果好参数调节较为复杂通用边缘检测,适合大多数场景
Sobel 算子计算简单,适合检测水平和垂直边缘对噪声敏感,边缘检测效果一般检测水平和垂直边缘
Scharr 算子对边缘的响应更强,适合检测细微边缘对噪声敏感检测细微的边缘
Laplacian 算子可以检测边缘和角点对噪声非常敏感检测边缘和角点

相关文章:

  • 怎么做自己淘宝优惠券网站东莞网站自动化推广
  • wordpress建站图片效果百度公司招聘2022年最新招聘
  • 开发小程序平台seo网站自动发布外链工具
  • 纯图片网站sem托管公司
  • 做司考题的网站安徽搜索引擎优化seo
  • 网站开发 jsp开发工具互联网营销推广怎么做
  • Java 并发-newFixedThreadPool
  • Java——接口扩展
  • 记录一下移动端uView动态表单校验
  • 安装npm install element-plus --save报错
  • OpenCV 图形API(24)图像滤波-----双边滤波函数bilateralFilter()
  • 随机森林与决策树
  • 什么是虚拟线程?与普通线程的区别
  • python基础语法14-多线程与多进程
  • 校园智能硬件国产化的现状与意义
  • 使用层次聚类算法对wine数据集进行聚类分析
  • Flink的数据流图中的数据通道 StreamEdge 详解
  • 如何保持自己在职场的核心竞争力
  • Python贝叶斯回归、强化学习分析医疗健康数据拟合截断删失数据与参数估计3实例
  • icoding题解排序
  • NO.87十六届蓝桥杯备战|动态规划-完全背包|疯狂的采药|Buying Hay|纪念品(C++)
  • x265 编码器中运动搜索 ME 方法对比实验
  • C++基础精讲-03
  • 苍穹外卖总结
  • 【Web API系列】WebSocketStream API 深度实践:构建高吞吐量实时应用的流式通信方案
  • 23种设计模式生活化场景,帮助理解