OpenCV中的图像处理3.7-3.8(五)边缘检测、图像金字塔

news2024/12/30 4:07:01

目录

  • 3.7 边缘检测
      • 目标
      • 理论
      • OpenCV中的Canny边缘检测
      • 其他资源
      • 练习
  • 3.8 图像金字塔
      • 目标
      • 理论
      • 使用金字塔进行图像混合
      • 其他资源

翻译及二次校对:cvtutorials.com

编辑者:廿瓶鲸(和鲸社区Siby团队成员)

3.7 边缘检测

目标

在本章中,我们将了解到:

  • Canny边缘检测的概念
  • 用于检测的OpenCV函数:cv.Canny()

理论

Canny边缘检测是一种流行的边缘检测算法。它是由John F. Canny在2006年开发的。

1.它是一个多阶段的算法,我们将对每个阶段进行分析。

2.减少噪音

由于边缘检测容易受到图像中噪音的影响,第一步是用5x5高斯滤波器去除图像中的噪音。我们已经在前几章中看到了这一点。

3.寻找图像的灰度梯度

然后用Sobel核对水平和垂直方向的平滑图像进行过滤,得到水平方向(Gx)和垂直方向(Gy)的第一导数。从这两幅图像中,我们可以找到每个像素的边缘梯度和方向,如下所示。
E d g e _ G r a d i e n t    ( G ) = G x 2 + G y 2 A n g l e    ( θ ) = tan ⁡ − 1 ( G y G x ) Edge\_Gradient \; (G) = \sqrt{G_x^2 + G_y^2} \\ Angle \; (\theta) = \tan^{-1} \bigg(\frac{G_y}{G_x}\bigg) Edge_Gradient(G)=Gx2+Gy2 Angle(θ)=tan1(GxGy)

E d g e _ G r a d i e n t    ( G ) = G x 2 + G y 2 A n g l e    ( θ ) = tan ⁡ − 1 ( G y G x ) Edge\_Gradient \; (G) = \sqrt{G_x^2 + G_y^2} \\ Angle \; (\theta) = \tan^{-1} \bigg(\frac{G_y}{G_x}\bigg) Edge_Gradient(G)=Gx2+Gy2 Angle(θ)=tan1(GxGy)

梯度方向总是垂直于边缘。它被圆整为四个角度之一,代表垂直、水平和两个对角线方向。

4.非极大值抑制

在得到梯度大小和方向后,对图像进行全面扫描,以去除任何可能不构成边缘的不必要的像素。为此,在每一个像素点上,检查该像素点是否是梯度方向上其附近的局部最大值。请看下面的图片。

Image Name

A点在边缘上(垂直方向)。梯度方向是对边缘的法线。B点和C点在梯度方向上。因此,A点与B点和C点一起被检查,看它是否形成一个局部最大值。如果是,它将被考虑到下一阶段,否则,它将被抑制(归为零)。

简而言之,你得到的结果是一个具有 "薄边缘 "的二进制图像。

5.滞后阈值处理

这个阶段决定哪些是真正的边缘,哪些不是。为此,我们需要两个阈值,minVal和maxVal。任何灰度梯度大于maxVal的边缘都肯定是边缘,而那些低于minVal的边缘肯定是非边缘,所以被丢弃。那些位于这两个阈值之间的边,根据它们的连接性被分为边和非边。如果它们与 "确定的边缘 "像素相连,它们就被认为是边缘的一部分。否则,它们也会被丢弃。请看下面的图片。

Image Name

边缘A高于maxVal,所以被认为是 “确定边缘”。虽然边C低于maxVal,但它与边A相连,所以也被认为是有效的边,我们得到了那个完整的曲线。但是边B,尽管它高于minVal,并且与边C在同一区域,但它没有与任何 "确定的边 "相连,所以它被丢弃了。因此,我们必须相应地选择minVal和maxVal以获得正确的结果,这一点非常重要。

这个阶段还在假设边缘是长线的基础上去除小像素的噪音。

所以我们最终得到的是图像中的强边缘。

OpenCV中的Canny边缘检测

OpenCV把上述所有的东西都放在一个函数中,即cv.Canny()。我们将看到如何使用它。第一个参数是我们的输入图像。第二个和第三个参数分别是我们的minVal和maxVal。第三个参数是aperture_size。它是用于寻找图像梯度的Sobel核的大小。最后一个参数是L2gradient,它指定了用于寻找梯度大小的方程式。如果它是True,它使用上面提到的更精确的方程,否则它使用这个函数。Edge_Gradient(G)=|Gx|+|Gy|。默认情况下,它是False。

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('messi5.jpg',0)
edges = cv.Canny(img,100,200)
plt.subplot(121),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(edges,cmap = 'gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])
plt.show()

结果如下:

Image Name

其他资源

1.维基百科上的Canny边缘检测器
2.《Canny边缘检测教程》,作者Bill Green,2002年。

练习

写一个小程序来寻找Canny边缘检测,其阈值可以用两个trackbar来改变。这样,你就可以了解阈值的影响。

3.8 图像金字塔

目标

在本章中:

  • 我们将学习图像金字塔的知识
  • 我们将使用图像金字塔来创建一个新的水果,“Orapple”。
  • 我们将看到这些函数:cv.pyrUp(), cv.pyrDown()

理论

通常情况下,我们习惯于使用一个恒定大小的图像。但在某些情况下,我们需要处理不同分辨率的(相同)图像。例如,当我们在图像中搜索某个东西时,比如人脸,我们不确定该物体会以何种尺寸出现在所述图像中。在这种情况下,我们需要创建一组具有不同分辨率的相同图像,并在所有这些图像中搜索物体。这些具有不同分辨率的图像集被称为图像金字塔(因为当它们被保存在一个堆栈中,最高分辨率的图像在底部,最低分辨率的图像在顶部,它看起来像一个金字塔)。

有两种图像金字塔。1)高斯金字塔和2)拉普拉斯金字塔

高斯金字塔中的高层次(低分辨率)是通过去除低层次(高分辨率)图像中的连续行和列而形成的。然后,高层的每个像素由底层的5个像素贡献高斯权重形成。通过这样做,M×N的图像变成了M/2×N/2的图像。因此,面积减少到原始面积的四分之一。这就是所谓的Octave。当我们在金字塔中往上走时,同样的模式会继续下去(即,分辨率下降)。同样地,在扩展时,每一级的面积都会变成4倍。我们可以使用cv.pyrDown()和cv.pyrUp()函数找到高斯金字塔。

img = cv.imread('messi5.jpg')
lower_reso = cv.pyrDown(higher_reso)

下面是图像金字塔中的4个层次。

Image Name

现在你可以用cv.pyrUp()函数往下看图像金字塔。

higher_reso2 = cv.pyrUp(lower_reso)

记住,higher_reso2不等于higher_reso,因为一旦你降低分辨率,你就失去了信息。下面的图片是在前面的情况下从最小的图片创建的金字塔的3级。将其与原始图像进行比较。

Image Name

拉普拉斯金字塔是由高斯金字塔形成的。这方面没有专属函数。拉普拉斯金字塔图像只像边缘图像。它的大部分元素都是零。它们被用于图像压缩。拉普拉斯金字塔中的一个层次是由高斯金字塔中该层次与高斯金字塔中其上层的扩展版本之间的差异形成的。一个拉普拉斯金字塔的三个层次看起来如下(对比度被调整以增强内容)。

Image Name

使用金字塔进行图像混合

金字塔的一个应用是图像混合。例如,在图像拼接中,你需要将两幅图像堆叠在一起,但由于图像之间的不连续性,可能看起来不好看。在这种情况下,用Pyramids进行图像混合,可以让你实现无缝混合,而不会在图像中留下很多数据。一个经典的例子是两个水果的混合,橙子和苹果的混合。请看现在的结果本身,以理解我所说的内容。

Image Name

请查看附加资源中的第一个参考资料,它有关于图像混合、拉普拉斯金字塔等的完整图示细节。简单地说,它是这样做的:

1.加载苹果和橙子的两张图片
2.找到苹果和橙子的高斯金字塔(在这个特定的例子中,级别数为6)。
3.从高斯金字塔中,找到它们的拉普拉斯金字塔
4.现在将苹果的左半边和橙子的右半边分别加入到拉普拉斯金字塔的各个层次中。
5.最后从这个联合图像金字塔中,重建原始图像。

下面是完整的代码。(为了简单起见,每个步骤都是单独完成的,这可能会占用更多的内存。如果你愿意的话,你可以优化它)

import cv2 as cv
import numpy as np,sys
A = cv.imread('apple.jpg')
B = cv.imread('orange.jpg')
# 为A生成高斯金字塔
G = A.copy()
gpA = [G]
for i in range(6):
    G = cv.pyrDown(G)
    gpA.append(G)
# 为B生成高斯金字塔
G = B.copy()
gpB = [G]
for i in range(6):
    G = cv.pyrDown(G)
    gpB.append(G)
# 为A生成拉普拉斯金字塔
lpA = [gpA[5]]for i in range(5,0,-1):
    GE = cv.pyrUp(gpA[i])
    L = cv.subtract(gpA[i-1],GE)
    lpA.append(L)
# 为B生成拉普拉斯金字塔
lpB = [gpB[5]]
for i in range(5,0,-1):
    GE = cv.pyrUp(gpB[i])
    L = cv.subtract(gpB[i-1],GE)
    lpB.append(L)
# 现在在每个层次中添加左右两半的图像
LS = []
for la,lb in zip(lpA,lpB):
    rows,cols,dpt = la.shape
    ls = np.hstack((la[:,0:cols/2], lb[:,cols/2:])
    LS.append(ls)
# 现在重构
ls_ = LS[0]
for i in range(1,6):
    ls_ = cv.pyrUp(ls_)
    ls_ = cv.add(ls_, LS[i])
# 将图像的两半拼接在一起
real = np.hstack((A[:,:cols/2],B[:, cols/2:])
cv.imwrite('Pyramid_blending2.jpg',ls_)
cv.imwrite('Direct_blending.jpg',real)

其他资源

  • 图像混合

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

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

相关文章

搭建jaegerAll in one 测试环境

1. Jaeger介绍 Jaeger 受 Dapper 和 OpenZipkin 的启发,是由 Uber Technologies 发布的开源分布式追踪系统。它用于监控和排查基于微服务的分布式系统问题,包括: 分布式上下文传播分布式事务监控根因分析服务依赖关系分析性能 / 延迟优化 Jaeger 架构…

初识TypeScript与静态类型解析

一、初识ts 二、如何运行ts代码 假如本地新建了一个b.ts文件 安装TypeScript:npm install -g typescript 编译代码:tsc b.ts 运行js:node b.js 在终端输入 tsc -init 生成 tsconfig.json 文件 类型注解:TypeScript里的类型注解是一…

浅学Go下的ssti

前言 作为强类型的静态语言,golang的安全属性从编译过程就能够避免大多数安全问题,一般来说也唯有依赖库和开发者自己所编写的操作漏洞,才有可能形成漏洞利用点,在本文,主要学习探讨一下golang的一些ssti模板注入问题…

手术麻醉信息系统源码 B/S网页版

手术麻醉信息系统源码 php mysql vue2 B/S网页版 手术麻醉信息系统是HIS产品中的一个组成部分,主要应用于医院的麻醉科,属于电子病历类产品。麻醉监护的功能覆盖整个手术与麻醉的全过程,包括手术申请与排班、审批、安排、术前、术中和术后…

什么是阿里云服务器?云服务器的优缺点

阿里云服务器是什么?云服务器ECS是一种安全可靠、弹性可伸缩的云计算服务,云服务器可以降低IT成本提升运维效率,免去企业或个人前期采购IT硬件的成本,阿里云服务器让用户像使用水、电、天然气等公共资源一样便捷、高效地使用服务器…

线程池工作原理和实现原理

为什么要使用线程池 平时讨论多线程处理,大佬们必定会说使用线程池,那为什么要使用线程池?其实,这个问题可以反过来思考一下,不使用线程池会怎么样?当需要多线程并发执行任务时,只能不断的通过…

如何压缩mp3文件大小,5分钟学会4种方法

如何压缩mp3文件大小?我们在开车的时候都很喜欢听歌,一般歌曲库里的mp3文件都很多,小编的就有上千首。如果我们还想要增加更多mp3文件,有时候就会出现内存不足的情况啦。所以我们需要压缩mp3文件大小,这样才能在我们手…

【TCP 协议】连接管理之 “三次握手,四次挥手”

哈喽,大家好~我是你们的老朋友:保护小周ღ 本期为大家带来的是网络编程中的 TCP 传输控制协议保证数据可靠性传输的机制之一的——连接管理,通信双方采用 “三次握手” 来建立连接,采用 “四次挥手” 会断开连接,如何…

小厂测试4年终于熬出头了,费时8个月,入职阿里,涨薪14K

前言 你的努力,终将成就无可替代的自己 本科毕业后就一直从事测试的工作,和多数人一样,最开始从事功能测试的工作,看着自己的同学一步一步往上走,自己还是在原地踏步,说实话这不是自己想要的状态。 一年半…

PSP - 替换 MSA 数据库 以及 OpenMM 和 mmCIF 异常

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/130577390 关于 OpenMM: OpenMM 是用于分子动力学模拟的开源软件库,可以在不同的平台和硬件上运行,如 CPU、GPU 和 FPGA。OpenMM 提供一个高效的、灵活的和…

Spring Cloud第二季--服务网关Gateway

文章目录 一、Gateway和Zuul的区别二、Gateway的核心概念三、小试牛刀3.1、代码测试3.2、关于Predicate3.3、关于Filter 一、Gateway和Zuul的区别 Spring Cloud Gateway是在Spring生态系统之上构建的API网关服务,基于Spring 5,Spring Boot 2和 Project …

ORACLE 10G版本数据库系统产生大量归档日志问题的分析

一、服务概述 近期接到用户告知数据库归档暴增,导致生产库归档空间满,手动删除后,归档空间很快就会满。 立即登陆数据库系统,查询发现归档日志异常增长,从以前的每小时产生300M,增长到每小时产生59150M。…

使用thop计算参数和FLOPs时的疑问

文章目录 使用thop计算参数时的疑问x x.view(-1, 32 * 8 * 8)和x x.view(x.size(0), -1)区别是什么input_shape (3, 224, 224)这个张量是什么意思为什么summary计算时没有批次大小input_tensor torch.randn(1, *input_shape).to(device)这句代码什么意思flops, params pro…

1AE4混合电路耳放

设计目标: 1)20W以内的总功耗(包括灯丝部分); 2)最大输入1.2Vrms信号; 3)输出至少50毫瓦的功率; 4)至少5倍以上的阻尼系数。 1AE4是较后期的直热管&#xff0…

软件项目成本控制的5大关键点 不得不重视

软件项目成本一般分为运营成本和项目成本。而运营成本比较固定,压缩和削减的余地不大。而在项目成本中,最主要的成本是人工成本。那么如何提高项目开发效率,节约人工成本,对成本管理至关重要。 我们从以下几个影响项目成本的主要因…

[DeepSpeed]初代chatGPT模型部署实践

DeepSpeed Chat 部署方式 中间遇到很多坑,解决方法都写这里了DeepSpeed 部署中bug以及解决方法 环境 基于阿里云GPU 云服务器部署实践 操作系统版本: Ubuntu 18.04 GPU 驱动版本: 470.161.03 GPU 型号: A100-80G CPU &#…

投了上千简历,是Android岗位需求少?还是我的技术不行

作者:病鸡乱投医 作为一名Android开发人员,打开招聘网站是每天必做的事情。每次看到悬赏诱人的Android工程师职位,就想做个简历有技巧、能够吸引面试官的面面观。 然而,即使投了上千份简历,也迟迟没有找到理想的工作。…

makefile编译脚本,理解$@、$^和$<

一、理解 、 、 、^、$<的含义 Makefile中&#xff0c;格式为这样的 target : prerequisties 目标&#xff1a;需要依赖的条件 简单的工程直接这样 hello:hello.ccgcc hello.cc -o hello但如果文件多了呢&#xff1f;按部就班写会显得很长&#xff0c;所有这时候makefil…

惊现数据库误操作后,看这家银行如何打造“零盲区”运维安全

第三方运维人员数据库误操作致业务中断 堡垒机凸显短板 这家银行如何破局&#xff1f; 走在数字化转型前沿的银行业&#xff0c;不断增加的IT资产、业务系统&#xff0c;给IT运维提出了更高的挑战。银行运维的核心之一在于数据安全、系统稳定&#xff0c;面临着庞杂的运维场景…

【推荐系统】常用评价指标NDCG、HR、Recall、MRR解析

【推荐系统】常用评价指标NDCG、HR、Recall、MRR解析 文章目录 【推荐系统】常用评价指标NDCG、HR、Recall、MRR解析1. 准备工作2. 计算这些指标 &#xff08;5&#xff09;2.1 Accuracy&#xff08;准确率&#xff09;2.2 Recall&#xff08;召回率、查全率&#xff09;2.3 Pr…