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.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. 形态学操作介绍 初识: 形态学操作是一种基于图像形状的处理方法,主要用于分析和处理图像中的几何结构。其核心是通过结构元素(卷积核)对图像进行扫描和操作,从而改变图像的形状和特征。例如: 腐蚀&…...
【Ubuntu】GPU显存被占用,但显示没有使用GPU的进程
文章目录 一、问题描述二、解决方案2.1 寻找问题进程2.2 尝试杀死相关进程2.3 投放核弹,一键全杀2.4 再次查看GPU使用情况 参考资料 一、问题描述 今天使用服务器的时候发现gpu被占了很多内存,但是使用 nvidia-smi 命令并没有发现占这么多显存的进程&am…...
什么是pytest.ini及如何在Pytest中应用以提升配置效率
关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理,构建成功的基石 在自动化测试工作之前,你应该知道的10条建议 在自动化测试中,重要的不是工具 当通过控制台运行Pytest测试时你必须记住记录输出、运行时环境变量、设置超时时间、…...
通义灵码AI程序员
通义灵码是阿里云与通义实验室联合打造的智能编码辅助工具,基于通义大模型技术,为开发者提供多种编程辅助功能。它支持多种编程语言,包括 Java、Python、Go、TypeScript、JavaScript、C/C、PHP、C#、Ruby 等 200 多种编码语言。 通义灵码 AI…...
以ChatGPT为例解析大模型背后的技术
目录 1、大模型分类 2、为什么自然语言处理可计算? 2.1、One-hot分类编码(传统词表示方法) 2.2、词向量 3、Transformer架构 3.1、何为注意力机制? 3.2、注意力机制在 Transformer 模型中有何意义? 3.3、位置编…...
Git中revert和reset区别?
git revert 和 git reset 都用于撤销 Git 中的提交,但它们的作用和使用场景不同: git revert: 作用:创建一个新的提交,撤销指定的提交内容。使用场景:用于“回滚”已推送到远程仓库的提交。这种方法不会改变提交历史&a…...
使用docker部署NextChat,使用阿里云、硅机流动、deepseek的apikey
1、首先使用安装好了docker的服务器拉取NextChat项目 [rootxx docker]# docker pull yidadaa/chatgpt-next-web 2、启动docker容器,基于不同平台 以下的OPENAI_API_KEY参数替换成自己的就行,启动后访问地址:http://[服务器ip]:3000/ # 硅机…...
Redis-缓存过期和内存淘汰
缓存过期&&内存淘汰 过期删除如何设置过期时间判断key是否过期过期删除策略有哪些定时删除惰性删除定期删除Redis过期删除策略 内存淘汰策略如何设置Redis最大运行内存Redis内存淘汰策略有哪些不进行数据淘汰进行数据淘汰的策略设置了过期时间的数据中进行淘汰所有数据…...
测试 FreeSWITCH 的 sip_invite_route_uri
bgapi originate sofia/external/123461.132.230.73:5161 &echo 得到的是: 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 …...
七星棋牌全开源修复版源码解析:6端兼容,200种玩法全面支持
本篇文章将详细讲解 七星棋牌修复版源码 的 技术架构、功能实现、二次开发思路、搭建教程 等内容,助您快速掌握该棋牌系统的开发技巧。 1. 七星棋牌源码概述 七星棋牌修复版源码是一款高度自由的 开源棋牌项目,该版本修复了原版中的多个 系统漏洞&#…...
第六届计算机信息和大数据应用国际学术会议(CIBDA 2025)
重要信息 大会官网:www.ic-cibda.org(了解会议,投稿等) 大会时间:2025年3月14-16日 大会地点:中国-武汉 简介 第六届计算机信息和大数据应用(CIBDA 2025)将于2025年3月14-16日在中国…...
在 Vue 3 中使用 Lottie 动画:实现一个加载动画
在现代前端开发中,动画是提升用户体验的重要元素之一。Lottie 是一个流行的动画库,它允许我们使用 JSON 文件来渲染高质量的动画。本文将介绍如何在 Vue 3 项目中集成 Lottie 动画,并实现一个加载动画效果。 如果对你有帮助请帮忙点个&#x…...
PyTorch 深度学习框架中 torch.cuda.empty_cache() 的妙用与注意事项
🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 在使用 PyTorch 进行深度学习模型训练与调优过程中,torch.cuda.empty_cache() 方法作为一种高效工具被广泛采用;但其正确应用要求充分理解该方法的功能及最佳实践。下文将对该方…...
快速入门——Vue框架快速上手
学习自哔哩哔哩上的“刘老师教编程”,具体学习的网站为:8.Vue框架快速上手_哔哩哔哩_bilibili,以下是看课后做的笔记,仅供参考。 第一节:前端环境准备 编码工具VSCode【www.code.visualstudio.com】/WebStorm也可&am…...
【Leetcode 每日一题】2595. 奇偶位数
问题背景 给你一个 正 整数 n n n。 用 e v e n even even 表示在 n n n 的二进制形式(下标从 0 0 0 开始)中值为 1 1 1 的偶数下标的个数。 用 o d d odd odd 表示在 n n n 的二进制形式(下标从 0 0 0 开始)中值为 1 1…...
zookeeper集群配置
配置 一、配置myid文件 # 进入解压好的文件夹下面 touch myid vim myid # master节点写0,slave1节点写1,slave2节点写2二、配置zoo.cfg文件 1.在master节点编辑zookeeper配置文件 # 进入解压好的文件夹下面 cd conf/ cp zoo_sample.cfg zoo.cfg vim …...
掌握.NET Core后端发布流程,如何部署后端应用?
无论你是刚接触.NET Core的新手还是已有经验的开发者,在这篇文章中你将会学习到一系列实用的发布技巧与最佳实践,帮助你高效顺利地将.NET Core后端应用部署到生产环境中 目录 程序发布操作 Docker容器注册表 文件夹发布 导入配置文件 网站运行操作 …...
华为昇腾920b服务器部署DeepSeek翻车现场
最近到祸一台HUAWEI Kunpeng 920 5250,先看看配置。之前是部署的讯飞大模型,发现资源利用率太低了。把5台减少到3台,就出了他 硬件配置信息 基本硬件信息 按照惯例先来看看配置。一共3块盘,500G的系统盘, 2块3T固态…...
java基础语知识(8)
类之间的关系 在类之间,最常见的关系有: 依赖(“uses-a”);聚合(“has-a”);继承(“is-a”)。 依赖:一种使用关系,即一个类的实现需要另一个类的协助&#x…...
使用Python添加、读取和删除Word文档属性
在Python中处理Word文档时,对文档属性进行操作是一项重要的任务。文档属性主要分为内置属性(如标题、作者等)和自定义属性(用户根据自身需求定义的属性)。合理地管理这些属性,能够提升文档管理效率、优化信…...
设计模式教程:外观模式(Facade Pattern)
1. 外观模式的定义 外观模式属于结构型设计模式,它定义了一个高层接口,使得子系统的接口变得更加简单。外观模式通过将子系统复杂的逻辑隐藏在一个外部的接口(外观类)中,简化了客户端与子系统之间的交互。 外观模式的…...
Day15-后端Web实战-登录认证——会话技术JWT令牌过滤器拦截器
目录 登录认证1. 登录功能1.1 需求1.2 接口文档1.3 思路分析1.4 功能开发1.5 测试 2. 登录校验2.1 问题分析2.2 会话技术2.2.1 会话技术介绍2.2.2 会话跟踪方案2.2.2.1 方案一 - Cookie2.2.2.2 方案二 - Session2.2.2.3 方案三 - 令牌技术 2.3 JWT令牌2.3.1 介绍2.3.2 生成和校…...
VSCode运行Go程序报错:Unable to process `evaluate`: debuggee is running
如果使用默认的VSCode的服务器来运行Go程序,那么使用fmt.Scan函数输入数据的时候就会报错,我们需要修改launch.json文件,将Go程序运行在shell终端上。 main.go package mainimport "fmt"func main() {var n intfmt.Scan(&n)v…...
Android 中使用 FFmpeg 进行音视频处理
1. FFmpeg 基础知识 1.1 什么是 FFmpeg? FFmpeg 是一个开源的多媒体处理工具,支持音视频的编码、解码、转码、裁剪、合并、滤镜、流媒体等功能。它是一个命令行工具,支持多种音视频格式和编解码器。1.2 为什么在 Android 中使用 FFmpeg? Android 自带的多媒体 API(如 Med…...
IntersectionObserver用法
IntersectionObserver用法 1.什么是IntersectionObserver?2.使用2.1 创建观察对象2.2 观察指定DOM对象2.3 参数详解(1)callback参数(2)options 配置参数 3.应用3.1 Dom进入页面的加载动画3.2 图片的懒加载 1.什么是IntersectionObserver? IntersectionO…...
R语言NIMBLE、Stan和INLA贝叶斯平滑及条件空间模型死亡率数据分析:提升疾病风险估计准确性...
全文链接:https://tecdat.cn/?p40365 在环境流行病学研究中,理解空间数据的特性以及如何通过合适的模型分析疾病的空间分布是至关重要的。本文主要介绍了不同类型的空间数据、空间格点过程的理论,并引入了疾病映射以及对空间风险进行平滑处理…...
nginx ngx_stream_module(3) 指令详解
nginx ngx_stream_module(3) 指令详解 相关链接 nginx 嵌入式变量解析目录nginx 嵌入式变量全目录nginx 指令模块目录nginx 指令全目录 一、目录 1.1 模块简介 ngx_stream_upstream_module:上游服务器模块,允许定义一组后端服务器,并控制如…...
DeepSeek - R1:模型架构深度解析
DeepSeek - R1:模型架构深度解析 引言 本文将深入探索DeepSeek - R1模型架构。将从输入到输出追踪DeepSeek - R1模型,找出架构中的新发展和关键部分。DeepSeek - R1基于DeepSeek - V3 - Base模型架构,本文旨在涵盖其设计的所有重要方面。 …...
Oracle EBS 12.1和APEX 集成时 Apache的配置代理
在有些场景下,apex的前端服务不是和oracle EBS 应用部署在同一个服务器上或者要求apex和访问地址和EBS公用同一个域名同一个端口,那么怎么才能做到用EBS 的域名和端口来实现对apex的访问呢 通过配置代理规则解决,以Oracle EBS 12.1.3 为例&am…...
【C#】无法安装程序包“DotSpatial.Symbology 4.0.656”
C#代码:NaturalNeighbor nn new NaturalNeighbor(); 错误:无法安装程序包“DotSpatial.Symbology 4.0.656”。你正在尝试将此程序包安装到目标为“.NETFramework,Versionv4.7.2”的项目中,但该程序包不包含任何与该框架兼容的程序集引用或…...
