《Opencv》基础操作详解(4)

news2025/1/8 18:27:01

接上篇:《Opencv》基础操作详解(3)-CSDN博客

目录

22、图像形态学操作

(1)、顶帽(原图-开运算)

公式:

应用场景:

代码示例:

(2)、黑帽(闭运算-原图)

公式:

应用场景:

代码示例:

23、边缘检测

(1)、Sobel算子边缘检测

用法说明:

代码示例:

(2)、Scharr算子边缘检测

用法说明:

代码示例:

(3)、Laplacian算子边缘检测

用法说明:

 代码示例:

(4)、 Canny边缘检测(常用)

24、图像轮廓检测

(1)、轮廓检测、绘制轮廓

## 查找轮廓

用法说明:

返回值:

## 绘制轮廓

用法说明:

代码示例:

(2)、轮廓特征


22、图像形态学操作

(1)、顶帽(原图-开运算)

顶帽操作是原始图像与开运算结果之间的差值。它可以用于提取比背景亮的微小细节。

cv2.morphologyEx(image, cv2.MORPH_TOPHAT, kernel)

公式:

                        Top Hat=原始图像−开运算结果 

应用场景:
  • 提取图像中比背景亮的微小区域(如文本、细胞、颗粒等)。

  • 去除不均匀光照的影响。

代码示例:
import cv2
import numpy as np
sun = cv2.imread('./images/sun.png')
cv2.imshow('sun',sun)
cv2.waitKey(0)
kernel = np.ones((2,2),np.uint8)
# 顶帽
tophat = cv2.morphologyEx(sun,cv2.MORPH_TOPHAT,kernel)
cv2.imshow('tophat',tophat)
cv2.waitKey(0)

(2)、黑帽(闭运算-原图)

黑帽操作是闭运算结果与原始图像之间的差值。它可以用于提取比背景暗的微小细节cv2.morphologyEx(image, cv2.MORPH_BLACKHAT, kernel)

公式:

                                Black Hat=闭运算结果−原始图像 

应用场景:
  • 提取图像中比背景暗的微小区域(如裂缝、孔洞等)。

  • 检测图像中的暗区域。

代码示例:
import cv2
import numpy as np
sun = cv2.imread('./images/sun.png')
cv2.imshow('sun',sun)
cv2.waitKey(0)
kernel = np.ones((2,2),np.uint8)
# 黑帽
blackhat = cv2.morphologyEx(sun,cv2.MORPH_BLACKHAT,kernel)
cv2.imshow('blackhat',blackhat)
cv2.waitKey(0)

23、边缘检测

(1)、Sobel算子边缘检测

Sobel 算子是一种离散的微分算子,该算子结合了高斯平滑和微分求导运算。该算子利用局部差分寻找边缘,计算所得的是一个梯度的近似值。

Sobel算子包含2组3×3的矩阵,分别为横向和纵向模板,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。 

用法说明:

cv2.Sobel(src, ddepth, dx, dy, ksize=None, scale=None, delta=None, borderType=None) 

  • src: 输入图像,通常是单通道灰度图像。

  • ddepth: 输出图像的深度(数据类型),例如 cv2.CV_8Ucv2.CV_16S 等。

  • dx: x 方向上的导数阶数。

  • dy: y 方向上的导数阶数。

  • ksize: Sobel 核的大小,必须是 1、3、5 或 7。默认值为 3。

  • scale: 可选的比例因子,应用于计算结果。

  • delta: 可选的增量值,添加到结果中。

  • borderType: 边界填充类型,默认值为 cv2.BORDER_DEFAULT

代码示例:
import cv2
yuan = cv2.imread('./images/yuan.png')
cv2.imshow('yuan',yuan)
cv2.waitKey(0)
# x方向
yuan_x = cv2.Sobel(yuan,-1,dx=1,dy=0)
yuan_x_64 = cv2.Sobel(yuan,cv2.CV_64F,dx=1,dy=0)
yuan_x_abs = cv2.convertScaleAbs(yuan_x_64)
cv2.imshow('yuan_x',yuan_x_abs)
cv2.waitKey(0)
# y方向
yuan_y = cv2.Sobel(yuan,-1,dx=0,dy=1)
yuan_y_64 = cv2.Sobel(yuan,cv2.CV_64F,dx=0,dy=1)
yuan_y_abs = cv2.convertScaleAbs(yuan_y_64)
cv2.imshow('yuan_y',yuan_y_abs)
cv2.waitKey(0)
# x、y同时
yuan_xy = cv2.Sobel(yuan,-1,dx=1,dy=1)
cv2.imshow('yuan_xy',yuan_xy)
cv2.waitKey(0)
# x方向、y方向权重相加
yuan_xy_add = cv2.addWeighted(yuan_x_abs,1,yuan_y_abs,1,0)
cv2.imshow('yuan_xy_add',yuan_xy_add)
cv2.waitKey(0)

(2)、Scharr算子边缘检测

Scharr 算子是 Soble 算子在 ksize=3 时的优化,与 Soble 的速度相同,且精度更高。Scharr 算子与 Sobel 算子的不同点是在平滑部分,其中心元素占的权重更重,相当于使用较小标准差的高斯函数,也就是更瘦高的模板。


 

用法说明:

cv2.Scharr(src, ddepth, dx, dy, scale=None, delta=None, borderType=None)

  • src: 输入图像,通常是单通道灰度图像。

  • ddepth: 输出图像的深度(数据类型),例如 cv2.CV_8Ucv2.CV_16S 等。

  • dx: x 方向上的导数阶数(0 或 1)。

  • dy: y 方向上的导数阶数(0 或 1)。

  • scale: 可选的比例因子,应用于计算结果。

  • delta: 可选的增量值,添加到结果中。

  • borderType: 边界填充类型,默认值为 cv2.BORDER_DEFAULT

代码示例:
import cv2
cat = cv2.imread('./images/cat.jpg',0)
cat_x_64 = cv2.Scharr(cat,cv2.CV_64F,dx=1,dy=0)
cat_x_abs = cv2.convertScaleAbs(cat_x_64)
cat_y_64 = cv2.Scharr(cat,cv2.CV_64F,dx=0,dy=1)
cat_y_abs = cv2.convertScaleAbs(cat_y_64)
cat_xy = cv2.addWeighted(cat_x_abs,1,cat_y_abs,1,0)
cv2.imshow('cat_Scharr',cat_xy)
cv2.waitKey(0)

(3)、Laplacian算子边缘检测

不再以x和y的方向计算,而是以圆方向计算变化率。因此不需要Gx+Gy。

用法说明:

 cv2.Laplacian(src, ddepth, ksize=None, scale=None, delta=None, borderType=None)

  • src: 输入图像,通常是单通道灰度图像。

  • ddepth: 输出图像的深度(数据类型),例如 cv2.CV_8Ucv2.CV_16S 等。

  • ksize: 拉普拉斯核的大小,必须是正奇数(默认值为 1,表示使用最简单的 3x3 核)。

  • scale: 可选的比例因子,应用于计算结果。

  • delta: 可选的增量值,添加到结果中。

  • borderType: 边界填充类型,默认值为 cv2.BORDER_DEFAULT

 代码示例:
import cv2
cat = cv2.imread('./images/cat.jpg',0)
cat_lap = cv2.Laplacian(cat,cv2.CV_64F)
cat_lap_abs = cv2.convertScaleAbs(cat_lap)
cv2.imshow('cat_laplacian',cat_lap_abs)
cv2.waitKey(0)

(4)、 Canny边缘检测(常用)

canny边缘检测分为4个部分:图像降噪 、梯度计算 、非极大值抑制 、双阈值边界跟踪

  • 图像降噪:图像去噪是进行边缘检测的第一步,通过去噪可以去除图像中的一些噪点,从而使边缘检测时免受噪点干扰。高斯滤波。
  • 梯度计算:要进行边缘检测,就需要得到图像梯度信息,根据图像的梯度幅值和梯度方向来确定边缘,一般均采用sobel算子对图像进行梯度幅值与梯度方向计算。 
  • 非极大值抑制NMS:在梯度图像中寻找梯度方向上的最大值作为边缘,不是梯度方向上的最大值则抑制为0。因为梯度方向是灰度变化最大的方向。比较梯度图像中每一点的灰度值与梯度方向上至少两个梯度图像像素点灰度值的大小,根据上述大小关系来确定是否保留该点的灰度值。
  • 双阈值边界追踪:双阈值处理就是根据实际情况需要设置一个灰度高阈值和一个灰度低阈值对NMS后的图像进行过滤,使得得到的边缘尽可能是真实的边缘。

用法说明:

cv2.Canny(image, threshold1, threshold2, apertureSize=None, L2gradient=None) 

  • image: 输入图像,通常是单通道灰度图像。

  • threshold1: 低阈值,用于边缘连接。

  • threshold2: 高阈值,用于强边缘检测。

  • apertureSize: Sobel 算子的核大小,默认值为 3。

  • L2gradient: 是否使用 L2 范数计算梯度幅值。如果为 True,则使用更精确的 L2 范数;如果为 False,则使用 L1 范数(默认值为 False)。

代码示例:

import cv2
cat = cv2.imread('./images/cat.jpg',0)
cv2.imshow('cat',cat)
cv2.waitKey(0)
cat_canny = cv2.Canny(cat,100,200)
cv2.imshow('cat_canny',cat_canny)
cv2.waitKey(0)

24、图像轮廓检测

使用轮廓检测可以获得物体的边界,方便在图像中对他们进行定位。通常在一些有趣的应用中轮廓检测是第一处理环节。比如图像前景提取,简单的图像分割,检测以及识别等。

(1)、轮廓检测、绘制轮廓

## 查找轮廓
用法说明:

cv2.findContours(image, mode, method, contours=None, hierarchy=None, offset=None)

  • image: 输入的二值图像(通常是经过边缘检测或阈值处理后的图像)。注意:findContours() 会修改输入图像,因此建议使用副本。

  • mode: 轮廓检索模式,决定如何提取轮廓。常用的模式包括:

    • cv2.RETR_EXTERNAL: 只检测外部轮廓。

    • cv2.RETR_LIST: 检测所有轮廓,但不建立轮廓之间的层次关系。

    • cv2.RETR_TREE: 检测所有轮廓,并建立完整的层次结构。

  • method: 轮廓近似方法,决定如何存储轮廓点。常用的方法包括:

    • cv2.CHAIN_APPROX_NONE: 存储所有轮廓点。

    • cv2.CHAIN_APPROX_SIMPLE: 压缩水平、垂直和对角方向的轮廓点,只保留端点。

  • contours: 输出的轮廓列表,每个轮廓是一个点集。

  • hierarchy: 输出的轮廓层次结构,描述轮廓之间的关系。

  • offset: 可选的偏移量,应用于所有轮廓点。

返回值:
  • contours: 检测到的轮廓列表。每个轮廓是一个点集(通常是一个 NumPy 数组)。

  • hierarchy: 轮廓的层次结构。它是一个 NumPy 数组,形状为 (N, 4),其中 N 是轮廓的数量。每个轮廓的层次信息由 4 个值表示:

    • [next, previous, first_child, parent]

      • next: 同一层级的下一个轮廓索引。

      • previous: 同一层级的上一个轮廓索引。

      • first_child: 第一个子轮廓索引。

      • parent: 父轮廓索引。

## 绘制轮廓
用法说明:

cv2.drawContours(image, contours, contourIdx, color, thickness=None, lineType=None, hierarchy=None, maxLevel=None, offset=None)

  • image: 目标图像,轮廓将绘制在这张图像上。

  • contours: 轮廓列表,通常是通过 findContours() 函数得到的。

  • contourIdx: 要绘制的轮廓索引。如果为 -1,则绘制所有轮廓。

  • color: 轮廓的颜色,格式为 (B, G, R)

  • thickness: 轮廓线的宽度。如果为 -1,则填充轮廓内部。

  • lineType: 线条类型,默认为 cv2.LINE_8(8-connected line)。

  • hierarchy: 轮廓的层次结构(可选),通常由 findContours() 返回。

  • maxLevel: 绘制轮廓的最大层级(可选)。如果为 0,则只绘制指定的轮廓;如果为 1,则绘制指定轮廓及其嵌套轮廓。

  • offset: 可选的偏移量,应用于所有轮廓点。

代码示例:
img = cv2.imread('./images/img_2.png')
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imshow('img_gray',img_gray)
cv2.waitKey(0)
_,img_binary = cv2.threshold(img_gray,100,255,cv2.THRESH_BINARY)
cv2.imshow('img_bin',img_binary)
cv2.waitKey(0)
_,contours,hierarchy = cv2.findContours(img_binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
print(hierarchy)
print(len(contours))
img_copy = img.copy()
img_copy = cv2.drawContours(image=img_copy,contours=contours,contourIdx=-1,color=(255,255,0),thickness=2)
cv2.imshow('Contous',img_copy)
cv2.waitKey(0)

(2)、轮廓特征

 获取轮廓后,通常基于轮廓的特征进行筛选、识别和处理。例如,基于轮廓的周长和面积对轮廓进行筛选,然后绘制筛选的目标轮廓或其最小外接矩形。

  • 轮廓面积:cv2.contourArea()
  • 轮廓周长: cv2.arcLength()
# 获取索引为0的轮廓的面积
area_0 = cv2.contourArea(contours[0])
print(area_0)
# 获取索引为0的轮廓的周长
Length = cv2.arcLength(contours[0],closed=True)
print(Length)
# 筛选面积大于10000像素的轮廓并绘制
a_list = []
for i in contours:
    if cv2.contourArea(i)>10000:
        a_list.append(i)
img_copy1 = img.copy()
img_copy1 = cv2.drawContours(image=img_copy1,contours=a_list,contourIdx=-1,color=(0,255,255),thickness=2)
cv2.imshow('Contours_10000',img_copy1)
cv2.waitKey(0)

 持续更新中。。。

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

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

相关文章

大数据高级ACP学习笔记(2)

钻取:变换维度的层次,改变粒度的大小 星型模型 雪花模型 MaxCompute DataHub

尚硅谷· vue3+ts 知识点学习整理 |14h的课程(持续更ing)

vue3 主要内容 核心:ref、reactive、computed、watch、生命周期 常用:hooks、自定义ref、路由、pinia、miit 面试:组件通信、响应式相关api ----> 笔记:ts快速梳理;vue3快速上手.pdf 笔记及大纲 如下&#xff…

阻抗(Impedance)、容抗(Capacitive Reactance)、感抗(Inductive Reactance)

阻抗(Impedance)、容抗(Capacitive Reactance)、感抗(Inductive Reactance) 都是交流电路中描述电流和电压之间关系的参数,但它们的含义、单位和作用不同。下面是它们的定义和区别: …

在 SQL 中,区分 聚合列 和 非聚合列(nonaggregated column)

文章目录 1. 什么是聚合列?2. 什么是非聚合列?3. 在 GROUP BY 查询中的非聚合列问题示例解决方案 4. 为什么 only_full_group_by 要求非聚合列出现在 GROUP BY 中?5. 如何判断一个列是聚合列还是非聚合列?6. 总结 在 SQL 中&#…

B树与B+树:数据库索引的秘密武器

想象一下,你正在构建一个超级大的图书馆,里面摆满了各种各样的书籍。B树和B树就像是两种不同的图书分类和摆放方式,它们都能帮助你快速找到想要的书籍,但各有特点。 B树就像是一个传统的图书馆摆放方式: 1. 书籍摆放&…

回归预测 | MATLAB实现CNN-SVM多输入单输出回归预测

回归预测 | MATLAB实现CNN-SVM多输入单输出回归预测 目录 回归预测 | MATLAB实现CNN-SVM多输入单输出回归预测预测效果基本介绍模型架构程序设计参考资料 预测效果 基本介绍 CNN-SVM多输入单输出回归预测是一种结合卷积神经网络(CNN)和支持向量机&#…

Linux-Ubuntu之裸机驱动最后一弹PWM控制显示亮度

Linux-Ubuntu之裸机驱动最后一弹PWM控制显示亮度 一, PWM实现原理二,软件实现三,正点原子裸机开发总结 一, PWM实现原理 PWM和学习51时候基本上一致,控制频率(周期)和占空比,51实验…

自定义校验注解

已有的注解不能满足所有的校验需求,特殊的情况需要自定义校验(自定义校验注解) 1.自定义注解,并在注解上指定校验逻辑 Constraint(validatedBy StateValidation.class) // 指定校验逻辑 package com.example.demo.validation;import jakarta.validation.Constraint; import j…

分数阶傅里叶变换代码 MATLAB实现

function Faf myfrft(f, a) %分数阶傅里叶变换函数 %输入参数: %f:原始信号 %a:阶数 %输出结果: %原始信号的a阶傅里叶变换N length(f);%总采样点数 shft rem((0:N-1)fix(N/2),N)1;%此项等同于fftshift(1:N),起到翻…

Ubuntu 20.04安装gcc

一、安装GCC 1.更新包列表 user596785154:~$ sudo apt update2.安装gcc user596785154:~$ sudo apt install gcc3.验证安装 user596785154:~$ gcc --version二 编译C文件 1.新建workspace文件夹 user596785154:~$ mkdir workspace2.进入workspace文件夹 user596785154:~…

小兔鲜儿:头部区域的logo,导航,搜索,购物车

头部:logo ,导航,搜索,购物车 头部总体布局: 设置好上下外边距以及总体高度, flex布局让总体一行排列 logo: logo考虑搜索引擎优化,所以要使用 h1中包裹 a 标签,a 里边写内容(到时候…

Linux C编程——文件IO基础

文件IO基础 一、简单的文件 IO 示例二、文件描述符三、open 打开文件1. 函数原型2. 文件权限3. 宏定义文件权限4. 函数使用实例 四、write 写文件五、read 读文件六、close 关闭文件七、Iseek 绍 Linux 应用编程中最基础的知识,即文件 I/O(Input、Outout…

论文解读 | NeurIPS'24 IRCAN:通过识别和重新加权上下文感知神经元来减轻大语言模型生成中的知识冲突...

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 点击 阅读原文 观看作者讲解回放! 作者简介 史丹,天津大学博士生 内容简介 大语言模型(LLM)经过海量数据训练后编码了丰富的世界知识。最近的研究表明&#xff0c…

【51单片机零基础-chapter5:模块化编程】

模块化编程 将以往main中泛型的代码,放在与main平级的c文件中,在h中引用. 简化main函数 将原来main中的delay抽出 然后将delay放入单独c文件,并单独开一个delay头文件,里面放置函数的声明,相当于收纳delay的c文件里面写的函数的接口. 注意,单个c文件所有用到的变量需要在该文…

扩散模型论文概述(三):Stability AI系列工作【学习笔记】

视频链接:扩散模型论文概述(三):Stability AI系列工作_哔哩哔哩_bilibili 本期视频讲的是Stability AI在图像生成的工作。 同样,第一张图片是神作,总结的太好了! 介绍Stable Diffusion之前&…

数据库软考历年上午真题与答案解析(2018-2024)

本题考查计算机总线相关知识。 总线(Bus)是计算机各种功能部件之间传送信息的公共通信干线,它是由导线组成的传输线束。 根据总线连接设备范围的不同, 分为:1.片内总线:芯片内部的总线; 2.系统…

【three.js】模型-几何体Geometry,材质Material

模型 在现实开发中,有时除了需要用代码创建模型之外,多数场景需要加载设计师提供的使用设计软件导出的模型。此时就需要使用模型加载器去加载模型,不同格式的模型需要引入对应的模型加载器,虽然加载器不同,但是使用方式…

彻底学会Gradle插件版本和Gradle版本及对应关系

看完这篇,保你彻底学会Gradle插件版本和Gradle版本及对应关系,超详细超全的对应关系表 需要知道Gradle插件版本和Gradle版本的对应关系,其实就是需要知道Gradle插件版本对应所需的gradle最低版本,详细对应关系如下表格&#xff0…

预测facebook签到位置

1.11 案例2:预测facebook签到位置 学习目标 目标 通过Facebook位置预测案例熟练掌握第一章学习内容 1 项目描述 本次比赛的目的是预测一个人将要签到的地方。 为了本次比赛,Facebook创建了一个虚拟世界,其中包括10公里*10公里共100平方公里的…

【万字详细教程】Linux to go——装在移动硬盘里的Linux系统(Ubuntu22.04)制作流程;一口气解决系统安装引导文件迁移显卡驱动安装等问题

Linux to go制作流程 0.写在前面 关于教程Why Linux to go?实际效果 1.准备工具2.制作步骤 下载系统镜像硬盘分区准备启动U盘安装系统重启完成驱动安装将系统启动引导程序迁移到移动硬盘上 3.可能出现的问题 3.1.U盘引导系统安装时出现崩溃3.2.不影响硬盘里本身已有…