详解 OpenCV 形态学操作:从基础到实战(腐蚀、膨胀、开运算、闭运算、梯度、顶帽与黑帽)

在数字图像处理领域,形态学操作是一套基于图像形状的非线性处理方法,核心是通过结构元素(Kernel) 与图像进行交互,实现对图像轮廓、细节的调整与提取。OpenCV 作为主流的计算机视觉库,提供了丰富的形态学操作 API,本文将从原理到代码实战,详细讲解 7 种核心形态学操作(腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽、黑帽),帮助你快速掌握并应用于实际项目。

一、形态学操作基础:结构元素(Kernel)

在开始所有操作前,必须先理解结构元素(Kernel) 的概念 —— 它是形态学操作的 “工具”,本质是一个指定大小的矩阵(通常为奇数,如 3×3、5×5),矩阵元素值通常为 1(表示参与运算的区域)。

结构元素的大小和形状直接影响操作效果:

  • 大小:3×3 适用于精细处理,5×5 及以上适用于更显著的形态改变;
  • 形状:除了代码中常用的 “矩形(np.ones ())”,还有圆形、十字形等(可通过cv2.getStructuringElement()生成,例如cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5))生成 5×5 圆形结构元素)。

代码中生成 3×3 矩形结构元素的方式:

import numpy as np
kernel = np.ones((3, 3), np.uint8)  # 数据类型必须为uint8(无符号8位整数,符合图像像素0-255的范围)

二、核心形态学操作实战

以下所有操作均基于 OpenCV-Python 实现,需提前安装依赖(pip install opencv-python numpy)。每个操作将从 “原理”“作用”“代码”“效果分析” 四部分展开,确保你知其然也知其所以然。

1. 图像腐蚀(Erosion):“收缩” 前景目标

原理

腐蚀是最基础的形态学操作之一,核心逻辑是 **“结构元素滑动遍历图像,仅当结构元素完全覆盖前景区域(通常为白色像素)时,中心像素才保留为前景,否则变为背景(通常为黑色像素)”**。可以形象理解为 “用结构元素‘啃食’前景的边缘,让前景区域逐渐缩小”。

作用
  • 消除图像中的细小噪声(噪声多为孤立的小前景像素,会被结构元素直接 “啃掉”);
  • 缩小前景目标尺寸,断开相邻目标间的细小连接;
  • 突出前景目标中的孔洞(孔洞周围的前景被腐蚀后,孔洞会更明显)。
OpenCV API 参数
cv2.erode(src, kernel, dst=None, anchor=None, iterations=1, borderType=None, borderValue=None)

关键参数解析:

  • src:输入图像(推荐灰度图或二值图,彩色图会对 RGB 三个通道分别处理,可能导致颜色偏差);
  • kernel:结构元素(决定腐蚀的 “工具大小”);
  • iterations:腐蚀迭代次数(默认 1,次数越多,腐蚀越彻底,前景缩小越明显);
  • anchor:结构元素的锚点(默认是中心,一般无需修改)。
实战代码
import cv2
import numpy as np# 1. 读取图像(以love.jpg为例,建议使用前景清晰的图像)
sun = cv2.imread('love.jpg')
if sun is None:  # 避免图像路径错误导致程序崩溃print("图像读取失败,请检查文件路径是否正确!")
else:# 2. 显示原始图像cv2.imshow('Original Image', sun)cv2.waitKey(0)  # 等待按键,按任意键继续(0表示无限等待)# 3. 定义结构元素(5×5矩形,比3×3腐蚀效果更显著)kernel = np.ones((5, 5), np.uint8)# 4. 执行腐蚀操作(迭代5次,强化腐蚀效果)erosion_result = cv2.erode(sun, kernel, iterations=5)# 5. 显示腐蚀结果cv2.imshow('Erosion (5x5 Kernel, 5 Iterations)', erosion_result)cv2.waitKey(0)# 6. 释放窗口资源(避免内存泄漏)cv2.destroyAllWindows()
效果分析
  • 原始图像中的细线条(如文字边缘、图案纹理)会变细甚至断裂—— 因为边缘像素被结构元素 “啃食”;
  • 若将iterations从 1 改为 5,前景目标会持续缩小,小的细节(如爱心图案的尖角)可能完全消失;
  • 若将kernel从 5×5 改为 3×3,腐蚀效果会减弱,前景缩小幅度更平缓。

2. 图像膨胀(Dilation):“扩大” 前景目标

原理

膨胀与腐蚀是 “相反操作”,核心逻辑是 **“结构元素滑动遍历图像,只要结构元素与前景区域有任意一点重叠,中心像素就保留为前景”**。可以理解为 “用结构元素‘扩张’前景的边缘,让前景区域逐渐扩大”。

作用
  • 填补前景目标中的细小孔洞(孔洞边缘的前景被扩张后,会逐渐覆盖孔洞);
  • 连接相邻的细小前景区域(原本断开的前景,扩张后会拼接在一起);
  • 增强前景目标的轮廓(但会导致边缘模糊,因为扩张会 “拉宽” 边缘)。
OpenCV API 参数
cv2.dilate(src, kernel, dst=None, anchor=None, iterations=1, borderType=None, borderValue=None)

参数与cv2.erode()完全一致,核心差异是操作逻辑相反(一个收缩,一个扩张)。

实战代码
import cv2
import numpy as np# 1. 读取图像(以文字图像wenzi.png为例,文字易受膨胀影响)
wenzi = cv2.imread('wenzi.png')
if wenzi is None:print("图像读取失败,请检查文件路径!")
else:# 2. 显示原始图像cv2.imshow('Original Text Image', wenzi)cv2.waitKey(0)# 3. 定义结构元素(3×3矩形,适合精细膨胀)kernel = np.ones((3, 3), np.uint8)# 4. 执行膨胀操作(迭代2次,避免文字过度粘连)dilate_result = cv2.dilate(wenzi, kernel, iterations=2)# 5. 显示膨胀结果cv2.imshow('Dilation (3x3 Kernel, 2 Iterations)', dilate_result)cv2.waitKey(0)# 6. 释放窗口cv2.destroyAllWindows()
效果分析
  • 文字图像经过膨胀后,文字会变粗—— 文字边缘的像素被结构元素 “扩张”;
  • iterations改为 10,文字会严重粘连,单个字符无法区分(如 “你好” 可能变成一个黑色块);
  • 若输入图像是二值图(黑底白字),膨胀后文字的 “锯齿边缘” 会更明显,因为扩张会放大边缘的不规则性。

3. 开运算(Opening):先腐蚀后膨胀,消除 “小亮点”

原理

开运算 = 腐蚀操作 + 膨胀操作(先对原始图像做腐蚀,再对腐蚀结果做膨胀)。
核心逻辑:先用腐蚀 “去掉” 小的前景噪声(小亮点),再用膨胀 “恢复” 前景目标的原始大小(因为腐蚀缩小的前景,膨胀可以补回来,但被腐蚀掉的噪声无法恢复)。

作用
  • 平滑前景目标的轮廓(消除细小的突出物,如 “毛刺”);
  • 断开前景目标间的细小连接(如两个相邻的圆形,中间有细线条连接,开运算会断开线条);
  • 消除图像中的 “小亮点” 噪声(前景噪声),且不改变大前景目标的形状和大小。
OpenCV API 参数

OpenCV 提供统一的形态学运算函数cv2.morphologyEx(),通过op参数指定操作类型:

cv2.morphologyEx(src, op, kernel, dst=None, anchor=None, iterations=1, borderType=None, borderValue=None)
  • op=cv2.MORPH_OPEN:指定为开运算;
  • 其他参数与cv2.erode()一致,iterations表示 “腐蚀 + 膨胀” 的总次数(默认 1,即 1 次腐蚀 + 1 次膨胀)。
实战代码
import cv2
import numpy as np# 1. 读取图像(以指纹图像zhiwen.png为例,指纹易有细小噪声)
zhiwen = cv2.imread('zhiwen.png')
if zhiwen is None:print("图像读取失败,请检查文件路径!")
else:# 2. 显示原始图像(可见指纹上有细小亮点噪声)cv2.imshow('Original Fingerprint', zhiwen)cv2.waitKey(0)# 3. 定义结构元素(3×3矩形,适合精细去噪)kernel = np.ones((3, 3), np.uint8)# 4. 执行开运算(1次腐蚀+1次膨胀)opening_result = cv2.morphologyEx(zhiwen, cv2.MORPH_OPEN, kernel)# 5. 显示开运算结果cv2.imshow('Opening (3x3 Kernel)', opening_result)cv2.waitKey(0)# 6. 释放窗口cv2.destroyAllWindows()

效果分析
  • 原始指纹图像中的 “小亮点” 噪声会完全消失—— 因为腐蚀先去掉了噪声,膨胀只恢复了指纹的主体纹理;
  • 开运算后,指纹的整体形状和大小基本不变—— 膨胀补偿了腐蚀造成的前景缩小;
  • 若结构元素改为 5×5,开运算会消除更大的亮点,但可能导致指纹的细纹理(如小分支)被误删。

4. 闭运算(Closing):先膨胀后腐蚀,填补 “小黑洞”

原理

闭运算 = 膨胀操作 + 腐蚀操作(先对原始图像做膨胀,再对膨胀结果做腐蚀)。
核心逻辑:先用膨胀 “填补” 前景中的小孔洞(小黑洞),再用腐蚀 “恢复” 前景目标的原始大小(膨胀扩大的前景,腐蚀可以缩回来,但被填补的孔洞无法恢复)。

作用
  • 弥合前景目标中的细小孔洞(如圆形前景中的小黑点,闭运算会填补黑点);
  • 连接前景目标间的细小间断(如指纹中的断裂线条,闭运算会连接线条);
  • 消除图像中的 “小黑洞” 噪声(背景噪声),且不改变大前景目标的形状。
实战代码
import cv2
import numpy as np# 1. 读取图像(以有间断的指纹图像zhiwen_duan.png为例)
zhiwen = cv2.imread('zhiwen_duan.png')
if zhiwen is None:print("图像读取失败,请检查文件路径!")
else:# 2. 显示原始图像(可见指纹有细小间断和孔洞)cv2.imshow('Original Broken Fingerprint', zhiwen)cv2.waitKey(0)# 3. 定义结构元素(6×6矩形,比3×3更适合填补较大孔洞)kernel = np.ones((6, 6), np.uint8)# 4. 执行闭运算(1次膨胀+1次腐蚀)closing_result = cv2.morphologyEx(zhiwen, cv2.MORPH_CLOSE, kernel)# 5. 显示闭运算结果cv2.imshow('Closing (6x6 Kernel)', closing_result)cv2.waitKey(0)# 6. 释放窗口cv2.destroyAllWindows()
效果分析
  • 指纹中的细小间断和孔洞会被填补—— 膨胀先扩大前景,覆盖孔洞和间断,腐蚀再缩回到原始大小;
  • 为什么用 6×6 的结构元素?因为结构元素越大,能填补的孔洞 / 连接的间断越宽,3×3 结构元素可能无法覆盖较大的孔洞;
  • iterations改为 2,闭运算会重复 2 次膨胀 + 2 次腐蚀,填补效果更强,但可能导致前景目标边缘过度平滑。

5. 梯度运算(Morphological Gradient):提取前景边缘

原理

梯度运算 = 膨胀结果 - 腐蚀结果
核心逻辑:膨胀会扩大前景,腐蚀会缩小前景,两者的像素值差值,恰好对应前景目标的 “边缘区域”—— 因为边缘是 “膨胀新增的像素” 与 “腐蚀丢失的像素” 的交集,主体区域则会被抵消(膨胀和腐蚀的主体区域像素值相同,差值为 0)。

作用
  • 突出显示图像中强度变化剧烈的区域(即边缘);
  • 用于目标轮廓提取(如文字边缘、物体轮廓),是后续图像分割、特征识别的基础;
  • 相比 Canny 边缘检测,梯度运算更简单,且能保留更完整的轮廓(但抗噪声能力较弱)。
实战代码
import cv2
import numpy as np# 1. 读取图像(以文字图像wenzi.png为例,文字边缘清晰)
wenzi = cv2.imread('wenzi.png')
if wenzi is None:print("图像读取失败,请检查文件路径!")
else:# 2. 显示原始图像cv2.imshow('Original Text Image', wenzi)cv2.waitKey(0)# 3. 定义结构元素(2×2矩形,边缘提取更精细)kernel = np.ones((2, 2), np.uint8)# 4. 分别执行膨胀和腐蚀(验证梯度的来源)dilate_wenzi = cv2.dilate(wenzi, kernel, iterations=1)erode_wenzi = cv2.erode(wenzi, kernel, iterations=1)cv2.imshow('Dilation Result', dilate_wenzi)  # 文字扩大cv2.waitKey(0)cv2.imshow('Erosion Result', erode_wenzi)    # 文字缩小cv2.waitKey(0)# 5. 执行梯度运算(直接用morphologyEx,无需手动计算差值)gradient_result = cv2.morphologyEx(wenzi, cv2.MORPH_GRADIENT, kernel)# 6. 显示梯度结果(文字边缘被突出,主体为黑色)cv2.imshow('Morphological Gradient (Edge)', gradient_result)cv2.waitKey(0)# 7. 释放窗口cv2.destroyAllWindows()

效果分析
  • 梯度结果中,文字的主体部分消失(变为黑色),只保留了文字的边缘(变为白色)—— 因为主体区域的膨胀和腐蚀像素值相同,差值为 0;
  • 结构元素越大,边缘越—— 因为膨胀和腐蚀的差异更大,边缘区域的像素更多;
  • 若输入图像是彩色图,梯度结果会显示彩色边缘(因为 RGB 三个通道分别计算梯度后合并)。

6. 顶帽(Top Hat):提取 “比周围亮的小区域”

原理

顶帽 = 原始图像 - 开运算结果
核心逻辑:开运算会消除 “小亮点”(前景噪声),并平滑前景轮廓。原始图像减去开运算结果后,剩下的部分就是 “被开运算去掉的内容”—— 即 “比周围背景亮的小区域”(如暗背景中的亮噪声、前景的细小突出物)。

作用
  • 提取图像中的亮噪声(如黑底白字图像中的小白点、夜景中的灯光亮点);
  • 增强暗背景下的亮细节(如医学图像中暗组织里的亮细胞);
  • 校正光照不均匀的图像(若图像局部偏暗,顶帽可突出该区域的亮细节)。
实战代码
import cv2
import numpy as np# 1. 读取图像(以sun.png为例,假设图像有暗背景和亮噪声)
sun = cv2.imread('sun.png')
if sun is None:print("图像读取失败,请检查文件路径!")
else:# 2. 显示原始图像cv2.imshow('Original Image', sun)cv2.waitKey(0)# 3. 定义结构元素(2×2矩形,适合提取细小亮噪声)kernel = np.ones((2, 2), np.uint8)# 4. 先执行开运算(验证顶帽的来源)open_sun = cv2.morphologyEx(sun, cv2.MORPH_OPEN, kernel)cv2.imshow('Opening Result', open_sun)  # 亮噪声已被消除cv2.waitKey(0)# 5. 执行顶帽运算tophat_result = cv2.morphologyEx(sun, cv2.MORPH_TOPHAT, kernel)# 6. 显示顶帽结果(亮噪声被突出,背景为黑色)cv2.imshow('Top Hat (Bright Noise)', tophat_result)cv2.waitKey(0)# 7. 释放窗口cv2.destroyAllWindows()

效果分析
  • 顶帽结果中,主要显示的是原始图像中的亮噪声—— 因为开运算消除了这些噪声,原始图像与开运算结果的差值就是噪声;
  • 若原始图像没有亮噪声,顶帽结果会接近全黑—— 原始图像与开运算结果几乎一致,差值很小;
  • 若结构元素改为 5×5,顶帽会提取更大的亮区域(如小的亮前景目标),而非细小噪声。

7. 黑帽(Black Hat):提取 “比周围暗的小区域”

原理

黑帽 = 闭运算结果 - 原始图像
核心逻辑:闭运算会填补 “小黑洞”(背景噪声),并平滑前景轮廓。闭运算结果减去原始图像后,剩下的部分就是 “被闭运算填补的内容”—— 即 “比周围背景暗的小区域”(如亮背景中的暗噪声、前景的细小孔洞)。

作用
  • 提取图像中的暗噪声(如白底黑字图像中的小黑点、白纸中的墨点);
  • 增强亮背景下的暗细节(如 X 光图像中亮骨骼里的暗裂纹);
  • 突出前景目标中的孔洞(如零件图像中的小孔、织物图像中的纱线间隙)。
实战代码
import cv2
import numpy as np# 1. 读取图像(以sun.png为例,假设图像有亮背景和暗噪声)
sun = cv2.imread('sun.png')
if sun is None:print("图像读取失败,请检查文件路径!")
else:# 2. 显示原始图像cv2.imshow('Original Image', sun)cv2.waitKey(0)# 3. 定义结构元素(2×2矩形,适合提取细小暗噪声)kernel = np.ones((2, 2), np.uint8)# 4. 先执行闭运算(验证黑帽的来源)close_sun = cv2.morphologyEx(sun, cv2.MORPH_CLOSE, kernel)cv2.imshow('Closing Result', close_sun)  # 暗噪声已被填补cv2.waitKey(0)# 5. 执行黑帽运算blackhat_result = cv2.morphologyEx(sun, cv2.MORPH_BLACKHAT, kernel)# 6. 显示黑帽结果(暗噪声被突出,背景为黑色)cv2.imshow('Black Hat (Dark Noise)', blackhat_result)cv2.waitKey(0)# 7. 释放窗口cv2.destroyAllWindows()

效果分析
  • 黑帽结果中,主要显示的是原始图像中的暗噪声—— 因为闭运算填补了这些噪声,闭运算结果与原始图像的差值就是噪声;
  • 若原始图像没有暗噪声,黑帽结果会接近全黑—— 闭运算结果与原始图像几乎一致,差值很小;
  • 顶帽与黑帽的核心区别:顶帽提取 “亮小区域”,黑帽提取 “暗小区域”,两者互为补充,常用于图像噪声的全面检测。

三、总结:7 种形态学操作对比与应用场景

为了方便大家快速选型,下表整理了 7 种操作的核心逻辑、作用及典型应用场景:

操作名称核心逻辑核心作用典型应用场景
腐蚀(Erosion)结构元素啃食前景边缘缩小前景、去亮噪声、断连接指纹去噪、文字细化
膨胀(Dilation)结构元素扩张前景边缘扩大前景、补暗孔洞、连间断文字加粗、孔洞填补
开运算(Opening)腐蚀 + 膨胀去亮噪声、平滑轮廓、断连接车牌去噪、遥感图像小亮点消除
闭运算(Closing)膨胀 + 腐蚀补暗孔洞、平滑轮廓、连间断零件图像孔洞填补、指纹断纹连接
梯度运算膨胀结果 - 腐蚀结果提取前景边缘、轮廓检测物体轮廓提取、图像分割预处理
顶帽(Top Hat)原始图像 - 开运算结果提取亮小区域、增强暗背景亮细节夜景灯光检测、医学图像亮细胞提取
黑帽(Black Hat)闭运算结果 - 原始图像提取暗小区域、增强亮背景暗细节白纸墨点检测、X 光图像裂纹识别

四、常见问题与注意事项

  1. 图像读取失败怎么办?
    检查文件路径是否正确(绝对路径如C:/images/love.jpg,相对路径需确保图像与代码在同一文件夹),同时检查图像格式是否支持(OpenCV 支持 JPG、PNG、BMP 等)。

  2. 结构元素如何选择?

    • 精细处理选 3×3/2×2,显著处理选 5×5 及以上;
    • 处理圆形目标用圆形结构元素(cv2.MORPH_ELLIPSE),处理线性目标用十字形结构元素(cv2.MORPH_CROSS)。
  3. 迭代次数越多越好吗?
    不是。迭代次数过多会导致前景目标严重变形(如腐蚀过度导致前景消失,膨胀过度导致前景粘连),建议从 1 开始逐步调整,观察效果。

  4. 彩色图与灰度图哪个更适合形态学操作?
    优先用灰度图或二值图。彩色图会对每个通道分别处理,可能导致颜色失真,且运算速度更慢;若必须用彩色图,建议先转灰度图(cv2.cvtColor(src, cv2.COLOR_BGR2GRAY))。

通过本文的讲解,相信你已经掌握了 OpenCV 形态学操作的核心原理与实战技巧。建议结合实际图像(如自己拍摄的文字、指纹、零件图)反复测试,感受结构元素、迭代次数对结果的影响,逐步积累实战经验!

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

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

相关文章

css的基本知识

一.CSS 选择器1. 属性选择器属性选择器允许根据元素的属性及属性值来选择元素:2. 伪类选择器进阶除了常见的:hover、:active,这些伪类也非常实用:3. 伪元素的妙用伪元素用于创建不在 DOM 中的虚拟元素,常用的有:二.盒模…

概率论第六讲—数理统计

文章目录考纲思维导图统计量及其分布三大分布χ2\chi^2χ2分布(卡方分布)t分布F分布参数估计参数的点估计矩估计法最大似然估计法估计量的评价标准估计量的数字特征与收敛性参数的区间估计假设检验假设检验的两类错误错题考纲 这是概率论的最后一章,也是最重要的一章…

vLLM - EngineCoreClient

EngineCoreClient是与EngineCore进行交互的基类: API定义了同步和异步两个版本。 class EngineCoreClient(ABC):abstractmethoddef shutdown(self):...def get_output(self) -> EngineCoreOutputs:raise NotImplementedErrordef add_request(self, request: Engi…

几种排序算法(2)

几种排序算法(2)1冒泡排序2.快速排序2.1hoare版本找基准值2.2lomuto前后指针3.非递归版本快速排序4.递归排序5.排序算法复杂度及稳定性分析我们已经详解了插入排序和选择排序,不了解的可以翻看我上一篇博客。1冒泡排序 void BubbleSort(int*…

Excel甘特图

1. 创建表格(Excel2021)只有天数是使用公式计算的选中表格按Ctrl T,将表格设置为超级表格2. 创建堆积条形图3. 添加设置图例项3.1 添加开始时间3.2 修改图例项顺序 3.3 编辑轴标签3.4 Y轴逆序类别 3.5 添加开始时间数据标签选择 所用橘色图&…

基于OpenCV的答题卡自动识别与评分系统

引言 在教育考试场景中,手动批改答题卡效率低下且容易出错。本文将介绍如何使用Python和OpenCV实现一个答题卡自动识别与评分系统,通过计算机视觉技术完成答题卡的透视校正、选项识别和得分计算。该系统可广泛应用于学校考试、培训测评等场景&#xff0c…

LLaMA-MoE v2:基于后训练混合专家模型的稀疏性探索与技术突破

重新定义大型语言模型的效率边界在人工智能飞速发展的今天,大型语言模型(LLMs)已成为推动技术进步的核心力量。然而,模型规模的不断扩大带来了惊人的计算成本和高昂的部署门槛,使得众多研究机构和中小型企业难以承担。…

R geo 然后读取数据的时候 make.names(vnames, unique = TRUE): invalid multibyte string 9

setwd("K:/download/geo") # 替换为实际工作目录 # 修改get_geo_data_local函数中的读取部分 #file_path <- "K:/download/geo/raw_data/GEO/GSE32967_series_matrix_fixed.txt" file_path <- "K:/download/geo/data/GSE32967_series_matrix.t…

深入理解 Spring @Async 注解:原理、实现与实践

在现代 Java 应用开发中&#xff0c;异步编程是提升系统吞吐量和响应速度的关键技术之一。Spring 框架提供的Async注解极大简化了异步方法的实现&#xff0c;让开发者无需手动管理线程即可轻松实现异步操作。本文将从底层原理到实际应用&#xff0c;全面解析Async注解的工作机制…

linux C 语言开发 (七) 文件 IO 和标准 IO

文章的目的为了记录使用C语言进行linux 开发学习的经历。开发流程和要点有些记忆模糊&#xff0c;赶紧记录&#xff0c;防止忘记。 相关链接&#xff1a; linux C 语言开发 (一) Window下用gcc编译和gdb调试 linux C 语言开发 (二) VsCode远程开发 linux linux C 语言开发 (…

maven , mvn 运行 项目

提示&#xff1a;环境搭建 文章目录前言一、使用步骤1. 以构建含有 pom.xml 的项目2.mvn 运行具体项目3.mvn 指定模块>运行具体项目前言 提示&#xff1a;版本 spirngboot 3.2 jdk 21 mvn 3.9 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、使…

JVM垃圾回收的时机是什么时候(深入理解 JVM 垃圾回收时机:什么时候会触发 GC?)

深入理解 JVM 垃圾回收时机&#xff1a;什么时候会触发 GC&#xff1f;在 Java 开发中&#xff0c;我们常听说 “JVM 会自动进行垃圾回收”&#xff0c;但很少有人能说清&#xff1a;GC 究竟在什么情况下会被触发&#xff1f;是到固定时间就执行&#xff1f;还是内存满了才会启…

在Vue项目中Axios发起请求时的小知识

在Vue项目中Axios发起请求时的小知识 在Vue项目开发中&#xff0c;Axios作为基于Promise的HTTP客户端&#xff0c;凭借其简洁的API设计和强大的功能&#xff08;如请求/响应拦截、自动JSON转换、取消请求等&#xff09;&#xff0c;已成为前端与后端通信的主流选择。本文将深入…

GeoHash分级索引技术

GeoHash分级索引技术是一种将二维地理坐标转换为一维字符串的空间索引方法,其核心是通过分级网格划分和前缀编码实现高效的空间数据检索。以下从技术原理、实现细节到工程优化展开详细解析: 一、编码原理与分级结构 1. 经纬度二进制化 GeoHash通过递归二分地球表面生成网格…

HTML HTML基础(4)

1.列表 (1).有序列表 概念&#xff1a;有顺序或侧重顺序的列表。 <h2>要把大象放冰箱总共分几步</h2> <ol> <li>把冰箱门打开</li> <li>把大象放进去</li> <li>把冰箱门关上</li> </ol> (2).无序列表 概念&a…

MySQL中的回表操作

在数据库查询&#xff08;尤其是基于 B树索引 的关系型数据库&#xff0c;如MySQL、PostgreSQL&#xff09;中&#xff0c;“回表”是一个核心且高频出现的概念&#xff0c;直接影响查询性能。要理解回表&#xff0c;需先理清索引结构与数据存储的关联&#xff0c;再拆解其发生…

QT子线程与GUI线程安全交互

在Qt应用程序开发中&#xff0c;涉及到多线程处理时&#xff0c;如何安全地从子线程更新UI界面是一个常见的问题。Qt的UI界面并不是线程安全的&#xff0c;意味着你不能直接在子线程中操作UI组件&#xff08;比如按钮、标签等&#xff09;。如果不遵循线程安全的规则&#xff0…

RL【10-2】:Actor - Critic

系列文章目录 Fundamental Tools RL【1】&#xff1a;Basic Concepts RL【2】&#xff1a;Bellman Equation RL【3】&#xff1a;Bellman Optimality Equation Algorithm RL【4】&#xff1a;Value Iteration and Policy Iteration RL【5】&#xff1a;Monte Carlo Learnin…

开源大模型天花板?DeepSeek-V3 6710亿参数MoE架构深度拆解

文章目录认知解构&#xff1a;DeepSeek的定位与核心价值模型概述与发展历程创立初期与技术奠基&#xff08;2023年7月-2024年11月&#xff09;里程碑一&#xff1a;MoE架构规模化突破&#xff08;2024年12月&#xff09;里程碑二&#xff1a;推理成本革命性优化&#xff08;202…

10 训练中的一些问题

&#x1f31f; 大背景&#xff1a;训练神经网络 下山寻宝 训练神经网络就像你蒙着眼在一座大山里&#xff0c;想找最低点&#xff08;最小损失&#xff09;。你只能靠脚下的坡度&#xff08;梯度&#xff09;来决定往哪儿走。 你的位置 模型参数&#xff08;权重 www&#xf…