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

OpenCV 中的分水岭算法的原理及其应用---图像分割的利器

图像分割作为计算机视觉的基石领域,历经数十年的演进与革新,从传统的图像处理方法到如今蓬勃发展的深度学习技术,始终推动着计算机视觉应用的边界拓展。本系列文章将通过三篇深度技术博客,分别对三种极具代表性的图像分割技术展开全面剖析 —— 基于 OpenCV 的经典分水岭算法、基于 PyTorch 框架实现的 UNet 深度学习模型,以及当下最先进(SOTA)的图像分割模型。在本篇文章中,我们将率先聚焦于分水岭算法,深入探讨其原理、OpenCV 实现细节,以及优化技巧。后续文章中,我们还将在人体分割数据集上训练 UNet 模型,直观展现深度学习在图像分割任务中的强大性能与广泛适用性。

什么是图像分割?

图像分割,简单来说,就是将一幅图像划分为多个具有独特特征的区域或片段的过程。每个区域内的像素集合具有相似的属性,如颜色、纹理、灰度值等。这项技术的核心目标,是将原始图像转化为更简洁、更具语义信息的表达形式,从而显著降低图像分析的复杂度,为后续诸如目标识别、场景理解、医学图像诊断、自动驾驶中的障碍物检测等任务奠定坚实基础。

在医学领域,图像分割能够精准提取 X 光、CT、MRI 等医学影像中的器官、肿瘤等感兴趣区域,助力医生进行疾病诊断与治疗方案制定;在智能安防领域,通过分割监控视频中的目标物体,实现异常行为检测与人员追踪;在工业质检中,对产品图像进行分割,可快速识别瑕疵与缺陷。可见,图像分割技术已深度融入众多行业,成为推动技术发展与应用落地的关键力量。

经典路线:使用 OpenCV 的分水岭算法

2.1 算法核心思想

分水岭算法源于地形学的启发,将灰度图像巧妙类比为三维地形。在这个地形模型中,图像的灰度值对应地形的高度 —— 灰度值高的区域如同巍峨的山峰与起伏的丘陵,灰度值低的区域则恰似深邃的山谷。算法的执行过程宛如一场 “洪水漫灌” 的模拟:从每个山谷的最低点开始注入 “洪水”,随着水位不断上升,来自不同山谷的洪水逐渐蔓延。当两股不同来源的洪水即将汇合时,就在它们的交界处筑起 “堤坝”。持续这一过程,直至整个地形都被 “淹没”,最终形成的这些 “堤坝”,便勾勒出了图像中不同对象的边界,实现图像分割。

然而,在实际应用中,由于图像不可避免地存在噪声、纹理细节以及复杂光照等干扰因素,直接应用上述简单的分水岭算法,往往会导致严重的过度分割问题 —— 原本完整的对象被错误地划分成大量细小的子区域,极大地影响分割效果。为解决这一难题,基于标记的分水岭算法应运而生。

2.2 基于标记的分水岭算法优化

基于标记的分水岭算法引入了 Marker 这一关键概念。标记可视为对图像中已知前景和背景区域的先验标注,通过人工交互、阈值处理、形态学操作或其他启发式方法生成。在算法执行前,将前景对象标记为不同的正整数(如 1、2、3...,每个数字对应一个独立对象),背景区域标记为 0,而尚未确定归属的区域则暂不标记。

在后续的 “洪水漫灌” 过程中,洪水只会从已标记的区域开始蔓延,并且只有来自不同标记区域的洪水相遇时,才会构建 “堤坝”。如此一来,有效避免了因噪声等因素导致的过度分割,显著提升了算法的准确性与实用性。

分水岭算法和OpenCV

  1. 阈值处理:在分水岭算法中,阈值处理在识别图像的某些部分方面起着重要作用。将图像转换为灰度后,该算法对灰度图像应用阈值处理,以获得二值图像,该二值图像有助于分离前景(待分割的对象)和背景。
# 加载图像
img = cv2.imread( 'water_coins.jpg' ) 
imshow( "Original image" , img) # 灰度
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 使用 OTSU 进行阈值处理
ret, thresh = cv2.threshold(gray, 0 , 255 , cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) 
imshow( "Thresholded" , thresh)

2.开运算(先腐蚀,后膨胀):在此步骤中,执行开运算,即先腐蚀运算,再膨胀运算。此步骤的主要目的是为了去除噪声。腐蚀运算可以去除图像中的小白噪声,但同时也会缩小物体的尺寸。之后进行膨胀运算,可以让我们保留物体的大小,同时去除噪声。

让我们了解一下侵蚀和扩张

  1. 腐蚀:此操作会腐蚀掉前景对象的边界。其工作原理是创建一个卷积核并将其传入图像。如果核下方区域中的任何像素为黑色,则核中间的像素将被设置为黑色。此操作可有效去除细小的白噪声。
  2. 膨胀:腐蚀之后进行膨胀,本质上与腐蚀相反。膨胀操作会将像素添加到图像中对象的边界。如果核下方区域中的任何像素为白色,则核中间的像素将被设置为白色。
# 噪声消除
kernel = np.ones(( 3 , 3 ), np.uint8) 
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN,kernel, iterations = 2 )

让我们分解一下:

  1. 创建核:np.ones((3,3),np.uint8)创建一个 3x3 矩阵,所有元素均为“1”。该矩阵将用作形态学运算的“结构元素”。它可以是各种形状(正方形、圆形等),但在本例中,我们使用的是正方形。
  2. 应用开运算:cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations = 2)应用开运算。'thresh' 是我们在阈值化后获得的二值图像,cv2.MORPH_OPEN表示我们要进行开运算,'kernel' 是我们的结构元素,'iterations = 2' 表示我们要执行两次操作。

3. 膨胀用于背景识别:在此步骤中,膨胀操作用于识别图像的背景区域。上一步的结果(已去除噪声)将进行膨胀。膨胀后,物体(或前景)周围的很大一部分预计将成为背景区域(因为膨胀会扩大物体)。这个“确定的背景”区域有助于分水岭算法的后续步骤,我们的目标是识别不同的片段/物体。
# sure background area
sure_bg = cv2.dilate(opening, kernel, iterations=3)

4. 距离变换:分水岭算法涉及应用距离变换来识别可能成为前景的区域。此步骤的代码如下: 
# 寻找确定的前景区域
dist_transform = cv2.distanceTransform(opening, cv2.DIST_L2, 5 ) 
ret, sure_fg = cv2.threshold(dist_transform, 0.7 * dist_transform.max ( ), 255 , 0 )

在此步骤中,我们要做两件事:

  1. 应用距离变换:该cv2.distanceTransform函数使用欧氏距离计算每个二值图像像素到最近零像素的距离cv2.DIST_L2。距离变换有助于我们识别可能位于前景的区域。该函数cv2.distanceTransform(opening, cv2.DIST_L2, 5)计算此变换。
  2. 对距离变换进行阈值处理:计算距离变换后,我们对变换后的图像应用阈值处理,以获得确定的前景区域。cv2.threshold(dist_transform, 0.7*dist_transform.max(), 255, 0)函数调用应用了阈值处理。第二个参数0.7*dist_transform.max()将阈值设置为距离变换找到的最大距离的 70%。距离变换值高于此阈值的像素将被设置为确定的前景。
5. 识别未知区域:我们识别未知区域,即既不是确定前景也不是确定背景的区域。首先,我们将确定前景(sure_fg)转换为无符号的8位整数。然后,用确定背景(sure_bg)减去确定前景,得到未知区域。未知区域是分水岭算法的关键,因为它表示不同对象之间或对象与背景之间的过渡区域。
# 查找未知区域
sure_fg = np.uint8(sure_fg) 
unknown = cv2.subtract(sure_bg, sure_fg) imshow( "SureFG" , sure_fg) 
imshow( "SureBG" , sure_bg) 
imshow( "unknown" , unknown)

 

1. 确定前景(Sure Foreground):硬币所占据的区域,更确切地说,由于使用了距离变换和后续的阈值处理,硬币的中心区域会被识别为确定前景。这些区域是算法明确认定属于硬币本身的部分,是分割中较为确定的前景部分。

2. 确定背景(Sure Background):围绕硬币的区域,以及硬币内部那些足够大、未被形态学操作去除的区域,会被标记为确定背景。从本质上讲,这些区域是不存在硬币的区域。算法通过形态学操作等手段,将这些明显不包含硬币的区域准确识别并标记为背景部分。

3. 未知区域(Unknown Region):这些区域既不属于确定前景,也不属于确定背景。它们主要位于硬币边缘附近,在这些区域,算法没有足够的把握将其归为前景(硬币)或背景(硬币周围的区域)。由于硬币边缘的模糊性、噪声干扰或图像特征的复杂性等因素,使得算法难以准确判断这些区域的归属,因此将其标记为未知区域。

 

6.  标记 sure_bg、sure_fg 和未知区域: 需要创建一个标记并标记其中的区域。我们标记的区域包括确定的背景 ( sure_bg)、确定的前景 ( sure_fg) 和未知区域。以下是此步骤的代码片段:
# 标记标记
# 连通分量确定二值图像中斑点状区域的连通性。ret, markers = cv2.connectedComponents(sure_fg) # 为所有标签加 1,以确保背景不为 0,而是 1markers = markers+ 1 # 现在,用零标记未知区域
markers[unknown== 255 ] = 0

另外,我们希望确定的背景与确定的前景的标签不同,我们将标记图像中的所有标签加 1。经过此操作后,确定的背景像素被标记为 1,而确定的前景像素的标签从 2 开始。 

7.应用分水岭算法

下一步是将分水岭算法应用于标记(在前面步骤中找到的标记区域)

markers = cv2.watershed(img,markers)
img[markers == -1] = [255,0,0]imshow("img", img)

 

cv2.watershed()函数修改标记图像(markers)本身。图像中物体的边界用 -1 标记markers。图像中不同的物体用不同的正整数标记。因此,不确定是背景还是前景的区域由分水岭算法确定——它们要么被分配到背景,要么被分配到某个物体,从而在物体和背景之间形成清晰的边界划分。

分水岭算法是如何工作的?

分水岭算法中的“FloodingDam Construction概念本质上是一种描述算法如何工作的隐喻方式

  1. Flooding: “泛洪”过程是指基于图像梯度对每个标记区域(标记)进行扩展。在这种情况下,梯度代表地形高程,高强度像素值代表峰顶,低强度像素值代表谷底。泛洪从谷底(即强度值最低的区域)开始。泛洪过程的执行方式是,为图像中的每个像素分配一个标签。它获得的标签取决于哪个标记的“泛洪”首先到达它。如果一个像素与多个标记的距离相等,则它暂时仍属于未知区域。
  2. Dam Construction:随着洪水过程的持续,来自不同标记(代表图像中不同区域)的洪水最终会开始汇合。汇合后,便会形成一座“大坝”。从算法角度来看,这种筑坝相当于在标记图像中创建边界。这些边界会被赋予一个特殊标签(通常为 -1)。大坝建在不同标记洪水汇合的位置,这些位置通常是图像中强度快速变化的区域——标志着图像中不同区域之间的边界。

应用分水岭算法后,我们的标记图像(最初包含确定前景、确定背景和未知区域的标签)现在包含图像中每个不同对象的标签。我们有效地将图像分割成不同的对象(硬币)和背景。

结论

分水岭算法凭借直观的地形模拟思想,为图像分割领域提供了极具效率的解决方案。该算法通过模拟洪水漫灌与堤坝构建的过程,能够从复杂的图像场景中精准提取关键特征,在目标识别、医学影像分析等众多领域展现出独特的应用价值。借助 Python 生态中的 OpenCV 库,分水岭算法的实现流程得到了极大简化,开发者能够快速搭建起图像分割模型,将理论算法高效转化为实际应用。

尽管分水岭算法在概念和基础实现上优势显著,但其原生形态容易受图像噪声、纹理细节等因素影响,导致过度分割问题,即单一对象被错误划分成多个子区域。不过,通过针对性的图像预处理操作(如形态学滤波、阈值优化)以及参数精细化调整,这一缺陷能够得到有效克服。例如,结合距离变换与阈值分割确定前景区域,利用形态学操作明确背景范围,可显著提升算法的分割精度与稳定性,使其成为图像分析任务中的可靠利器。

值得强调的是,图像分割技术的选择本质上是对项目需求、数据特性与计算资源的综合考量。分水岭算法虽然强大,但在面对语义复杂、目标边界模糊的图像时,可能需要与深度学习算法或其他传统方法结合使用。未来,随着多技术融合趋势的深化,分水岭算法有望在更多复杂场景中焕发新的活力,持续为图像分割技术的发展贡献力量。

 

 

 

 

 

相关文章:

OpenCV 中的分水岭算法的原理及其应用---图像分割的利器

图像分割作为计算机视觉的基石领域,历经数十年的演进与革新,从传统的图像处理方法到如今蓬勃发展的深度学习技术,始终推动着计算机视觉应用的边界拓展。本系列文章将通过三篇深度技术博客,分别对三种极具代表性的图像分割技术展开…...

Python项目--基于机器学习的股票预测分析系统

1. 项目介绍 在当今数字化时代,金融市场的数据分析和预测已经成为投资决策的重要依据。本文将详细介绍一个基于Python的股票预测分析系统,该系统利用机器学习算法对历史股票数据进行分析,并预测未来股票价格走势,为投资者提供决策…...

第三阶段面试题

Nginx nginx常用模块以及其功能 proxy模块,进行代理功能 ssl模块,进行HTTPS协议的使用 gzip模块,进行传输数据的压缩 upstream模块,进行反向代理时使用 static模块,静态资源进行访问的模块 cache模块&#xff0…...

spring响应式编程系列:总体流程

目录 示例 程序流程 just subscribe new LambdaMonoSubscriber ​​​​​​​MonoJust.subscribe ​​​​​​​new Operators.ScalarSubscription ​​​​​​​onSubscribe ​​​​​​​request ​​​​​​​onNext 时序图 类图 数据发布者 MonoJust …...

基于PySide6与pyCATIA的圆柱体特征生成工具开发实战——NX建模之圆柱命令的参考与移植

引言 在机械设计领域,特征建模的自动化是提升设计效率的关键。本文基于PySide6与pycatia技术栈,深度解析圆柱特征自动化生成系统的开发实践,涵盖参数化建模、交互式元素选择、异常处理等核心模块,实现比传统手动操作提升3倍效率的…...

kafka jdbc connector适配kadb数据实时同步

测试结论 源端增量获取方式包括:bulk、incrementing、timestamp、incrementingtimestamp(混合),各种方式说明如下: bulk: 一次同步整个表的数据 incrementing: 使用严格的自增列标识增量数据。不支持对旧数据的更新…...

pgsql中使用jsonb的mybatis-plus和jps的配置

在pgsql中使用jsonb类型的数据时,实体对象要对其进行一些相关的配置,而mybatis和jpa中使用各不相同。 在项目中经常会结合 MyBatis-Plus 和 JPA 进行开发,MyBatis_plus对于操作数据更灵活,jpa可以自动建表,两者各取其…...

4.17-4.18学习总结 多线程

并发与并行: 并发和并行是有可能都在发生的。 多线程的实现方式: 第一种:创建子类对象,调用start方法启动线程。 第二种: 第三种: 第一种和第二种不可以获取到多线程结果,但第三章种可以。 多…...

无人机在农业中的应用与挑战!

一、无人机在农业中的作用 1. 提升作业效率与降低成本 无人机在喷洒农药、播种、施肥、吊运等环节显著提升效率。例如,湖北秭归县使用大疆T100无人机吊运脐橙,单次85公斤的运输任务仅需2分钟,而人工需1小时,综合成本降低250元…...

无刷电机槽数相同、转子极数不同的核心区别

一、基础原理差异 无刷电机的核心参数: 槽数(定子槽数,记为 ( Z )):定子铁芯上的绕组槽数量,决定绕组布局。极数(转子磁极数,记为 ( 2p )):转子上的永磁体磁极对数(总极数为 ( 2p ),如 ( p=4 ) 表示 8 极)。核心关系:槽极配合(( Z/2p ))决定电机电磁结构,相同…...

为您的照片提供本地 AI 视觉:使用 Llama Vision 和 ChromaDB 构建 AI 图像标记器

有没有花 20 分钟浏览您的文件夹以找到心中的特定图像或屏幕截图?您并不孤单。 作为工作中的产品经理,我总是淹没在竞争对手产品的屏幕截图、UI 灵感以及白板会议或草图的照片的海洋中。在我的个人生活中,我总是捕捉我在生活中遇到的事物&am…...

OpenAI 34页最佳构建Agent实践

penAI发布O4,也发布34页最佳构建Agent实践,值得阅读。 什么是Agent? 传统软件使用户能够简化和自动化工作流程,而代理能够以高度独立的方式代表用户执行相同的工作流程。 代理是能够独立地代表您完成任务的系统。 工作流程是必…...

第 5 期(进阶版):训练第一个 DDPM 模型(使用 CIFAR-10 数据集)

—— 用 DDPM 模型生成彩色图像,感受扩散魔法在 CIFAR-10 上的威力! 本期目标 将 MNIST 替换为 CIFAR-10; 模型结构适配 RGB 三通道输入; 保持原始扩散与采样流程; 增加图像可视化对比! 数据准备&…...

进程间通信(IPC)----共享内存

进程间通信(IPC)的共享内存机制允许不同进程直接访问同一块物理内存区域,是速度最快的IPC方式(无需数据拷贝)。 一、共享内存核心概念 1. 基本原理 共享内存区域:由内核管理的特殊内存段,可被…...

Xcode16 调整 Provisioning Profiles 目录导致证书查不到

cronet demo 使用的 ninja 打包,查找 Provisioning Profiles 路径是 ~/Library/MobileDevice/Provisioning Profiles,但 Xcode16 把该路径改为了 ~/Library/Developer/Xcode/UserData/Provisioning Profiles,导致在编译 cronet 的demo 时找不…...

Debian服务器环境下env变量丢失怎么办

在 Debian服务器环境下,如果出现了 env 环境变量丢失的问题,比如常见的 PATH、JAVA_HOME、PYTHONPATH 等系统变量或自定义变量不起作用,可能会导致一些命令无法执行、服务无法启动、脚本报错等。 这个问题常见于: 使用 cron、sy…...

搜广推校招面经七十八

字节推荐算法 一、实习项目:多任务模型中的每个任务都是做什么?怎么确定每个loss的权重 这个根据实际情况来吧。如果实习时候用了moe,就可能被问到。 loss权重的话,直接根据任务的重要性吧。。。 二、特征重要性怎么判断的&…...

ctf.show—Web(1-10)详细通关教程

Web1-签到题 1、按F12查看元素,发现有一段被注释的字符串 2、看起来并不像flag,格式类似于Base64编码 扔到Base64在线编码平台:Base64 编码/解码 - 锤子在线工具此工具是一个 Base64 编码或解码在线工具,实现把字符串转成 Base6…...

双层Key缓存

双层 Key 缓存是一种针对 缓存击穿 和 雪崩问题 的优化方案,其核心思想是通过 主备双缓存 的机制,确保在热点数据过期时仍能提供可用服务,同时降低对数据库的瞬时压力。以下是其核心原理、实现细节及适用场景的深度解析: 一、核心…...

android编译使用共享缓存

注意 服务器端与客户端系统的版本号需为Ubuntu20.04ccache版本不能低于4.4执行用户需要为sudo权限服务器端nfs目录权限必须为nobody:nogroup 一、服务端配置: 在服务器192.168.60.142上配置 NFS 共享 1.安装 NFS 服务器: 1 sudo apt-get install nfs…...

如何使用Labelimg查看已经标注好的YOLO数据集标注情况

文章目录 1、 安装并运行Labelimg1.1、安装Labelimg1.2、运行Labelimg 2、查看数据集标注情况2.1、创建类别名称文件classes.txt2.2、使用Labelimg打开查看标注文件2.3、正式标注 3、目标检测系列文章 本文主要介绍一下如何使用LabelImg查看已经标注好的YOLO数据集标注情况&…...

Web3架构下的数据隐私与保护

在这个信息爆炸的时代,Web3的概念如同一股清流,以其去中心化的特性,为数据隐私与保护带来了新的希望。Web3,也被称作下一代互联网,它通过区块链技术实现数据的去中心化存储和处理,旨在提高数据的安全性和隐…...

PCM 参数深度解析:采样率、帧、缓存大小与多通道关系

将下面的 PCM 配置作为例子: config.channels 2; // 立体声(2 个通道) config.rate 48000; // 采样率 48000 Hz,即每秒 48000 帧 config.period_size 1024; // 每个周…...

Kafka消费者端重平衡流程

重平衡的完整流程需要消费者 端和协调者组件共同参与才能完成。我们先从消费者的视角来审视一下重平衡的流程。在消费者端,重平衡分为两个步骤:分别是加入组和等待领导者消费者(Leader Consumer)分配方案。这两个步骤分别对应两类…...

【字节跳动AI论文】海姆达尔:生成验证的测试时间扩展

摘要:人工智能系统只能在能够验证知识本身的范围内创建和维护知识。 最近关于长链推理的研究表明,LLM在解决竞争问题方面具有巨大的潜力,但它们的验证能力仍然很弱,而且没有得到充分的研究。 在本文中,我们提出了Heimd…...

【Datawhale Al春训营】气象预测(AI+航空安全)竞赛笔记

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…...

大模型应用开发实战:AI Agent与智能体开发技术解析

更多AI大模型应用开发学习内容,尽在聚客AI学院 一、AI Agent的核心概念 AI Agent(智能体)是基于大模型构建的自主任务执行系统,能够根据用户指令拆解目标、调用工具、完成复杂任务(如数据分析、自动化办公&#xff09…...

《Learning Langchain》阅读笔记3-基于 Gemini 的 Langchain如何从LLMs中获取特定格式

纯文本输出是有用的,但在某些情况下,我们需要 LLM 生成结构化输出,即以机器可读格式(如 JSON、XML 或 CSV)或甚至以编程语言(如 Python 或 JavaScript)生成的输出。当我们打算将该输出传递给其他…...

Mac mini 安装mysql数据库以及出现的一些问题的解决方案

首先先去官网安装一下mysql数据库,基本上都是傻瓜式安装的流程,我也就不详细说了。 接下来就是最新版的mysql安装的时候,他就会直接让你设置一个新的密码。 打开设置,拉到最下面就会看到一个mysql的图标: 我设置的就是…...

智能体时代的产业范式确立,中国企业以探索者姿态走出自己的路

作者 | 曾响铃 文 | 响铃说 当前,一个新的20年的产业升级期已经开启,系统性的发展路径也正在形成。 前不久,以“共建智能体时代“为主题的超聚变探索者大会2025在河南郑州举办。超聚变变数字技术有限公司(以下简称:…...

电路安全智控系统与主机安全防护系统主要功能是什么

电路安全智控系统被称为电路安全用电控制系统。电路安全智控系统具备一系列强大且实用的功能。电路安全智控系统能够对总电压、总电流、总功率、总电能,以及各分路的电压、电流、功率、电能和功率因素等进行全方位的监控。在大型工厂的电力分配中,通过对…...

MCP Server驱动传统SaaS智能化转型:从工具堆叠到AI Agent生态重构,基于2025年技术演进与产业实践

MCP Server驱动传统SaaS智能化转型:从工具堆叠到AI Agent生态重构 (基于2025年技术演进与产业实践) MCP模型上下文协议 一、技术底座革新:MCP协议重构AI时代的"数字接口" 传统SaaS软件向大模型AI应用转型的核心矛盾…...

【工具变量】地市农业播种面积及粮食产量等21个相关指标(2013-2022年)

粮食产量、粮食播种面积及农作物播种面积等,是衡量农业发展水平和粮食安全的重要指标。随着全球粮食需求的持续增长,准确掌握这些数据对制定农业政策、优化生产结构和提高农业生产效率至关重要。因此,缤本次分享数据包括《中国统计NJ》、《中…...

使用 PySpark 批量清理 Hive 表历史分区

使用 PySpark 批量清理 Hive 表历史分区 在大数据平台中,Hive 表通常采用分区方式存储数据,以提升查询效率和数据管理的灵活性。随着数据的不断积累,历史分区会越来越多,既占用存储空间,也影响元数据管理性能。因此&a…...

A. k-th equality(1700)

Problem - 1835A - Codeforces Daily_CF_Problems/daily_problems/2025/04/0417/solution/cf1835a.md at main Yawn-Sean/Daily_CF_Problems 考虑所有形式为 abc 的等式,其中 a有 A 位数, b 有 B 位数, c 有 C 位数。所有数字都是正整数,求…...

深度学习-torch,全连接神经网路

3. 数据集加载案例 通过一些数据集的加载案例,真正了解数据类及数据加载器。 3.1 加载csv数据集 代码参考如下 import torch from torch.utils.data import Dataset, DataLoader import pandas as pd ​ ​ class MyCsvDataset(Dataset):def __init__(self, fil…...

echarts饼图中心呈现一张图片,并且能动态旋转的效果react组件

实现效果&#xff1a; 父组件&#xff1a; import React from react import styles from ./style.less import GaugeChart from ./GaugeChart;export default function index() {return (<div><div className{styles.bg} ></div><div style{{ width: 500…...

使用Docker搭建开源Email服务器

使用Docker搭建开源Email服务器 1 介绍 开源的Email服务器比较多&#xff0c;例如&#xff1a;poste.io、MailCatcher、Postal、mailcow等。由于poste.io支持docker安装&#xff0c;页面比较美观&#xff0c;使用简单&#xff0c;支持SMTP IMAP POP3等协议&#xff0c;安全…...

css图片设为灰色

使用filter方式将图片设置为灰色 普通图片使用&#xff1a;filter: saturate(0); 纯白图片使用&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"width…...

2025 年第十五届 MathorCup竞赛赛题浅析-助攻快速选题

本届妈杯竞赛各赛题难度均已经达到了国赛难度&#xff0c;也更好的回应了大家更为关心的&#xff0c;在当前AI环境下&#xff0c;似乎“数学建模变成了AI使用竞赛一样”。但是国委会一直以来都是一个态度&#xff1a;AI现在是无法直接解决任何一个国赛赛题的。对应的如今这句话…...

【android bluetooth 案例分析 03】【PTS 测试 1】【pts基本介绍】

Bluetooth SIG&#xff08;Special Interest Group&#xff09;提供的 PTS&#xff08;Profile Tuning Suite&#xff09;测试 是蓝牙认证过程中一项极为关键的步骤。它主要用于验证设备是否符合 Bluetooth SIG 制定的各项 蓝牙规范&#xff08;Bluetooth Specification&#x…...

Java集合框架深度解析:HashMap、HashSet、TreeMap、TreeSet与哈希表原理详解

一、核心数据结构总览 1. 核心类继承体系 graph TDMap接口 --> HashMapMap接口 --> TreeMapSet接口 --> HashSetSet接口 --> TreeSetHashMap --> LinkedHashMapHashSet --> LinkedHashSetTreeMap --> NavigableMapTreeSet --> NavigableSet 2. 核心…...

【深度学习】张量计算:爱因斯坦求和约定|tensor系列03

博主简介&#xff1a;努力学习的22级计算机科学与技术本科生一枚&#x1f338;博主主页&#xff1a; Yaoyao2024往期回顾&#xff1a;【深度学习】详解矩阵乘法、点积&#xff0c;内积&#xff0c;外积、哈达玛积极其应用|tensor系列02每日一言&#x1f33c;: “岱宗夫如何&…...

OpenHarmony-Risc-V上运行openBLAS中的benchmark

OpenHarmony-Risc-V上运行openBLAS中的benchmark 文章目录 OpenHarmony-Risc-V上运行openBLAS中的benchmark前言一、编译openBLAS1.源码下载2.工具链下载3.编译并安装openBLAS 二、编译open BLAS中的benchmark三、上设备运行总结 前言 参考https://zhuanlan.zhihu.com/p/18825…...

CCF CSP 第36次(2024.12)(2_梦境巡查_C++)

CCF CSP 第36次&#xff08;2024.12&#xff09;&#xff08;2_梦境巡查_C&#xff09; 解题思路&#xff1a;思路一&#xff1a; 代码实现代码实现&#xff08;思路一&#xff09;&#xff1a; 时间限制&#xff1a; 1.0 秒 空间限制&#xff1a; 512 MiB 原题链接 解题思路…...

windows下安装mcp servers

以sequential-thinking为例 macos下安装就像github readme中那样安装即可&#xff1a; {"mcpServers": {"sequential-thinking": {"command": "npx","args": ["-y","modelcontextprotocol/server-sequenti…...

OpenGauss 数据库介绍

OpenGauss 数据库介绍 OpenGauss 是华为基于 PostgreSQL 开发的企业级开源关系型数据库&#xff0c;现已成为开放原子开源基金会的项目。以下是 OpenGauss 的详细介绍&#xff1a; 一 核心特性 1.1 架构设计亮点 特性说明优势多核并行NUMA感知架构充分利用现代CPU多核性能行…...

Web3区块链网络中数据隐私安全性探讨

在这个信息爆炸的时代&#xff0c;Web3 的概念如同一股清流&#xff0c;以其去中心化、透明性和安全性的特点&#xff0c;为数据隐私保护提供了新的解决方案。本文将探讨 Web3 区块链网络中数据隐私的安全性问题&#xff0c;并探索如何通过技术手段提高数据隐私的保护。 Web3 …...

linux驱动之poll

驱动中 poll 实现 在用户空间实现事件操作的一个主要实现是调用 select/poll/epoll 函数。那么在驱动中怎么来实现 poll 的底层呢&#xff1f; 其实在内核的 struct file_operations 结构体中有一个 poll 成员&#xff0c;其就是底层实现的接口函数。 驱动中 poll 函数实现原…...

【最后203篇系列】028 FastAPI的后台任务处理

说明 今天偶然在别的文章里看到这个功能&#xff0c;突然觉得正好。 CeleryWorker已经搭好了&#xff0c;但是我一直想在用户请求时进行额外的处理会比较影响处理时间&#xff0c;用这个正好可以搭配上。 我设想的一个场景&#xff1a; 1 用户发起请求2 接口中进行关键信息…...