【课题总结】OpenCV 抠图项目实战(7)边缘检测

Python 小白的课题报告—OpenCV 抠图项目实战(7)

本系列是 Python 小白的课题作业《基于OpenCV 的图像分割和抠图》。
需要说明的是,本系列并不能算是 OpenCV 的抠图项目教程,只是以此为主题的课题报告。其中包括了一个较为完整的 PyQt 项目。

欢迎关注『Python 小白的项目实战 @ youcans』 原创作品
Python 小白的课题报告—OpenCV 抠图项目实战(1)目录摘要
Python 小白的课题报告—OpenCV 抠图项目实战(2)抠图绪论
Python 小白的课题报告—OpenCV 抠图项目实战(3)抠图综述
Python 小白的课题报告—OpenCV 抠图项目实战(4)固定阈值抠图
Python 小白的课题报告—OpenCV 抠图项目实战(5)自适应阈值抠图
Python 小白的课题报告—OpenCV 抠图项目实战(6)色彩范围抠图
Python 小白的课题报告—OpenCV 抠图项目实战(7)边缘检测
Python 小白的课题报告—OpenCV 抠图项目实战(8)图像轮廓
Python 小白的课题报告—OpenCV 抠图项目实战(9)评价指标
Python 小白的课题报告—OpenCV 抠图项目实战(10)PyQt5 使用
Python 小白的课题报告—OpenCV 抠图项目实战(11)算法实验平台
Python 小白的课题报告—OpenCV 抠图项目实战(12)源程序代码


第四章 图像分割

4.1 边缘检测

边缘是指图像中两个不同区域的边界线上连续的像素点的集合,是图像局部特征不连续性的反映,体现了灰度、颜色、纹理等图像特性的突变。
边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点。
边缘的灰度值呈现出阶跃型或屋顶型变化。阶跃型边缘两边像素点的灰度值存在着明显的差异,而屋顶型边缘则位于灰度值上升或下降的转折处。

梯度指出了像素值的最大变化率的方向,使用微分算子可以进行边缘检测:

  • 恒定灰度区域,一阶导数为零,二阶导数为零;
  • 灰度台阶或斜坡起点区域,一阶导数非零,,二阶导数非零;
  • 灰度斜坡区域,一阶导数非零,二阶导数为零。
    一阶导数、二阶导数的有限差分公式为:
    ∂f/∂x=f(x+1)−f(x)(∂2f)/(∂x2)=f(x+1)−2f(x)+f(x−1)∂f/∂x=f(x+1)-f(x)\\ (∂^2 f)/(∂x^2 )=f(x+1)-2f(x)+f(x-1) f/x=f(x+1)f(x)(2f)/(x2)=f(x+1)2f(x)+f(x1)

图像梯度提取方法简单直接,能够有效的描述图像的原始状态,因此发展出多种图像梯度算子,常用的有Laplacian、Soble和Canny算子。


1. 拉普拉斯算子(Laplacian)

最简单的各向同性导数算子(卷积核)是拉普拉斯算子(Laplacian)。

Laplace 是导数算子,会突出图像中的急剧灰度变化,抑制灰度缓慢变化区域,往往会产生暗色背景下的灰色边缘和不连续图像。将拉普拉斯图像与原图叠加,可以得到保留锐化效果的图像。

拉普拉斯卷积核很容易通过卷积操作 cv. filter_2d 实现,OpenCV 也提供了拉普拉斯算子 cv.Laplacian 来实现。

函数说明:

cv.Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]]) → dst

参数说明:

  • src:输入图像,可以是灰度图像,也可以是多通道的彩色图像
  • ddepth:输出图片的数据深度:
  • dst:输出图像,大小和类型与 src 相同
  • ksize:计算二阶导数滤波器的孔径大小,必须为正奇数,可选项
  • scale:缩放比例因子,可选项,默认值为 1
  • delta:输出图像的偏移量,可选项,默认值为 0
  • borderType:边界扩充的类型,注意不支持对侧填充(BORDER_WRAP)

使用Laplacian算子进行边缘检测的基本程序如下:


# MattingLaplacian.py
# edge detection by Laplacian
# Copyright 2021 youcans, XUPT
# Crated:2021-12-10import cv2 as cv
from matplotlib.figure import Figureimg = cv2.imread("../images/Fig0338a.tif", flags=0)  # NASA 月球影像图# 使用 cv2.Laplacian 实现 Laplace 卷积算子
imgLaplace2 = cv2.Laplacian(img, -1, ksize=3)
imgRecovery = cv2.add(img, imgLaplace2)  # 恢复原图像# 二值化边缘图再卷积
ret, binary = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_TRIANGLE)
imgLaplace3 = cv2.Laplacian(binary, cv2.CV_64F)
imgLaplace3 = cv2.convertScaleAbs(imgLaplace3)plt.figure(figsize=(9, 6))
plt.subplot(131), plt.axis('off'), plt.title("Original")
plt.imshow(img, cmap='gray', vmin=0, vmax=255)
plt.subplot(132), plt.axis('off'), plt.title("cv.Laplacian")
plt.imshow(imgLaplace2, cmap='gray', vmin=0, vmax=255)
plt.subplot(133), plt.axis('off'), plt.title("thresh-Laplacian")
plt.imshow(imgLaplace3, cmap='gray', vmin=0, vmax=255)
plt.tight_layout()
plt.show()

使用Laplacian算子进行边缘检测的结果如下图所示。

在这里插入图片描述

图4.1 Laplacian算子进行边缘检测

2. 索贝尔梯度算子(Sobel)

Sobel 算子是一种离散的微分算子,是高斯平滑和微分求导的联合运算,抗噪声能力强。
Sobel 梯度算子利用局部差分寻找边缘,计算得到梯度的近似值。先计算水平、垂直方向的梯度,再求总梯度。编程实现时,可以用绝对值近似平方根。
OpenCV 也提供了函数 cv.Sobel() 实现 Sobel 梯度算子。

函数说明:

cv.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]]) → dst

参数说明:

  • src:输入图像,灰度图像,不适用彩色图像
  • dst:输出图像,大小和类型与 src 相同
  • ddepth:输出图片的数据深度,由输入图像的深度进行选择
  • dx:x 轴方向导数的阶数,1 或 2
  • dy:y 轴方向导数的阶数,1 或 2
  • ksize:Sobel算子卷积核的大小
  • scale:缩放比例因子,可选项,默认值为 1
  • delta:输出图像的偏移量,可选项,默认值为 0

使用Sobel算子进行边缘检测的基本程序如下:

# MattingSobel.py
# edge detection by Sobel
# Copyright 2021 youcans, XUPT
# Crated:2021-12-10import cv2 as cv
from matplotlib.figure import Figureimg = cv2.imread("../images/imgGaia.tif", flags=0)# 使用函数 filter2D 实现 Sobel 算子
kernSobelX = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]])  # SobelX kernel
kernSobelY = np.array([[-1, -2, -1], [0, 0, 0], [1, 2, 1]])  # SobelY kernel
imgSobelX = cv2.filter2D(img, -1, kernSobelX, borderType=cv2.BORDER_REFLECT)
imgSobelY = cv2.filter2D(img, -1, kernSobelY, borderType=cv2.BORDER_REFLECT)# 使用 cv2.Sobel 实现 Sobel 算子
SobelX = cv2.Sobel(img, cv2.CV_16S, 1, 0)  # 计算 x 轴方向
SobelY = cv2.Sobel(img, cv2.CV_16S, 0, 1)  # 计算 y 轴方向
absX = cv2.convertScaleAbs(SobelX)  # 转回 uint8
absY = cv2.convertScaleAbs(SobelY)  # 转回 uint8
SobelXY = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)  # 用绝对值近似平方根plt.figure(figsize=(10, 6))
plt.subplot(141), plt.axis('off'), plt.title("Original")
plt.imshow(img, cmap='gray', vmin=0, vmax=255)
plt.subplot(142), plt.axis('off'), plt.title("SobelX")
plt.imshow(SobelX, cmap='gray', vmin=0, vmax=255)
plt.subplot(143), plt.axis('off'), plt.title("SobelY")
plt.imshow(SobelY, cmap='gray', vmin=0, vmax=255)
plt.subplot(144), plt.axis('off'), plt.title("SobelXY")
plt.imshow(SobelXY, cmap='gray')
plt.tight_layout()
plt.show()

使用Sobel算子进行边缘检测的结果如下图所示。

在这里插入图片描述

图4.2 Sobel算子进行边缘检测


3. Canny 边缘检测

Canny边缘检测是由Jhon F.Canny提出的算法,具有低错误率、定位良好、最小响应的特点。
Canny算子在过滤噪声、计算梯度的同时实现非最大值抑制,不容易受噪声的干扰。采用双阈值法可以分别检测到强边缘和弱边缘,并且仅当弱边缘与强边缘相连时,才将弱边缘包含在输出结果中,这就保障了检测到真正的弱边缘。

Canny算法的工作原理为:
(1)使用高斯滤波器对图像进行平滑去噪;
(2)计算输入图像梯度;
(3)在边缘上使用非极大值抑制(NMS)进行过滤;
(4)在检测到的边缘上使用双阈值法去除假阳性;
(5)分析所有的边缘及其连接,以保留真正的边缘并消除不明显的边缘;

OpenCV 也提供了函数 cv.Sobel() 实现 Sobel 梯度算子。

函数说明:

cv.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]]) → edges

参数说明:

  • image:输入图像,灰度图像,不适用彩色图像
  • edges:输出图像,单通道 8bit图像,大小与images相同
  • threshold1:滞后过程的较小阈值,用于边缘连接
  • threshold2:滞后过程的较大阈值,用于查找明显的边缘
  • apertureSize:Sobel算子的卷积核大小
  • L2gradient:标志,使用 L1范数或 L2范数正则化

使用 Canny()进行边缘检测的基本程序如下:

# MattingCanny.py
# edge detection by Cann
# Copyright 2021 youcans, XUPTy
# Crated:2021-12-10import cv2 as cv
from matplotlib.figure import FigureimgOri = cv2.imread("../images/imgGaia.tif", flags=0)# canny(): 边缘检测
imgBlur = cv2.GaussianBlur(imgOri, (3, 3), 0)
imgCanny = cv2.Canny(imgBlur, 50, 150)# 形态学:边缘检测
_, imgThr = cv2.threshold(imgOri, 200, 255, cv2.THRESH_BINARY)  # 固定阈值二值化
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))  # 定义矩形结构元素
gradient = cv2.morphologyEx(Thr_img, cv2.MORPH_GRADIENT, kernel)  # 梯度plt.figure(figsize=(9, 6))
plt.subplot(221), plt.axis('off'), plt.title("Original")
plt.imshow(imgOri, cmap='gray', vmin=0, vmax=255)
plt.subplot(222), plt.axis('off'), plt.title("GaussianBlur")
plt.imshow(imgBlur, cmap='gray', vmin=0, vmax=255)
plt.subplot(223), plt.axis('off'), plt.title("Canny detection")
plt.imshow(imgCanny, cmap='gray', vmin=0, vmax=255)
plt.subplot(224), plt.axis('off'), plt.title("Gradient detection")
plt.imshow(gradient, cmap='gray')
plt.tight_layout()
plt.show()

使用Canny算子进行边缘检测的结果如下图所示。
在这里插入图片描述
图4.3 Canny 算子进行边缘检测

【本节完】


版权声明:

欢迎关注『Python 小白的项目实战 @ youcans』 原创作品

原创作品,转载必须标注原文链接:https://blog.csdn.net/youcans/article/details/122296231

Copyright 2022 youcans, XUPT

Crated:2022-01-05


欢迎关注『Python 小白的项目实战 @ youcans』 原创作品
Python 小白的课题报告—OpenCV 抠图项目实战(1)目录摘要
Python 小白的课题报告—OpenCV 抠图项目实战(2)抠图绪论
Python 小白的课题报告—OpenCV 抠图项目实战(3)抠图综述
Python 小白的课题报告—OpenCV 抠图项目实战(4)固定阈值抠图
Python 小白的课题报告—OpenCV 抠图项目实战(5)自适应阈值抠图
Python 小白的课题报告—OpenCV 抠图项目实战(6)色彩范围抠图
Python 小白的课题报告—OpenCV 抠图项目实战(7)边缘检测
Python 小白的课题报告—OpenCV 抠图项目实战(8)图像轮廓
Python 小白的课题报告—OpenCV 抠图项目实战(9)评价指标
Python 小白的课题报告—OpenCV 抠图项目实战(10)PyQt5 使用
Python 小白的课题报告—OpenCV 抠图项目实战(11)算法实验平台
Python 小白的课题报告—OpenCV 抠图项目实战(12)源程序代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/565874.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文带你了解美国运通比赛

1.比赛调研 1.1 比赛链接 American Express - Default Prediction | Kaggle 1.2 比赛周期 8.24截止 1.3 比赛的快速介绍 无论是在餐厅外出还是购买音乐会门票,现代生活都依靠信用卡的便利进行日常购物。它使我们免于携带大量现金,还可以提前全额购…

【python】Ubuntu下安装spyder及matplotlib中文显示

一、查看Ubuntu版本 $ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammy尝试用cat /etc/debian_version命令,竟然可以显示出来Debian的版本。 $ cat /etc/debian_version …

【课题总结】OpenCV 抠图项目实战(8)图像轮廓

Python 小白的课题报告—OpenCV 抠图项目实战(8) 本系列是 Python 小白的课题作业《基于OpenCV 的图像分割和抠图》。 需要说明的是,本系列并不能算是 OpenCV 的抠图项目教程,只是以此为主题的课题报告。其中包括了一个较为完整的…

SQLServer 联合查询

联合查询分为内连接和外连接两个 一: 外连接又分为:左连接、右连接、完全外连接。 1. 左连接 left join或 left outer join SQL语句: select * from student left join course student .IDcourse.ID语句解说:左外连接包含left …

H5 五子棋小游戏

用H5实现双人五子棋小游戏。 功能分解: 棋盘的大小自己设置白色棋子和黑色棋子的点击事件有棋子的地方不能再次放棋子判断同色棋子是否够五个够五个之后弹框显示胜利 效果演示 原始样式 选择之后开始游戏 有没有一种特别好玩的感觉呢??…

【课题报告】OpenCV 抠图项目实战(10)PyQt5 使用

Python 小白的课题报告—OpenCV 抠图项目实战(10)PyQt5 使用 本系列是 Python 小白的课题作业《基于OpenCV 的图像分割和抠图》。 需要说明的是,本系列并不能算是 OpenCV 的抠图项目教程,只是以此为主题的课题报告。其中包括了一个…

IDEA 生成get和set方法

使用IDEA自动生成get和set方法。 在IDEA中使用快捷键altinsert. 图解示例 要生成get和set的页面 使用altinsert快捷键 点击Getter and Setter 全部选中 点击ok之后get和set方法就自动生成了

【课题总结】OpenCV 抠图项目实战(11)算法实验平台

Python 小白的课题报告—OpenCV 抠图项目实战(11)抠图算法实验平台 本系列是 Python 小白的课题作业《基于OpenCV 的图像分割和抠图》。 需要说明的是,本系列并不能算是 OpenCV 的抠图项目教程,只是以此为主题的课题报告。其中包括…

IDEA 配置Tomcat

在IDEA上配置本地的Tomcat服务。 1.点击右上角如图红色圆圈圈中的Add Configuration… 2. 点击号 3. 向下查找Tomcat Server, 然后选择Local (如果没有Tomcat Server 点击33more items… 就能找到了) 4. 点击Local之后(我的是已经配置过的,如果没有配…

【课题总结】OpenCV 抠图项目实战(12)源程序代码

Python 小白的课题报告—OpenCV 抠图项目实战(12)源程序代码 本系列是 Python 小白的课题作业《基于OpenCV 的图像分割和抠图》。 需要说明的是,本系列并不能算是 OpenCV 的抠图项目教程,只是以此为主题的课题报告。其中包括了一个…

【OpenCV 例程200篇】67. 空间域图像增强的综合应用

【OpenCV 例程200篇】67. 空间域图像增强的综合应用 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 5. 空间域图像增强技术的综合应用 空间域图像增强的方法很多,各有不同的特点和…

Vue 双向绑定小案例

用Vue实现双向绑定的小案例。 **双向绑定:**使用了双向绑定的两个内容一定是完全一样,同时变化(同增同减) 效果图 原始样式 删除输入框内容上面显示的文本内容随之减少 在下面输入框输入内容上面显示的内容也会增加 **注意&…

【OpenCV 例程200篇】68. 连续周期信号的傅立叶级数

【OpenCV 例程200篇】68. 连续周期信号的傅立叶级数 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 1. 频率域图像滤波 图像滤波是在尽可能保留图像细节特征的条件下对目标图像的噪声进行抑制…

Vue 跑马灯

Vue 实现跑马灯的效果。 效果图 **功能讲解&#xff1a;**当点击开始按钮&#xff0c;跑马灯效果开始进行&#xff0c;文字滚动消失和显示&#xff0c;循环滚动&#xff0c;点击停止按钮&#xff0c;文字不再滚动&#xff0c;停留在当时显示的文字页面。 代码演示 <!DOC…

【OpenCV 例程200篇】69. 连续非周期信号的傅立叶系数

【OpenCV 例程200篇】69. 连续非周期信号的傅立叶系数 欢迎关注 『OpenCV 例程200篇』 系列&#xff0c;持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列&#xff0c;持续更新中 傅里叶变换 滤波通常是指对图像中特定频率的分量进行过滤或抑制。图像滤波是在尽可能保留…

Python3.x字符串替换方法replace()、maketrans()和translate()

Python中replace()函数,类似于“查找与替换”功能 语法格式如下&#xff1a; str.replace(old, new[, max]) 其方法把字符串中的 old&#xff08;旧字符串&#xff09;&#xff0c;替换成 new(新字符串)&#xff0c;如果指定第三个参数max&#xff0c;则替换不超过 max 次&…

Vue 金额计算

使用Vue计算商品金额。 **功能分析&#xff1a;**输入商品单价和商品数量&#xff0c;设置固定的运费价格&#xff0c;直接会显示商品总价格。 效果演示 原始样式&#xff08;我设置的运费是10&#xff09; 输入商品单价和价格 代码演示 **注意&#xff1a;**引入Vue.js…

【OpenCV 例程200篇】70. 一维连续函数的傅里叶变换

【OpenCV 例程200篇】70. 一维连续函数的傅里叶变换 欢迎关注 『OpenCV 例程200篇』 系列&#xff0c;持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列&#xff0c;持续更新中 2.1 傅里叶级数 傅里叶级数&#xff08;Fourier series&#xff09;在数论、组合数学、信号…

新版CSDN中如何快速转载别人的CSDN博客,详细方法与步骤!!!

前言 作为DSCN博客用户小萌新&#xff0c;有可能自己写的博客还不够好&#xff0c;或者当看到别人写的特别好的博客时&#xff0c;就想转载&#xff08;有些人可能会问&#xff1a;不是可以收藏吗&#xff1f;当然可以收藏&#xff0c;但是有些人也会想转载下载&#xff0c;不…

Vue 筛选

对数据进行筛选功能。 **功能分析&#xff1a;**当你输入一串文字时&#xff0c;以最快的速度筛选出相对应的内容&#xff0c;如果没有对应的内容则不予显示。 效果演示 原始样式 在输入框输入平板时筛选相应的内容 代码演示 **注意&#xff1a;**引入Vue.js架包 <!…