Python OpenCV Sobel 算子、Scharr 算子、laplacian 算子 复盘学习

article/2025/7/17 9:22:53

Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧。本篇博客是这个系列的第 46 篇。
该系列文章导航参考:https://blog.csdn.net/hihell/category_10688961.html

Python OpenCV

    • 基础知识铺垫
      • Sobel 算子
      • Scharr 算子
      • laplacian 算子
    • 橡皮擦的小节

基础知识铺垫

关于 Sobel 算子、Scharr 算子、laplacian 算子在 这篇博客 中已经学习过了,第二次学习,可以针对算子卷积核进行一下稍微深入一点的理解。

Sobel 算子

使用该函数时,卷积核在 X 方向为: [ − 1 0 + 1 − 2 0 + 2 − 1 0 + 1 ] \begin{bmatrix} -1&0&+1\\ -2&0&+2\\-1&0&+1 \end{bmatrix} 121000+1+2+1,在 Y 方向为 [ − 1 − 2 − 1 0 0 0 + 1 + 2 + 1 ] \begin{bmatrix} -1&-2&-1\\ 0&0&0\\+1&+2&+1 \end{bmatrix} 10+120+210+1

上述卷积核时一个 3x3 的矩阵,当其与一个图像进行卷积计算的时候,如果覆盖的矩阵是 [ p 1 p 2 p 3 p 4 p 5 p 6 p 7 p 8 p 9 ] \begin{bmatrix} p_1&p_2&p_3\\ p_4&p_5&p_6\\p_7&p_8&p_9 \end{bmatrix} p1p4p7p2p5p8p3p6p9

计算之后会得到如下结果 p 3 − p 1 + p 6 − p 4 + p 9 − p 7 p_3-p_1+p_6-p_4+p_9-p_7 p3p1+p6p4+p9p7 ,结果越大,差异越明显,还有为什么在 p 4 p_4 p4 p 6 p_6 p6 点,卷积核的值大,简单理解就是这个点距离中心点近。

先写一段测试代码如下:

import cv2 as cv
import numpy as npsrc = cv.imread('./star.png')gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)ret, thresh = cv.threshold(gray, 127, 255, cv.THRESH_BINARY_INV)# Sobel 算子计算边缘
sobel_x = cv.Sobel(thresh, -1, 1, 0, ksize=3)image = np.hstack((gray, thresh, sobel_x))
cv.imshow("image", image)
cv.waitKey()

运行结果如下:
Python OpenCV Sobel 算子、Scharr 算子、laplacian 算子 复盘学习
最后一幅图片获取到的是图形的左侧,原因是这样导致的。
Sobel 在计算的是时候是右侧减左侧下面减上面,查看二值化图形会发现,右侧减左侧会得到左侧边缘的原因是,图形左侧的边缘两边,右侧是白色 255,左侧是黑色 0,所以可以得到边缘,相同的方式,在图形右侧边缘部分,两边分别是右侧黑色、左侧白色,所以边缘缺失。

如果希望右侧边缘也同时出现,需要用到下述函数,将得到的负值获取绝对值。

另一处代码修改的地方在代码注释部分:

# Sobel 算子计算边缘
# 注意计算 sobel_x 的函数传递参数的时候,第二个参数从 -1 修改为 cv.CV_64F,目的是为了获取到负值,方便后面的获取绝对值操作。
sobel_x = cv.Sobel(thresh, cv.CV_64F, 1, 0, ksize=3)
sobel_x = cv.convertScaleAbs(sobel_x)
image = np.hstack((gray, thresh, sobel_x))

Python OpenCV Sobel 算子、Scharr 算子、laplacian 算子 复盘学习
上述代码计算的是 X 方向的边缘,同理计算一下 Y 方向的边缘,在合并 X 与 Y 方向的边缘,即可得到最后的图像边缘。

Python OpenCV Sobel 算子、Scharr 算子、laplacian 算子 复盘学习

import cv2 as cv
import numpy as npsrc = cv.imread('./star.png')gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)ret, thresh = cv.threshold(gray, 127, 255, cv.THRESH_BINARY_INV)# Sobel 算子计算边缘
sobel_x = cv.Sobel(thresh, cv.CV_64F, 1, 0, ksize=3)
sobel_y = cv.Sobel(thresh, cv.CV_64F, 0, 1, ksize=3)
sobel_x = cv.convertScaleAbs(sobel_x)
sobel_y = cv.convertScaleAbs(sobel_y)
sobel_xy = cv.addWeighted(sobel_x, 0.5, sobel_y, 0.5, 0)
image = np.hstack((gray, sobel_xy, sobel_x, sobel_y))
cv.imshow("image", image)
cv.waitKey()

合并之后运行结果如下,一般不建议直接计算 X 和 Y 方向的 Sobel,而应该分别计算之后再进行合并。
Python OpenCV Sobel 算子、Scharr 算子、laplacian 算子 复盘学习
可以对比一下分开计算再合并与直接计算的效果差异。

Python OpenCV Sobel 算子、Scharr 算子、laplacian 算子 复盘学习
上述图片是由下面的代码运行得到的结果

import cv2 as cv
import numpy as npsrc = cv.imread('./t3.jpg')gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)ret, thresh = cv.threshold(gray, 127, 255, cv.THRESH_BINARY_INV)# Sobel 算子分开计算
sobel_x = cv.Sobel(thresh, cv.CV_64F, 1, 0, ksize=3)
sobel_y = cv.Sobel(thresh, cv.CV_64F, 0, 1, ksize=3)
sobel_x = cv.convertScaleAbs(sobel_x)
sobel_y = cv.convertScaleAbs(sobel_y)
sobel_xy = cv.addWeighted(sobel_x, 0.5, sobel_y, 0.5, 0)# 直接计算
sobel_xy1 = cv.Sobel(thresh, cv.CV_64F, 1, 1, ksize=3)
sobel_xy1 = cv.convertScaleAbs(sobel_xy1)
image = np.hstack((gray, sobel_xy, sobel_xy1))
cv.imshow("image", image)
cv.waitKey(0)

Scharr 算子

该算子有着比 Sobel 更好的精确度,主要因为它的卷积核是下面的数据
G x = [ − 3 0 + 3 − 10 0 + 10 − 3 0 + 3 ] G_x =\begin{bmatrix}-3&0&+3\\ -10&0&+10\\-3&0&+3 \end{bmatrix} Gx=3103000+3+10+3
G y = [ − 3 − 10 − 3 0 0 0 − 3 − 10 − 3 ] G_y =\begin{bmatrix}-3&-10&-3\\ 0&0&0\\-3&-10&-3 \end{bmatrix} Gy=30310010303
使用的时候依旧是分开计算

import cv2 as cv
import numpy as npsrc = cv.imread('./t3.jpg')gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)ret, thresh = cv.threshold(gray, 127, 255, cv.THRESH_BINARY_INV)# Scharr 算子分开计算
scharr_x = cv.Scharr(thresh, cv.CV_64F, 1, 0)
scharr_y = cv.Scharr(thresh, cv.CV_64F, 0, 1)
scharr_x = cv.convertScaleAbs(scharr_x)
scharr_y = cv.convertScaleAbs(scharr_y)
scharr_xy = cv.addWeighted(scharr_x, 0.5, scharr_y, 0.5, 0)image = np.hstack((gray, scharr_xy))
cv.imshow("image", image)
cv.waitKey(0)

Python OpenCV Sobel 算子、Scharr 算子、laplacian 算子 复盘学习

laplacian 算子

概算子的卷积核如下:
G = [ 0 1 0 1 − 4 1 0 1 0 ] G =\begin{bmatrix}0&1&0\\ 1&-4&1\\0&1&0 \end{bmatrix} G=010141010
laplacian 算子噪点敏感,在使用的时候需要提前去噪。

橡皮擦的小节

希望今天的 1 个小时你有所收获,我们下篇博客见~

相关阅读


技术专栏

  1. Python 爬虫 100 例教程,超棒的爬虫教程,立即订阅吧
  2. Python 爬虫小课,精彩 9 讲

今天是持续写作的第 88 / 100 天。
如果你想跟博主建立亲密关系,可以关注同名公众号 梦想橡皮擦,近距离接触一个逗趣的互联网高级网虫。
博主 ID:梦想橡皮擦,希望大家点赞评论收藏


http://chatgpt.dhexx.cn/article/j5tyKjer.shtml

相关文章

矢量场分析

矢量分析 向量微分算子 ∇ [ ∂ ∂ x ∂ ∂ y ∂ ∂ z ] T \nabla\left[\frac{\partial}{\partial {x}} \frac{\partial}{\partial {y}} \frac{\partial}{\partial{z}}\right]^T ∇[∂x∂​∂y∂​∂z∂​]T算子是一个形式向量,它可以作用于标量 f f f与向量 F ⃗…

Laplace算子

背景简述 在图像处理,我们知道经常把Laplace算子作为边缘检测之一,也是工程数学中常用的一种积分变换。本节主要介绍Laplacian 算子相关的知识。 基本理论 首先,拉普拉斯算子是最简单的各向同性微分算子,它具有旋转不变性。一个二…

使用二阶微分锐化图像(拉普拉斯算子)基本原理及Python实现

1. 拉普拉斯算子 1.1 简介 一种典型的各向同性的微分算子,可用于检测图像中灰度图片的区域 $$ \nabla^{2} f\frac{\partial^{2} f}{\partial x^{2}}\frac{\partial^{2} f}{\partial y^{2}} $$ 根据上述的差分近似可以推导出 $$ \nabla^{2} f(x, y)f(x1, y)f(x-1, y)…

卷积神经网络 作业

文章目录 卷积神经网络 作业1. 高斯拉普拉斯算子(边缘检测)1.1 简介1.2 拉普拉斯算子1.3 高斯拉普拉斯算子1.3 LoG使用指南1.4 总结1.5 代码实现 2. 使用LeNet网络,输出特征图2.1 作业要求2.2 代码实现 卷积神经网络 作业 1. 高斯拉普拉斯算子(边缘检测) 作业要求…

深度学习传统CV算法——二阶微分边缘算子

二阶微分边缘算子 二阶微分边缘算子二阶微分边缘算子基本思想Laplace 算子拉普拉斯表达式图像中的Laplace 算子Laplace算法过程Laplace算子的旋转不变性证明Laplace算子优缺点 LOG算子LoG解决的问题LoG算子的计算过程LoG的卷积模板LoG算法过程DoG与LoGLoG算子优缺点 Canny算子C…

MATLAB - 拉普拉斯算子可视化

1、拉普拉斯算子 ∇ 2 \nabla^ 2 ∇2 拉普拉斯算子有很多用途,在物理中常用于波动方程、热传导方程和亥姆霍兹方程的数学模型;在静电学中,拉普拉斯方程和泊松方程的应用随处可见;在数学中,经拉普拉斯算子运算运算为零…

一文读懂Nabla算子

文章目录 ∇ \nabla ∇算子的介绍梯度、散度和旋度不同坐标系下 ∇ \nabla ∇算子的形式 ∇ \nabla ∇算子运算律 ∇ \nabla ∇算子常用公式补充内容 参考文献及视频 ∇ \nabla ∇算子的介绍 ∇ \nabla ∇称作Nabla算子或del算子(算子是一种映射,可以理解…

【CSS 表格属性(Table)】

CSS 表格属性 Table 1. border-collapse 属性: 单元格/表格 边框 合并2. border-spacing 属性: 设置 表格/单元格 边框间距 /间隔距离 (搭配 border-collapse 属性 )3. caption-side 属性: 设置 表格标题的位置4. empty-cells 属性: 设置 表格 空单元格的显示 (空单…

html里table属性值,html——table标签属性总结

table标签属性 table标签 border border标签属性:设定围绕表格的边框的宽度:table 111111111border标签属性不仅设置围绕表格边框的宽度,还为每个单元格添加宽度为1px的边框 实际开发中不建议使用border标签属性实现边框效果,建议通过为table、th和td设定border样式属性实现…

css table属性

表格边框 指定CSS表格边框,使用border属性。 下面的例子指定了一个表格的th和td元素的黑色边框: 在上面的例子中的表格有双边框。这是因为表和th/ td元素有独立的边界。 为了显示一个表的单个边框,使用 border-collapse属性 折叠边框 border-…

elementUI表格table的列内置样式修改方法/对比template,列属性class-name,table属性cell-class-name

1,table属性cell-class-name的使用可以作用到某一行,或者某一列等等。但是在style标签中要去掉scoped,不然无效。 (在elementUI中,row-class-name、row-style、cell-class-name等属性要想生效必须使用全局class才能生…

html中table标签及属性

table表格 HTML表格由table标签以及多个tr、th和td标签组成table表示表格&#xff0c;整个表格要包含在<table></table>标签中tr表示表格中的行&#xff0c;是单元格的容器&#xff0c;一行可以包括多个单元格th表示表格中的单元格&#xff0c;我理解为列,th放在t…

Antd 3.0 table,表格组件(Table属性,Column属性,RowSelection属性)

Antd 3.0 table&#xff0c;表格组件&#xff08;Table属性&#xff0c;Column属性&#xff0c;RowSelection属性&#xff09; 一、Table属性 ​ 常用参数说明&#xff1a; 参数说明类型默认dataSource数据数组any[]columns表格列的配置描述&#xff0c;具体项见下表ColumnP…

<table>标签的属性

1.border border属性用于设置表格的边框&#xff0c;默认值为0。 2.cellspacing cellspacing属性用于设置单元格于单元格之间的空间&#xff0c;默认值为2px。 3.cellpadding cellpadding属性用于设置单元格于单元格之间的空白间距&#xff0c;默认值为1px。 4.width、h…

html-table标签属性总结

table标签属性 table标签borderwidthborder-spacingborder-collapsemargin tr标签heightbackground-colortext-alignvertical-align td标签合并单元格合并行单元格rowspan合并列单元格colspan table标签 border border标签属性&#xff1a;设定围绕表格的边框的宽度&#xff…

2.9CSS table属性

表格边框 指定CSS表格边框&#xff0c;使用border属性。 下面的例子指定了一个表格的Th和TD元素的黑色边框&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>菜鸟教程(runoob.com)</title><style&g…

Vue+Element el-table属性row-class-name用法及踩坑

el-table属性row-class-name用法及踩坑 需求前提&#xff1a;想要给表格的某一行加上不同的background&#xff0c;用来区分当前行的状态 根据官方给出的文档官方文档 在el-table中绑定自定义属性row-class-name <el-table:data"tableData"style"width: 10…

HTML中的table标签属性

表格 表格是由行和列排列而成的一种结构 HTML表格由table标签以及一个或多个tr、th或td标签组成&#xff1a; table标签用来定义表格&#xff0c;整个表格包含在<table>和</table>标签中&#xff1b; tr标签用来定义表格中一个行&#xff0c;它是单元格的容器&…

html之table属性

目标&#xff1a; 1&#xff0c;table标签属性 2&#xff0c;table通用属性 3&#xff0c;tr标签属性 4&#xff0c;td标签属性 上一节我们说了table简单结构和复杂结构&#xff0c;这一节我们来看一下table的属性 1&#xff0c;table标签属性 1&#xff0c;边框border&#xf…

table常用的几个重要属性

效果图如下&#xff1b; border 规定表格边框的宽度 cellpadding 规定单元边沿与其内容之间的空白 cellspacing 规定单元格之间的空白 width 规定表格的宽度 border-collapse: collapse; 为表格设置合并边框模型 默认值为separate rowspan跨行合并单元格 colspan跨列合并单元格…