当前位置: 首页 > news >正文

OpenCV形态学操作

1.1. 形态学操作介绍

初识:

形态学操作是一种基于图像形状的处理方法,主要用于分析和处理图像中的几何结构。其核心是通过结构元素(卷积核)对图像进行扫描和操作,从而改变图像的形状和特征。例如:

  • 腐蚀(Erosion):将图像中的前景物体边界向内收缩,使物体变小。
  • 膨胀(Dilation):将图像中的前景物体边界向外扩展,使物体变大。
  • 开运算(Opening):先腐蚀后膨胀,用于去除小噪点。
  • 闭运算(Closing):先膨胀后腐蚀,用于填补小孔。

功能:

形态学操作的主要功能包括:

  • 去噪:通过腐蚀或开运算去除小的噪点。
  • 边缘提取:通过形态学梯度(膨胀与腐蚀的差)突出边缘。
  • 图像分割:通过闭运算或开运算分离或连接物体。
  • 特征增强:通过顶帽或黑帽操作提取特定特征。
    • 顶帽:原图与开运算的差
    • :闭运算与原图的差

应用场景:

操作类型

应用场景

腐蚀

去噪、细化边缘、分离相邻对象

膨胀

填补小孔、连接对象、加粗前景

开运算

去除小噪点、平滑前景边界

闭运算

填补暗孔、平滑前景边界

形态学梯度

边缘检测、轮廓提取

顶帽运算

提取亮点、去除低频背景信息

黑帽运算

提取暗纹、增强低频阴影

 

1.2. 原理介绍

1.2.1. 腐蚀(Erosion) :

  • 腐蚀操作会将图像中的前景物体(通常是白色区域)的边界向内收缩。具体来说,当结构元素的中心移动到图像的某个像素时,只有当结构元素覆盖的所有像素都是前景物体的像素时,该中心像素才会被保留为前景物体的一部分。否则,该像素将被视为背景(黑色区域)。这种操作会使物体的边缘变细,可以去除小的突出物和噪点。

1.2.2. 膨胀(Dilation) :

  • 膨胀操作与腐蚀相反,它会将前景物体的边界向外扩展。当结构元素的中心移动到图像的某个像素时,只要结构元素覆盖的像素中存在至少一个前景物体的像素,该中心像素就会被保留为前景物体的一部分。这种操作会使物体的边缘变粗,可以填补物体中的小孔和断开的部分。

1.2.3. 开运算(Opening) :

  • 开运算是先腐蚀后膨胀的过程。它可以通过去除小的突出物和噪点来平滑前景物体的边界。开运算对于去除小的白色噪点特别有效。
    • 腐蚀:可以有效的消除突出物体和噪点,但是原前景会变小,有的地方存在孔洞与断开
    • 膨胀:修复孔洞,恢复大小。

1.2.4. 闭运算(Closing) :

  • 闭运算是先膨胀后腐蚀的过程。它可以通过填补小的孔洞来平滑前景物体的边界。闭运算对于填补小的黑色孔洞特别有效。
    • 膨胀:修复孔洞,但是前景图像会变大
    • 腐蚀:将大小近似恢复到原图大小

1.2.5. 顶帽操作:

    • 定义:顶帽操作是原始图像与开运算结果之间的差值。开运算是先进行腐蚀操作,再进行膨胀操作。
    • 功能:
      • 顶帽操作可以提取图像中比背景亮的细小区域。
      • 提取比背景亮的细小区域。去除大范围的低频背景信息,
      • 突出局部亮点。增强对比度。
    • 原理:
      • 开运算会去掉毛刺和突出部分
      • 原图减去开运算结果,就可以获得开运算去除的细小区域

1.2.6. 黑帽操作:

    • 定义: 黑帽操作是闭运算结果与原始图像之间的差值。闭运算是先进行膨胀操作,再进行腐蚀操作。黑帽操作可以提取图像中比背景暗的细小区域。
    • 功能
      • 提取比背景暗的小区域。
      • 突出细小的暗纹和阴影区域。
      • 增强对比度,适合背景亮、局部暗区域的图像。
    • 原理:
      • 闭运算先膨胀在腐蚀,把孔洞和非连续区域不全了
      • 闭运算减去原图像,就可以得到闭运算去除的部分——比背景暗的小区域

1.3. 在openCV中实现

1.3.1. kernel

以下函数都会用到kernel,结构元素(卷积核),用于定义邻域的形状和大小。选择合适的形状与大小,可以提高形态学操作的效果。首先需要了解一下如何选择kernel

1.3.1.1. 确定结构元素形状

结构元素的形状应根据图像的特征和处理目标来选择。常见的结构元素形状包括:

  • 矩形(Rectangular)
    • 适用于处理规则形状的图像,如文本、表格等。
    • 代码示例:
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
  • 椭圆(Elliptical)
    • 适用于处理圆形或椭圆形的图像,如细胞、颗粒等。
    • 代码示例:
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
  • 十字形(Cross-shaped)
    • 适用于处理需要突出中心点的图像,如边缘检测等。
    • 代码示例:
kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5))

1.3.1.2. 确定结构元素大小

结构元素的大小应根据图像中物体的大小和细节来选择。以下是一些指导原则:

  • 去除小噪点
    • 如果图像中有小的噪点,选择较小的结构元素(如 3x3 或 5x5)。
    • 代码示例:
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
  • 填补小孔
    • 如果图像中有小的孔洞,选择较大的结构元素(如 5x5 或 7x7)。
    • 代码示例:
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
  • 处理大物体
    • 如果图像中有较大的物体,选择更大的结构元素(如 7x7 或 9x9)。
    • 代码示例:
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))

1.3.1.3. 选择结构元素的步骤

  1. 分析图像特征
    • 观察图像中的物体大小、形状和细节。
    • 确定需要处理的目标(如去除噪点、填补孔洞、提取边缘等)。
  1. 选择结构元素形状
    • 根据图像的特征选择合适的形状(矩形、椭圆、十字形等)。
  1. 选择结构元素大小
    • 根据图像中物体的大小和细节选择合适的大小。
    • 可以通过实验逐步调整结构元素的大小,观察不同大小对结果的影响。
  1. 实验和调整
    • 使用不同的结构元素大小和形状进行实验,观察处理后的图像效果。
    • 根据实验结果调整结构元素的大小和形状,直到达到满意的效果。

1.3.2. cv2.erode

函数:

def erode(src: cv2.typing.MatLike, kernel: cv2.typing.MatLike, dst: cv2.typing.MatLike | None = ..., anchor: cv2.typing.Point = ..., iterations: int = ..., borderType: int = ..., borderValue: cv2.typing.Scalar = ...) -> cv2.typing.MatLike: ...

参数解释

  • src:输入图像(通常是二值图像或灰度图像)。
  • kernel:结构元素(卷积核),用于定义邻域的形状和大小。
  • dst:输出图像。如果未指定,则默认与输入图像具有相同的类型和大小。
  • anchor:结构元素的锚点位置,默认为 (-1, -1),表示锚点位于结构元素的中心。
  • iterations:迭代次数,默认为 1。增加迭代次数会增强腐蚀的效果。
  • borderType:边界填充方式,默认为 cv2.BORDER_CONSTANT。常见的边界填充方式有:
    • cv2.BORDER_CONSTANT:用常数值填充边界。
    • cv2.BORDER_REFLECT:用镜像反射的方式填充边界。
    • cv2.BORDER_REPLICATE:用边界像素值重复填充边界。
    • cv2.BORDER_WRAP:用环绕方式填充边界。
  • borderValue:边界填充的值,默认为 0。

参数确定方法

  • 结构元素(Kernel):如第一点所讲
  • 迭代次数(Iterations):根据需要调整,次数越多,腐蚀效果越明显。通常设置为 1 或 2。

参数对结果的影响

  • 结构元素的形状和大小:影响腐蚀的范围和效果。较大的结构元素会使腐蚀效果更明显,但可能会导致图像失真。
  • 迭代次数:增加迭代次数会使腐蚀效果更明显,但可能会导致图像过度腐蚀。

使用注意事项

  • 选择合适的结构元素大小和形状,避免过度腐蚀导致图像失真。
  • 迭代次数不宜过多,以免影响图像的整体结构。

结合腐蚀和对不同结构元素的效果进行对比:

def TestMorphologicalErode(iterator:int):# 读取图像img = cv2.imread('Word.jfif', 0)  # 以灰度模式读取图像# 定义不同形状和大小的结构元素kernel_rect = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))  # 矩形结构元素kernel_ellipse = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))  # 椭圆结构元素kernel_cross = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3))  # 十字形结构元素# 腐蚀操作erosion_rect = cv2.erode(img, kernel_rect, iterations=1)erosion_ellipse = cv2.erode(img, kernel_ellipse, iterations=1)erosion_cross = cv2.erode(img, kernel_cross, iterations=1)# 显示结果plt.figure(figsize=(12, 8))plt.subplot(2, 2, 1)plt.imshow(img, cmap='gray')plt.title('Original Image')plt.axis('off')plt.subplot(2, 2, 2)plt.imshow(erosion_rect, cmap='gray')plt.title('Erosion with Rectangular Kernel')plt.axis('off')plt.subplot(2, 2, 3)plt.imshow(erosion_ellipse, cmap='gray')plt.title('Erosion with Elliptical Kernel')plt.axis('off')plt.subplot(2, 2, 4)plt.imshow(erosion_cross, cmap='gray')plt.title('Erosion with Cross-shaped Kernel')plt.axis('off')plt.show()

结果发现:

  • 腐蚀操作,字反而变粗了,其实这里可以理解前景为,黑色的字是背景,腐蚀会让白色的前景变小,即黑色的背景变大,所以黑色的字变大了
  • 矩形的白色孔洞腐蚀的厉害,十字星与椭圆的与原图保留的较好(对比“惊”的口)

1.3.3. cv2.dilate

函数:

def dilate(src: cv2.typing.MatLike, kernel: cv2.typing.MatLike, dst: cv2.typing.MatLike | None = ..., anchor: cv2.typing.Point = ..., iterations: int = ..., borderType: int = ..., borderValue: cv2.typing.Scalar = ...) -> cv2.typing.MatLike: ...

参数解释

  • src:输入图像(通常是二值图像或灰度图像)。
  • kernel:结构元素(卷积核),用于定义邻域的形状和大小。
  • dst:输出图像。如果未指定,则默认与输入图像具有相同的类型和大小。
  • anchor:结构元素的锚点位置,默认为 (-1, -1),表示锚点位于结构元素的中心。
  • iterations:迭代次数,默认为 1。增加迭代次数会增强膨胀的效果。
  • borderType:边界填充方式,默认为 cv2.BORDER_CONSTANT
  • borderValue:边界填充的值,默认为 0。

参数确定方法

  • 结构元素(Kernel):如第一部分所示
  • 迭代次数(Iterations):根据需要调整,次数越多,膨胀效果越明显。通常设置为 1 或 2。

参数对结果的影响

  • 结构元素的形状和大小:影响膨胀的范围和效果。较大的结构元素会使膨胀效果更明显,但可能会导致图像失真。
  • 迭代次数:增加迭代次数会使膨胀效果更明显,但可能会导致图像过度膨胀。

使用注意事项

  • 选择合适的结构元素大小和形状,避免过度膨胀导致图像失真。
  • 迭代次数不宜过多,以免影响图像的整体结构。

对比不同形状结构元素的膨胀操作:

def TestMorphologicalDilate(iterator:int):# 读取图像img = cv2.imread('Word.jfif', 0)  # 以灰度模式读取图像# 定义不同形状和大小的结构元素kernel_rect = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))  # 矩形结构元素kernel_ellipse = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))  # 椭圆结构元素kernel_cross = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3))  # 十字形结构元素# 腐蚀操作erosion_rect = cv2.dilate(img, kernel_rect, iterations=1)erosion_ellipse = cv2.dilate(img, kernel_ellipse, iterations=1)erosion_cross = cv2.dilate(img, kernel_cross, iterations=1)# 显示结果plt.figure(figsize=(12, 8))plt.subplot(2, 2, 1)plt.imshow(img, cmap='gray')plt.title('Original Image')plt.axis('off')plt.subplot(2, 2, 2)plt.imshow(erosion_rect, cmap='gray')plt.title('Dilation with Rectangular Kernel')plt.axis('off')plt.subplot(2, 2, 3)plt.imshow(erosion_ellipse, cmap='gray')plt.title('Dilation with Elliptical Kernel')plt.axis('off')plt.subplot(2, 2, 4)plt.imshow(erosion_cross, cmap='gray')plt.title('Dilation with Cross-shaped Kernel')plt.axis('off')plt.show()

  • 膨胀操作会让白色孔洞变大,黑色字体会变瘦
  • 矩形效果不好,实际运行时可以在字体边缘看到一些处理过的痕迹,椭圆形与十字星更适合毛笔字的处理

1.3.4. cv2.morphologyEx(开运算、闭运算、顶帽操作、黑帽操作、形态学梯度)

函数

cv2.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) -> dst

参数解释

  • src:输入图像(通常是二值图像或灰度图像)。
  • op:形态学操作类型:
    • cv2.MORPH_OPEN:开运算。
    • cv2.MORPH_CLOSE:闭运算。
    • cv2.MORPH_TOPHAT:顶帽操作。
    • cv2.MORPH_BLACKHAT:黑帽操作。
    • cv2.MORPH_GRADIENT:形态学梯度。
  • kernel:结构元素(卷积核),用于定义邻域的形状和大小。
  • dst:输出图像。如果未指定,则默认与输入图像具有相同的类型和大小。
  • anchor:结构元素的锚点位置,默认为 (-1, -1),表示锚点位于结构元素的中心。
  • iterations:迭代次数,默认为 1。增加迭代次数会增强操作的效果。
  • borderType:边界填充方式,默认为 cv2.BORDER_CONSTANT
  • borderValue:边界填充的值,默认为 0。

参数确定方法

  • 结构元素(Kernel):根据图像的特征和处理目标选择合适的形状和大小。例如,去除小噪点时,可以选择较小的结构元素,如 np.ones((3, 3), np.uint8);填补小孔时,可以选择较大的结构元素,如 np.ones((5, 5), np.uint8)
  • 迭代次数(Iterations):根据需要调整,次数越多,操作的效果越明显。通常设置为 1 或 2。

参数对结果的影响

  • 结构元素的形状和大小:影响操作的范围和效果。较大的结构元素会使操作效果更明显,但可能会导致图像失真。
  • 迭代次数:增加迭代次数会使操作效果更明显,但可能会导致图像过度处理。

使用注意事项

  • 选择合适的结构元素大小和形状,避免过度处理导致图像失真。
  • 迭代次数不宜过多,以免影响图像的整体结构。
  • 不同的操作类型(如开运算、闭运算等)对图像的影响不同,需根据具体需求选择合适的操作类型。

根据运算结果,我们可以尝试对比一下结果图

def TestMorphologicalEx():image=cv2.imread("Word.jfif",0) #读取灰度图kernel=cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3))#十字星 3*3        image_open=cv2.morphologyEx(image,cv2.MORPH_OPEN,kernel,iterations=1)image_close=cv2.morphologyEx(image,cv2.MORPH_CLOSE,kernel,iterations=1)image_TopHat=cv2.morphologyEx(image,cv2.MORPH_TOPHAT,kernel,iterations=1)image_BlackHat=cv2.morphologyEx(image,cv2.MORPH_BLACKHAT,kernel,iterations=1)# 显示结果plt.figure(figsize=(8, 12))plt.subplot(3, 2, 1)plt.imshow(image, cmap='gray')plt.title('Original Image')plt.axis('off')plt.subplot(3, 2, 2)plt.imshow(image, cmap='gray')plt.title('Original Image')plt.axis('off')plt.subplot(3, 2, 3)plt.imshow(image_open, cmap='gray')plt.title('image_open')plt.axis('off')plt.subplot(3, 2, 4)plt.imshow(image_close, cmap='gray')plt.title('image_close')plt.axis('off')plt.subplot(3, 2, 5)plt.imshow(image_TopHat, cmap='gray')plt.title('image_TopHat Original - open')plt.axis('off')plt.subplot(3, 2, 6)plt.imshow(image_BlackHat, cmap='gray')plt.title('image_BlackHat Close - Original')plt.axis('off')plt.show()

 

  • 在这个图中前景是白色,黑色是背景
  • 顶帽操作结果是开运算去除的噪点,可以看到白色前景的噪点确实去掉了,在这里体现在于背景(黑色部分)更连续了
  • 黑帽操作是闭运算补全的孔洞,白色为前景,红框部分可以理解为前景中的孔洞,闭运算填补了孔洞

 

相关文章:

OpenCV形态学操作

1.1. 形态学操作介绍 初识: 形态学操作是一种基于图像形状的处理方法,主要用于分析和处理图像中的几何结构。其核心是通过结构元素(卷积核)对图像进行扫描和操作,从而改变图像的形状和特征。例如: 腐蚀&…...

使用Python中的`gensim`库构建LDA(Latent Dirichlet Allocation)模型来分析收集到的评论

下面为你详细介绍如何使用Python中的gensim库构建LDA(Latent Dirichlet Allocation)模型来分析收集到的评论。LDA是一种主题模型,它可以将文档集合中的文本按照主题进行分类。 步骤概述 数据预处理:对收集到的评论进行清洗、分词…...

【STM32】外部时钟|红外反射光电开关

1.外部时钟 单片机如何对外部触发进行计数?先看一下内部时钟,内部时钟是接在APB1和APB2时钟线上的,APB1,APB2来自stm32单片机内部的脉冲信号,也叫内部时钟。我们用来定时。同样我们可以把外部的信号接入单片机,来对其…...

Visual Studio Code 集成 Baidu Comate

文章目录 安装Baidu Comate插件 安装Baidu Comate插件 从左主侧栏中 点击 【扩展】这个图标,然后在上方输入栏中输入 baidu comate —>选中列出的Bai Comate —>点击 【安装】按钮,等待安装完毕…...

数据结构者

数据(data):可被计算机接受处理的符号总称 数据元素(data element):数据的基本单位,常作为一个整体进行考虑和处理 一个数据元素可以由若干个数据项(data item)组成 数…...

论文阅读 DOES END-TO-END AUTONOMOUS DRIVING REALLY NEED PERCEPTION TASKS?

端到端的强势来袭,好久了~~~ 简单翻译:端到端真的需要感知任务嘛? code https://github.com/PeidongLi/SSR. https://arxiv.org/pdf/2409.18341 1. 摘要 端到端自动驾驶(E2EAD)方法通常依赖于监督式感知任务来提取显…...

总结UML类图几种关系画法

最近在公司需要画类图,有些遗忘,于是重新学习并并总结了一下: 继承:实线空心三角箭头。A继承B,A指向B。A是一种B。实现:虚线空心三角箭头。A实现B,A指向B。A实现B接口。关联:实线普…...

python-leetcode 40.二叉树的层序遍历

题目: 给定二叉树的根节点root,返回其节点值得层序遍历(即逐层从左到右访问所有节点) 方法:广度优先搜索 # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, val0, leftNone, rightNon…...

安利:外文文献翻译插件

沉浸式翻译 好用吹爆!!!!!!!! 任务 2.谷歌学术 复制外文的标题搜索 3.进入文献所在,登录对应机构 4.可以看到都翻译好了 5.然后复制到文档,改改格式巴…...

Python——生成AIGC图像

文章目录 一、背景介绍 二、效果图展示 三、完整代码 四、分步解释 五、实用建议 1)提示词技巧 2)性能优化 3)常见问题处理 4)扩展功能建议 六、注意事项 1. 硬件要求 2. 法律合规 3. 模型安全 一、背景介绍 AIGC&a…...

OpenGL(2)基于Qt做OpenGL开发

文章目录 一、基于Qt做OpenGL开发1、环境准备2、创建OpenGL窗口3、绘制基本图形 一、基于Qt做OpenGL开发 1、环境准备 确保你已经安装了 Qt 开发环境(包含 Qt Creator),并且支持 OpenGL 开发。在创建 Qt 项目时,选择 “Qt Widget…...

【Windows软件 - HeidiSQL】导出数据库

HeidSQL导出数据库 软件信息 具体操作 示例文件 选项分析 选项(1) 结果(1) -- -------------------------------------------------------- -- 主机: 127.0.0.1 -- 服务器版本: …...

用deepseek学大模型04-模型可视化与数据可视化

deepseek.com: pytorch可视化工具 生成神经网络图 在 PyTorch 中,可视化神经网络结构的常用工具和方法有以下几种,以下将详细介绍它们的用法: 1. TensorBoard (PyTorch 官方集成) PyTorch 通过 torch.utils.tensorboard 支持 TensorBoard&a…...

rust笔记8-Deref与隐式解引用强制转换

Rust 的智能指针和 Deref Trait 是 Rust 中非常重要的概念,它们使得 Rust 的引用和指针操作更加灵活和安全。下面我们将深入介绍 Deref Trait、Deref 与 &、* 运算符的关系,以及 Rust 的隐式解引用强制转换(Deref Coercion)。 1. 智能指针与 Deref Trait 智能指针(如…...

Debian软件包重构

Explore projects GitLab 1. apt-get build-dep <pkg> ## 安装编译依赖包 2. apt source <pkg> ## 下载 <pkg> 包的源码 3. 创建 git &#xff0c;打补丁 4. dpkg-buildpackage -b -uc -us -d ## 重新打包编译 # 解压出包中的文件到 extract 目…...

学习 `@PreDestroy`:Java EE/Jakarta EE 生命周期回调

学习 PreDestroy&#xff1a;Java EE/Jakarta EE 生命周期回调 前言1. 什么是 PreDestroy&#xff1f;2. PreDestroy 的用途3. 使用 PreDestroy 的条件4. 代码示例运行结果&#xff1a; 5. PreDestroy 的调用时机6. 注意事项7. 实际应用场景场景 1&#xff1a;数据库连接管理场…...

JDK最详细安装教程,零基础入门到精通,收藏这篇就够了

目录 一、下载与安装二、配置环境三、验证是否配置成功 一、下载与安装 1、下载地址 http://www.oracle.com/technetwork/java/javase/downloads/index.html 2、选择自己想要的版本下载&#xff0c;并且选择自己电脑对应的版本下载 3、下载完成之后&#xff0c;双击打开然后…...

解决DeepSeek服务器繁忙问题的实用指南

目录 简述 1. 关于服务器繁忙 1.1 服务器负载与资源限制 1.2 会话管理与连接机制 1.3 客户端配置与网络问题 2. 关于DeepSeek服务的备用选项 2.1 纳米AI搜索 2.2 硅基流动 2.3 秘塔AI搜索 2.4 字节跳动火山引擎 2.5 百度云千帆 2.6 英伟达NIM 2.7 Groq 2.8 Firew…...

【一个人的第一年】成都Java日志7

#海纳百川&#xff0c;有容乃大# 1.互联网 互联网是一个服务我的工具而不是绑架任何人的场所&#xff0c;网络不是现实&#xff0c;现实才是生活。 现在越来越多的声音出现在互联网&#xff0c;能轻易地挑起群体情绪。对其他的任何事可以有不同的立场和观点&#xff0c;而不是…...

回调处理器

文章目录 什么是回调处理器回调处理器的工作流程回调处理器的使用自定义链组件中的回调 内置回调处理器自定义回调处理器 在编程领域中&#xff0c;回调是一个非常重要的概念。简而言之&#xff0c;回调是一种特殊的函数或方法&#xff0c;它可以被传递给另一个函数作为参数&am…...

国产编辑器EverEdit -告别东找西找!一键打开当前文件所在目录!

1 文件操作 2 应用场景 在文件编辑过程中&#xff0c;有时需要对文件进行一些操作&#xff0c;比如&#xff1a;在命令窗口输入文件路径、文件名&#xff0c;进入到文件目录&#xff0c;对文件进行压缩等&#xff0c;如果没有直达命令&#xff0c;用户需要通过文件管理器找到目…...

23种设计模式 - 解释器模式

模式定义 解释器模式&#xff08;Interpreter Pattern&#xff09;是一种行为型设计模式&#xff0c;用于为特定语言&#xff08;如数控系统的G代码&#xff09;定义文法规则&#xff0c;并构建解释器来解析和执行该语言的语句。它通过将语法规则分解为多个类&#xff0c;实现…...

深度学习在语音识别中的应用

引言 语音识别技术是人工智能领域中的一个重要分支&#xff0c;它使得机器能够理解和转换人类的语音为文本。深度学习的出现极大地推动了语音识别技术的发展。本文将介绍如何使用深度学习构建一个基本的语音识别系统&#xff0c;并提供一个实践案例。 环境准备 在开始之前&a…...

【相聚青岛】人工智能与材料国际学术会议即将召开

一、大会简介 人工智能与材料国际会议&#xff08;ICAIM 2025&#xff09; 官方网站&#xff1a;www.ic-aim.net 官方邮箱&#xff1a;icaim2025163.com 会议时间&#xff1a;2025年3.21-24 会议地点&#xff1a;中国青岛 会议检索&#xff1a;EI检索 截稿时间&#xff1a;2月…...

PHP会务会议系统小程序源码

&#x1f4c5; 会务会议系统 一款基于ThinkPHPUniapp框架&#xff0c;精心雕琢的会议管理微信小程序&#xff0c;专为各类高端会议场景量身打造。它犹如一把开启智慧殿堂的金钥匙&#xff0c;为会议流程优化、开支精细化管理、数量精准控制、标准严格设定以及供应商严格筛选等…...

能够私有化部署的集装箱箱号识别软件,技术实现方法

启智畅想集装箱箱号识别软件是一种基于计算机视觉和OCR&#xff08;光学字符识别&#xff09;技术的工具&#xff0c;主要用于自动识别集装箱上的唯一编号&#xff08;如ISO6346标准的箱号&#xff0c;格式为4位字母7位数字1位校验码&#xff09;。以下是关于此类软件的关键信息…...

idea连接gitee后.反向创建仓库和分支

文章目录 自动关联你登录的账号填写你的仓库和分支完成后会在gitee上创建一个仓库 (使用idea远程兼容gitee并反向创建仓库和分支) 自动关联你登录的账号 填写你的仓库和分支 完成后会在gitee上创建一个仓库...

Java——面向对象编程

面向对象编程&#xff08;Object-Oriented Programming, OOP&#xff09;是Java的核心特性之一。它通过将现实世界中的事物抽象为对象&#xff0c;使程序更易于理解、维护和扩展。以下是Java面向对象编程的详细介绍&#xff1a; 1. 面向对象编程的四大特性 Java的面向对象编程…...

MAC快速本地部署Deepseek (win也可以)

MAC快速本地部署Deepseek (win也可以) 下载安装ollama 地址: https://ollama.com/ Ollama 是一个开源的大型语言模型&#xff08;LLM&#xff09;本地运行框架&#xff0c;旨在简化大模型的部署和管理流程&#xff0c;使开发者、研究人员及爱好者能够高效地在本地环境中实验和…...

从猜想终结到算法革新,弹性哈希开启数据存储新篇章

目录 哈希表的前世今生基本原理从传统到现代&#xff1a;哈希表的演变历程 安德鲁 克拉皮文及其团队的创作历程弹性哈希详解基本原理优点技术细节 漏斗哈希解析基本原理优点技术细节 新算法的实际应用案例电子商务推荐系统金融交易监控系统社交媒体内容过滤物联网设备管理 结论…...

云端SaaS系统架构设计

随着互联网的发展&#xff0c;SaaS&#xff08;软件即服务&#xff09;架构在众多行业中得到了广泛应用。作为一种高效、可扩展的服务模式&#xff0c;SaaS不仅提升了企业的信息化水平&#xff0c;也使得服务提供商能够通过云计算平台实现全球范围内的业务交付。在设计一个现代…...

黑盒测试和白盒测试的主要优缺点

黑盒测试 vs. 白盒测试&#xff1a;优缺点对比 类别黑盒测试&#xff08;Black-box Testing&#xff09;白盒测试&#xff08;White-box Testing&#xff09;定义不关注代码实现&#xff0c;仅测试功能和输入输出关注代码逻辑&#xff0c;测试代码内部实现测试依据需求文档、功…...

获取每月最后一个工作日:考虑法定节假日与调休

在许多业务场景中&#xff0c;了解每个月的最后一个工作日对于财务结算、报告生成等至关重要。然而&#xff0c;确定这一日期时必须考虑到国家的法定节假日以及可能存在的调休安排。本文将介绍如何通过Java编写一个工具类来获取指定月份的最后一个工作日&#xff0c;并利用第三…...

Hayabusa:一款针对Windows事件日志的威胁搜索与取证分析工具

关于Hayabusa Hayabusa是一款针对Windows事件日志的威胁搜索与取证分析工具&#xff0c;该工具基于内存安全的Rust开发&#xff0c;支持多线程运行&#xff0c;并且是唯一完全支持 Sigma 规范&#xff08;包括 v2 关联规则&#xff09;的开源工具。 Hayabusa本质上是一个Windo…...

leetcode_位运算 190.颠倒二进制位

190. 颠倒二进制位 颠倒给定的 32 位无符号整数的二进制位。 1. 字符串 class Solution:# param n, an integer# return an integerdef reverseBits(self, n):res "" # 创建一个保存结果的空字符串for b in str(bin(n))[2:]:# 遍历n的二进制数res b res # 把每…...

O1 Embedder:让检索器思考后再行动

25年2月来自中科大和北京智源研究院的论文“O1 Embedder: Let Retrievers Think Before Action”。 大语言模型 (LLM) 的功能日益强大&#xff0c;彻底改变人们获取和利用信息的方式。值得注意的是&#xff0c;LLM 擅长执行细粒度数据表示&#xff0c;这有助于精确检索信息。它…...

Python项目中一些常用的关键字

数据定义与类型相关 int&#xff1a;表示整数类型。 float&#xff1a;用于表示浮点数类型。 str&#xff1a;字符串类型&#xff0c;用于处理文本数据。 bool&#xff1a;布尔类型&#xff0c;取值为True或False。 list&#xff1a;列表类型&#xff0c;可存储多个元素&am…...

Java 反射 (Reflection) 详解

一、什么是 Java 反射&#xff1f; Java 反射 (Reflection) 是 Java 语言的一个强大特性&#xff0c;它允许 在运行时 检查和修改类、接口、字段和方法的信息&#xff0c;而不需要在编译时知道这些信息。 换句话说&#xff0c;反射可以让你在程序运行过程中“动态”地获取类的…...

MicroPython使用ESP32和acs712模块测量电流

我们在做物联网应用时&#xff0c;电流检测是监控设备能耗、优化电源管理的重要手段&#xff0c;本文介绍如何利用MicroPython开发ESP32与ACS712霍尔电流传感器模块&#xff0c;实现高精度电流测量&#xff0c;并提供硬件连接、代码实现及校准方法&#xff0c;适用于智能家居、…...

Rust编程语言入门教程 (七)函数与控制流

Rust 系列 &#x1f380;Rust编程语言入门教程&#xff08;一&#xff09;安装Rust&#x1f6aa; &#x1f380;Rust编程语言入门教程&#xff08;二&#xff09;hello_world&#x1f6aa; &#x1f380;Rust编程语言入门教程&#xff08;三&#xff09; Hello Cargo&#x1f…...

pdf预览在vue项目中的使用兼容ie浏览器

一、下载pdf预览插件 链接: https://pan.baidu.com/s/1wuzay-saAfiqtS-efd-cvw?pwd6m78 提取码: 6m78 二、创建一个pdf文件夹&#xff0c;将下载下来的文件build和web文件夹复制到pdf文件夹下 三、项目中使用 (路径由两部分组成&#xff0c;第一部分是项目存放pdf插件的路径…...

二级指针略解【C语言】

以int** a为例 1.二级指针的声明 a 是一个指向 int*&#xff08;指向整型的指针&#xff09;的指针&#xff0c;即二级指针。 通俗的讲&#xff0c;a是一个指向指针的指针&#xff0c;对a解引用会是一个指针。 它可以用于操作动态分配的二维数组、指针数组或需要间接修改指针…...

前端基础入门:HTML、CSS 和 JavaScript

在现代网页开发中,前端技术扮演着至关重要的角色。无论是个人网站、企业官网,还是复杂的 Web 应用程序,前端开发的基础技术 HTML、CSS 和 JavaScript 都是每个开发者必须掌握的核心技能。本文将详细介绍这三者的基本概念及其应用 一、HTML——网页的骨架 HTML(HyperText …...

测试 FreeSWITCH 的 sip_invite_route_uri

bgapi originate sofia/external/123461.132.230.73:5161 &echo 得到的是&#xff1a; 172.17.129.123:5088 -> 61.132.230.73:5161 INVITE sip:123461.132.230.73:5161 SIP/2.0 Via: SIP/2.0/UDP 8.141.11.8:5088;rport;branchz9hG4bKcagQFyUgF21NS Max-Forwards: 70 …...

网络安全中的机器学习

当涉及到网络安全时&#xff0c;技术一直是保护系统免受攻击和数据泄露的关键。在这篇论文中&#xff0c;我将介绍一些当前在网络安全领域使用的关键技术&#xff0c;包括加密&#xff0c;身份验证和防火墙。 首先&#xff0c;加密是网络安全中最常见的技术之一。加密是指使用算…...

Electron通过ffi-napi调用dll导出接口

electron使用ffi-napi环境搭建 附打包好的ffi-napi可以直接放到项目目录下使用&#xff0c;避免以后麻烦 一、安装node.js Node.js官网&#xff1a;https://nodejs.org/zh-cn/download&#xff0c;选择LTS长期稳定版本即可 需要注意Node.js 区分32和64位&#xff0c;32位版…...

使用 DeepSeek + 语音转文字工具 实现会议整理

目录 简述 1. DeepSeek与常用的语音转文字工具 1.1 DeepSeek 1.2 讯飞听见 1.3 飞书妙记 1.4 剪映电脑版 1.5 Buzz 2. 安装Buzz 3. 使用DeepSeek Buzz提取并整理语音文字 3.1 使用 Buzz 完成语音转文字工作 3.2 使用 DeepSeek 进行文本处理工作 3.3 整理成思维导图…...

RAGFLOW使用flask转发的open ai接口

flask转发openai标准接口 背景 搭建RAGFLOW 的过程中&#xff0c;遇到一个比较严重的问题&#xff0c;公司部署的大模型代理需要获取token&#xff0c;且token存在有效期5分钟&#xff0c;在RAGFLOW中不能直接用&#xff0c;所以希望通过flask项目转发请求。 方案 比较好的…...

语音芯片非隔离电源供电WT5104

语音芯片非隔离电源供电WT5104 语音芯片供电非隔离电源芯片 WT5104 介绍 在语音相关设备的运行中&#xff0c;稳定的电源供应是确保语音芯片正常工作、实现高质量语音交互的关键。WT5104 作为一款专为多种设备供电设计的非隔离电源芯片&#xff0c;能将常见的 220V 交流电高效转…...

P8752 [蓝桥杯 2021 省 B2] 特殊年份——string提取索引转换为值

这里写目录标题 链接题目代码大佬解答string提取索引转换为值 链接 P8752 [蓝桥杯 2021 省 B2] 特殊年份 题目 代码 #include <iostream> #include <vector> #include <string> #include <algorithm> #include <math.h> #include <queue&g…...