首页 > 编程问答 >使用 Sobel 算子理解梯度组合策略输出

使用 Sobel 算子理解梯度组合策略输出

时间:2024-08-05 04:48:35浏览次数:13  
标签:python numpy opencv image-processing

我尝试实现一个 Sobel Edge 检测器,如下所示:

def sobel(img):
    img = cv2.GaussianBlur(img, (5, 5), 0)
    
    filter_x = np.array([
        [-1, 0, 1],
        [-2, 0, 2],
        [-1, 0, 1]
    ])
    
    filter_y = np.array([
        [-1, -2, -1],
        [0, 0, 0],
        [1, 2, 1]
    ])
    
    S_x = cv2.filter2D(img, -1, filter_x)
    S_y = cv2.filter2D(img, -1, filter_y)
    
#     S_x = cv2.convertScaleAbs(S_x)
#     S_y = cv2.convertScaleAbs(S_y)
#     grad = S_x * 0.5 + S_y * 0.5
    grad = np.sqrt(S_x ** 2 + S_y ** 2)
    grad = np.clip(grad, 0, 255)
    return grad.astype(np.uint8)

img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
plt.figure(figsize=(10, 10))
edge = sobel(img_gray)
plt.imshow(edge, cmap='gray')

我得到的输出非常嘈杂。例如: Sobel output (L2)

发生这种情况是因为我正在计算 x 和 y 方向上梯度的 L2 幅度。然而,当我将策略切换为使用 L1 规范(即使用 `S_x * 0.5 + S_y * 0.5)时,我得到的输出噪音要小得多:

Sobel output (L1)

为什么会发生这种情况?根据各种消息来源,这两种组合都被使用,但我想了解为什么 L2 变体如此嘈杂,以及如何避免它。

谢谢!


你观察到,使用 L2 范数计算梯度幅值时 Sobel 边缘检测结果比使用 L1 范数噪声更大,这是因为这两种范数对异常值的敏感度不同。

L2 范数(或欧几里得范数) 计算平方梯度的平方根:(Gx² + Gy²)^(1/2)。它对大值给予更多权重,这使得它对噪声或图像中存在的急剧变化更加敏感。结果,噪声像素的梯度幅值会更高,导致边缘图中出现更多噪声。

L1 范数(或曼哈顿范数) 计算水平和垂直梯度的绝对值之和:|Gx| + |Gy|。它对异常值不太敏感,因为不涉及平方。因此,与 L2 范数相比,噪声像素对梯度幅值的影响较小,从而产生更平滑、噪声更小的边缘图。

那么,为什么还要使用 L2 范数呢?

尽管 L2 范数对噪声更敏感,但它也能够检测到更微弱的边缘和更高的各向同性。各向同性是指算子对所有方向上的边缘具有同等响应的能力。由于 L2 范数考虑了梯度的幅值和方向,因此它在检测具有不同方向的边缘方面做得更好。

如何减少 L2 范数中的噪声?

  1. 预先平滑: 正如你所做的那样,在应用 Sobel 算子之前,通过使用高斯模糊或中值滤波等技术对图像进行平滑处理,可以减少噪声。平滑有助于抑制噪声像素,使 Sobel 算子不那么容易受到这些像素的影响。

  2. 阈值调整: 应用 Sobel 算子后,可以使用阈值来区分边缘像素和非边缘像素。通过调整阈值,你可以控制边缘图的灵敏度和噪声量。较高的阈值将导致检测到的边缘较少,但也减少了噪声。

  3. 使用不同的梯度组合技术: 除了 L1 和 L2 范数之外,还可以使用其他梯度组合技术,例如 Canny 边缘检测器,它使用滞后阈值和非最大值抑制来生成更清晰、更连续的边缘。

总之,L1 和 L2 范数都有其优缺点。L1 范数对噪声不太敏感,而 L2 范数可以检测到更微弱的边缘并提供更好的各向同性。最佳选择取决于特定的应用和所需的噪声水平与边缘检测灵敏度之间的权衡。

标签:python,numpy,opencv,image-processing
From: 78831701

相关文章

  • Python mido 未检测到 Raspberry Pi 中的键盘输入
    我有一个简单的python代码,它通过连接到PC的USB从音乐键盘获取MIDI信号,然后将命令发送到Arduino板以写入其数字输出。这工作得很好,没有任何问题。我尝试将相同的代码迁移到RaspberryPi,并进行一些特定于Pi的修改。我的代码如下:importpygameimportmidoimportr......
  • Python 初学者,遇到简单数学问题
    我必须做一个数学练习,要求我以10^-5的幅度构建√3。使用扫描方法和Python。我是法国人,所以我不知道是否“扫描”是正确的词。在练习的前面,我得到了一些提示:√3是方程x^2-3=0的解,我需要达到x*的点y是负数所以我尝试了这个:x=1y=1+10......
  • python字典
    字典概念一种数据结构,用于储存键值对键:值=key:value键会有对应的值,键是用来查找值的(字→键,释义→值)字典名={}要在字典里放入多个键值对,就用"{}"把它们包住,键和值之间用":"表示对应,键值对之间用","分隔。用法如果我们要获取某个键的值,在字典名后面跟方括......
  • python+flask计算机毕业设计健康管理系统的设计与实现(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景近年来,随着人们生活水平的提高和健康意识的增强,健康管理已成为社会关注的焦点。传统的健康管理方式往往依赖于纸质记录和医生的口头建议,这......
  • python+flask计算机毕业设计实验室信息化管理系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在当今快速发展的科技时代,实验室作为科研与教学的核心场所,其管理效率和信息化水平直接影响到研究成果的质量和速度。传统的实验室管理方式......
  • python+flask计算机毕业设计中国诗词鉴赏网站(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景中国诗词作为中华文化的重要组成部分,承载着千年的历史与文化底蕴。从古至今,诗词一直是文人墨客表达情感、描绘景象的重要工具。然而,随着时......
  • python+flask计算机毕业设计装修公司管理系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景近年来,随着城市化进程的加速和人们生活水平的提高,装修行业迎来了前所未有的发展机遇。然而,传统装修公司管理方式存在诸多弊端,如信息不透明......
  • Python基础算法笔记
    整理自B站视频https://www.bilibili.com/video/BV1uA411N7c5递归1.汉诺塔问题#n个圆盘,从a经过b移动到cdefhanoi(n,a,b,c):ifn>0:#将n-1个圆盘从a经过c移动到bhanoi(n-1,a,c,b)#将最底层的圆盘从a移动到cprint("mov......
  • 24412-Python链接LDAP(Kerbores)认证的Impala
    24412-Python链接LDAP(Kerbores)认证的Impala必须安装pyImpala才行pipinstallimpylaPython3.x链接LDAP(Kerbores)认证的Impala代码fromimpala.dbapiimportconnectimpala_host="172.10.194.101"impala_port="25004"impala_user='huabingood_test&......
  • Python_DAG-有向无环图-igraph
    DAG-有向无环图-igraph安装pipinstallpython-igraphpipinstallpycairopiplist发现Python安装的有igraph包有两个:igraph、python-igraph有向图 有向图(Digraph)是图论中的一种图结构,其中的边(弧)具有方向性,表明从一个节点(顶点)到另一个节点的单向关系。与无向图不同,无向......