11篇--图像边缘检测
图像梯度
要学习图像边缘检测,要先了解图像梯度的概念,我们正是通过梯度值来区分边缘像素点的
处于边缘附近的像素点与周围像素点的差距很大(不然不会有边缘呈现),所以给边缘附近的的梯度之变化很快,通过计算梯度值,来进行边缘检测。
通常有如下两种方式处理计算得到的新值:
- 截断处理:将小于0的值设置为0,将大于255的值设置为255。这种方法简单直接,但可能会导致图像在极端值处出现不自然的截断。
- 归一化处理:将计算得到的值线性映射到0到255的范围内。这种方法可以保留更多的细节信息,但可能需要额外的计算。
梯度处理方式
cv2.filter2D()函数
功能:用于对图像进行卷积操作。卷积是图像处理中的一个基本操作,它通过一个称为卷积核(或滤波器)的小矩阵在图像上滑动,并对每个位置进行加权求和,从而得到新的图像。
参数:
- src:输入图像,可以是灰度图像或彩色图像。
- ddepth:输出图像的所需深度。对于输入图像和输出图像具有相同深度的情况,该值通常设置为 -1。否则,你可以选择一个特定的深度,如 cv2.CV_8U、cv2.CV_16U、cv2.CV_32F 等。
- kernel:卷积核,一个二维数组或矩阵。卷积核的大小通常是奇数,如 3x3、5x5 等。卷积核中的每个元素都是一个权重,用于在卷积过程中与图像像素相乘。
- dst:输出图像(可选)。
- anchor:卷积核的锚点(可选)。
- delta:一个可选的附加值,它将被加到卷积结果上。这可以用于调整结果的亮度或对比度。
- borderType:边界填充。
进行边缘检测的方向取决于选取的卷积核kernel
当kernel取k1时,检测方向为垂直方向
当kernel取k2时,检测方向为水平方向
当然kernel的取值并非只有上面两种,该函数通过应用自定义的卷积核对图像进行滤波处理,可以实现各种线性滤波效果。卷积核可以看作是一种特殊的算子,但本质是函数。
注意:上面的k1,k2,正是Sobel算子(下面会讲)需要使用的卷积核,所以cv2.filter2D()函数选用上面的k1,k2作为参数kernel的取值,那么它与Sobel算子的作用效果是一样的。
那么卷积核是如何运作的呢,还跟之前一样要提前填充边缘吗?放心,不需要,计算很简单。
如下图,以垂直方向为例:
卷积核进行操作的是单信道图像,灰度图或二值图,两个极端0(黑),255(白),该卷积核进行操作目的是为进行边缘检测,所以将两个极端进行重新赋值,以便及那个边缘区分开来,下面介绍的Sobel算子,也是相同的操作,不在赘述。
实线框部分是第一次卷积,左右两边(中间列除外)各自与对赢得系数相乘,然后进行相加
(196-247)+2*(199-241)+(35-190)= -290 结果<=0,归零,将中间一列重新赋值为零
卷积核滑动,虚线部分为第二次卷积,
(243-0)+2*(245-0)+(197-0)=930 结果>0,归255,将中间列重新赋值为255
示例代码
import cv2
import numpy as np# 读取一张图
img = cv2.imread("./shudu.png")# 进行垂直梯度处理
kernel = np.array([[-1, 0, 1],[-2, 0, 2],[-1, 0, 1]])
img_filter = cv2.filter2D(img, -1, kernel)# 进行水平梯度处理
kernel1 = np.array([[-1, -2, -1],[0, 0, 0],[1, 2, 1]])
img_filter_level = cv2.filter2D(img, -1, kernel1)cv2.imshow('image', img)
cv2.imshow('img_filter', img_filter)
cv2.imshow('img_filter_level', img_filter_level)cv2.waitKey(0)
效果对比
Sobel算子
上面的两个卷积核都叫做Sobel算子,只是方向不同,它先在垂直方向计算梯度:
cv2.Sobel()函数
功能:用于计算图像梯度(gradient)的函数
参数:
- src: 输入图像,它应该是灰度图像。
- ddepth: 输出图像的所需深度(数据类型)。通常,你可以使用 -1 来表示与输入图像相同的深度,或者使用如 cv2.CV_64F 等来指定特定的深度。由于梯度计算可能产生负值,因此建议使用能够包含负数的数据类型。
- dx: x 方向上的导数阶数。如果你想要计算 x 方向上的梯度,设置这个参数为 1;如果你不关心 x 方向上的梯度,设置这个参数为 0。
- dy: y 方向上的导数阶数。如果你想要计算 y 方向上的梯度,设置这个参数为 1;如果你不关心 y 方向上的梯度,设置这个参数为 0。通常,你不会同时设置 dx 和 dy 都为 0。
- ksize: Sobel 核的大小。它必须是 1、3、5、7 或 9 之一。这个参数决定了用于计算梯度的滤波器的大小。大小为 1 时表示使用最小的滤波器,但通常你会使用更大的滤波器来平滑梯度计算。
- scale: 可选参数,表示计算梯度时的缩放因子。默认值为 1,表示不进行缩放。你可以通过调整这个参数来放大或缩小梯度的结果。
- delta: 可选参数,表示在将结果存储到目标图像之前要添加到结果中的可选增量值。默认值为 0,表示不添加增量。
- borderType: 像素外推方法,例如 cv2.BORDER_DEFAULT、cv2.BORDER_REFLECT 等。这个参数决定了在图像边界处如何处理像素外推。
示例代码
import cv2# 读取一张图
img = cv2.imread("./shudu.png")# 使用sobel算子
# 水平梯度
img_sobel = cv2.Sobel(img, -1, 0, 1, ksize=3)
# 垂直梯度
img_sobel_2 = cv2.Sobel(img, -1, 1, 0, ksize=3)cv2.imshow('image', img)
cv2.imshow('img_sobel', img_sobel)
cv2.imshow('img_sobel_2', img_sobel_2)cv2.waitKey(0)
效果对比
其他算子
Laplacian算子
下面为推导过程,了解即可可直接跳过,我们只关心最后的卷积核
在此基础上考虑斜对角情况,该算子的图像卷积模板如下:
cv2.Laplacian()函数
功能:用于计算图像的拉普拉斯算子(Laplacian)
参数:
- src: 输入图像,它应该是灰度图像。
- ddepth: 输出图像的所需深度。这个参数决定了输出图像的深度(数据类型)。通常,你可以使用 -1 来表示与输入图像相同的深度,或者使用 cv2.CV_64F 等来指定特定的深度。由于拉普拉斯算子可能产生负值,因此通常建议使用能够包含负数的数据类型,如 cv2.CV_64F。
- ksize: 算子的大小。它必须是 1、3、5 或 7 之一。这个参数决定了用于计算拉普拉斯算子的滤波器的大小。大小为 1 时表示使用 4 邻域拉普拉斯算子,其他大小则使用更大的滤波器。
- scale: 可选参数,表示计算拉普拉斯算子时的缩放因子。默认值为 1,表示不进行缩放。你可以通过调整这个参数来放大或缩小拉普拉斯算子的结果。
- delta: 可选参数,表示在将结果存储到目标图像之前要添加到结果中的可选增量值。默认值为 0,表示不添加增量。
- borderType: 像素外推方法,例如 cv2.BORDER_DEFAULT、cv2.BORDER_REFLECT 等。这个参数决定了在图像边界处如何处理像素外推。当 ksize 大于 1 时,这个参数才有意义。
示例代码
import cv2# 读取一张图
img = cv2.imread("./shudu.png")# 使用拉普拉斯算子
img_lap = cv2.Laplacian(img, -1, ksize=3)cv2.imshow('image', img)
cv2.imshow('img_lap', img_lap)cv2.waitKey(0)
效果对比
小结
Sobel算子是二阶边缘检测的典型代表
Laplacian算子是二阶边缘检测的典型代表
不过 一 / 二 阶边缘检测各有优缺点,大家可自行了解。
图像边缘检测
边缘检测要用到Canny算法,Canny边缘检测方法 常被誉为 边缘检测 的最优方法。
首先,Canny算法 处理的是 图像的二值化结果,接收到二值化图像后,需要按照如下步骤进行:
- 高斯滤波。
- 计算图像的梯度和方向。
- 非极大值抑制。
- 双阈值筛选。
下面我来介绍一下这四步
1. 高斯滤波
在前面的文章里历经详细介绍了高斯滤波,遗忘的同学,链接如下:
10篇--图像噪点消除-CSDN博客
之前提到过,低通滤波器是模糊,高通滤波器是锐化。
而边缘检测本身属于锐化操作,对噪点比较敏感,需要进行平滑处理。所以用到的高斯滤波为高通滤波器。这里使用的是一个5*5的高斯核对图像进行消除噪声:
2. 计算图像的梯度与方向
2.1 计算梯度
这里使用了Sobel算子(核值固定的卷积核)来计算图像的梯度值,如下所示:
这些是高数中二阶偏导数相关的概念,就不做赘述了。不理解也没关系,重点不在这,接着往下看
2.2 计算方向
这个角度值其实就是当前边缘的梯度的方向,与边缘的方向刚好垂直。
通过这个公式我们就可以计算出图片中所有的像素点的梯度值与梯度方向,然后根据梯度方向获取边缘的方向,获得θ。得到θ的值之后,就可以对边缘方向进行分类,一般将其归为四个方向:
水平方向、垂直方向、45°方向、135°方向:
- 当θ值为-22.5°~22.5°,或-157.5°~157.5°,则认为边缘为水平边缘;
- 当法线方向为22.5°~67.5°,或-112.5°~-157.5°,则认为边缘为45°边缘;
- 当法线方向为67.5°~112.5°,或-67.5°~-112.5°,则认为边缘为垂直边缘;
- 当法线方向为112.5°~157.5°,或-22.5°~-67.5°,则认为边缘为135°边缘;
3. 非极大值抑制
通过上面的操作,已经初步筛选出了边缘,把他们连起来不久OK了,齐活?
NO,NO,NO!本系列第10篇提到过,锐化都容易损坏边缘信息,使边缘模糊,导致经过第二步后得到的边缘像素点非常多,因此我们需要对其进行一些过滤操作。其中非极大值抑制就是一个很好的方法。
在边缘检测中,非极大值抑制的主要目的是细化边缘。具体来说,它通过对梯度图像中的像素值进行比较和筛选,只保留梯度方向上局部最大的像素值,而将其他非最大的像素值抑制为零。这样,边缘就变得更加细化和清晰,减少了冗余的边缘信息。假设当前像素点为(x,y),其梯度方向是0°,梯度值为G(x,y),那么我们就需要比较G(x,y)与两个相邻像素的梯度值:G(x-1,y)和G(x+1,y)。如果G(x,y)是三个值里面最大的,就保留该像素值,否则将其抑制为零。
并且如果梯度方向不是0°、45°、90°、135°这种特定角度,那么就要用到插值算法来计算当前像素点在其方向上进行插值的结果了,然后进行比较并判断是否保留该像素点。这里使用的是单线性插值,通过A1和A2两个像素点获得dTmp1与dTmp2处的插值,然后与中心点C进行比较。
4. 双阈值筛选
经过非极大值抑制之后,我们还需要设置阈值来进行筛选。
- 当阈值设的太低,就会出现假边缘
- 而阈值设的太高,一些较弱的边缘就会被丢掉
因此使用了双阈值来进行筛选,推荐高低阈值的比例为2 : 1到3 : 1之间,其原理如下图所示:
- 当某一像素位置的幅值超过最高阈值时,该像素必是边缘像素;
- 幅值处于最高像素与最低像素之间时,如果它能连接到一个高于阈值的边缘时,则被认为是边缘像素,否则就不会被认为是边缘;
- 当幅值低于最低像素时,该像素必不是边缘像素。
也就是说,上图中的A和C是边缘,B不是边缘。因为C虽然不超过最高阈值,但其与A相连,所以C就是边缘。
至此,Canny边缘检测就完成了。
cv2.Canny()函数
功能:用于边缘检测的函数
参数:
- image: 输入图像,它应该是一个灰度图像(单通道)。
- threshold1: 第一个阈值,用于边缘检测的滞后过程。这个值较低,用于确定边缘的初始点。
- threshold2: 第二个阈值,用于边缘检测的滞后过程。这个值较高,用于确定边缘的最终点。如果某个像素点的梯度值高于这个阈值,它被认为是边缘;如果低于这个值但高于threshold1,并且与高于threshold2的像素点相连,它也被认为是边缘。
- edges: 输出图像,与输入图像大小相同,但通常是二值图像(即只包含边缘和非边缘的像素)。
- apertureSize(可选,默认为3): Sobel算子的大小,它决定了梯度计算的邻域大小。它必须是1、3、5或7之一。
- L2gradient(可选,默认为False): 一个布尔值,指示是否使用更精确的L2范数进行梯度计算。如果为True,则使用L2范数(即欧几里得距离);如果为False,则使用L1范数(即曼哈顿距离)。L2范数通常更精确,但计算成本也更高。
示例代码
import cv2img = cv2.imread("kabuto.jpg")# 灰度化
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 二值化
_, img_binary = cv2.threshold(img_gray, 127, 255,cv2.THRESH_BINARY + cv2.THRESH_OTSU)# 进行高斯滤波
img_blur = cv2.GaussianBlur(img_binary, (3,3), 3)# 边缘检测
img_canny = cv2.Canny(img_blur, 10, 70)cv2.imshow('img', img)
cv2.imshow('img_canny', img_canny)
cv2.waitKey(0)
效果对比
相关文章:
11篇--图像边缘检测
图像梯度 要学习图像边缘检测,要先了解图像梯度的概念,我们正是通过梯度值来区分边缘像素点的 处于边缘附近的像素点与周围像素点的差距很大(不然不会有边缘呈现),所以给边缘附近的的梯度之变化很快,通过…...
【数值特性库】入口文件
数值特性库入口文件为lib.rs。该文件定义一系列数字特性的trait(特征),这些特性可以被不同的数字类型实现,从而提供一套通用的数值操作方法。下面是对代码中关键部分的解释: 一、基础设置 #![doc(html_root_url “h…...
企业微信客户管理工具
软件下载 点击这里下载软件 使用指南 查看操作演示视频 点击这里观看视频教程 安装与注意事项 排除防病毒程序干扰(本程序无病毒,请放心使用).避免快捷键冲突(确保 CtrlA 等快捷键无其他程序占用). 操作流程 手动启动企业微信,打开“添加客户”界面…...
Unity 碎片化空间的产生和优化
文章目录 产生1. 动态内存分配2. 磁盘文件操作3. 内存池和对象池4. 数据结构导致的碎片5. 操作系统的内存管理6. 应用程序设计不当 碎片化空间的优化方案 产生 碎片化空间通常指内存或磁盘中的一种分配不连续、难以利用的现象,主要由以下原因产生: 1. …...
音视频学习(二十七):SRT协议
SRT(Secure Reliable Transport)是一种开源的网络传输协议,专为实时音视频数据传输设计,具有低延迟、高可靠性和安全性等特点。 核心功能 SRT协议旨在解决实时音视频传输中的网络抖动、丢包、延迟和安全问题,提供以下…...
【Canvas与艺术】红色3号桌球
【注】 此图立体感还差点,以后改进吧。 【成图】 120*120的png图标: 大小图: 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8&q…...
2024-12-20 iframe嵌套与postMessage传值
iframe嵌套与postMessage传值 在Web开发中,iframe嵌套和postMessage传值是两个常用的技术,它们各自具有独特的用途和优势。本文将对这两项技术进行详细解析,并通过实例展示其使用方法。 一、iframe嵌套 什么是iframe嵌套? ifram…...
MFC 应用程序语言切换
在开发多语言支持的 MFC 应用程序时,如何实现动态语言切换是一个常见的问题。在本文中,我们将介绍两种实现语言切换的方式,并讨论其优缺点。同时,我们还会介绍如何通过保存配置文件来记住用户的语言选择,以及如何在程序…...
与您的数据对话: 用人工智能驱动的对象存储变革医疗保健
MinIO 的提示 API 现在是 AIStor 的一部分。MinIO 的创建是为了支持海量数据集,包括超过 EB 级的工作负载,解决内存、网络、复制和负载均衡方面的挑战,而 AIStor 的创建是为了建立在这些功能之上并解决我们客户的 AI 使用案例。作为 AIStor 的…...
WIN10拖入文件到桌面,文件自动移动到左上角,导致桌面文件错乱
1.先打开文件管理器。 2.点击如下图所示的“选项”。 3.我用红笔标记的这个框,把勾去掉...
JavaSE——绘图入门
一、Java绘图坐标体系 下图说明了Java坐标系,坐标原地位于左上角,以像素为单位。在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直…...
electron-vite打包后图标不生效问题
在electron-builder.yml中,通过icon配置自己的图标,以下是正确代码 win:executableName: 名称icon: build/icon.ico nsis:artifactName: ${name}-${version}.${ext}shortcutName: ${productName}uninstallDisplayName: ${productName}createDesktopShor…...
【MySQL】Linux使用C语言连接安装
📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…...
Linux计算时间差
Linux计算时间差 1、Linux计算时间差2、时间差的应用 1、Linux计算时间差 在Linux中,计算时间差通常是为了统计、监控或调试。时间差可以用来衡量任务执行的时间,或者两个事件之间的间隔。例如,响应时间、执行时间、定时任务与延时处理等 以…...
onlyoffice连接器 二次开发 合同等制式模板化技术开发方案【三】
一、期望效果 目前曹瑞版本onlyoffice已经实现:书签模式 和 控件模式,用以支持该方案。 【图1】字段绑定 【图2】模板发起 【图3】接入表单 思路讲解: 业务系统开发中通常希望能够通过绑定form字段给word,从而达到双向同步效果&am…...
【论文研读】U-DiTs:在U型扩散Transformer中引入下采样Token,以更低计算成本超越DiT-XL/2
推荐理由 这篇论文提出了一种新的U型扩散Transformer模型(U-DiT),该模型通过对自注意力机制中的查询、键和值进行下采样,有效减少了计算冗余,同时提高了性能。论文中的研究不仅包含理论分析和实验验证,还展…...
2009 ~ 2019 年 408【计算机网络】大题解析
2009 年 路由算法(9’) 讲解视频推荐:【BOK408真题讲解-2009年(催更就退网版)】 某网络拓扑如下图所示,路由器 R1 通过接口 E1 、E2 分别连接局域网 1 、局域网 2 ,通过接口 L0 连接路由器 R2 &…...
.net core在linux导出excel,System.Drawing.Common is not supported on this platform
使用框架 .NET7 导出组件 Aspose.Cells for .NET 5.3.1 asp.net core mvc 如果使用Aspose.Cells导出excel时,报错 : System.Drawing.Common is not supported on this platform 平台特定实现: 对于Windows平台,System.Drawing.C…...
ExcelVBA编程输出ColorIndex与对应颜色色谱
标题 ExcelVBA编程输出ColorIndex与对应颜色色谱 正文 解决问题编程输出ColorIndex与对应色谱共56,打算分4纵列输出,标题是ColorIndex,Color,Name 1. 解释VBA中的ColorIndex属性 在VBA(Visual Basic for Applications)中ÿ…...
3.使用SD卡挂载petalinux根文件系统
前言 说明为什么使用SD卡挂载petalinux根文件系统如何使用SD卡挂载根文件系统 配置根文件写入类型制作SD分区格式化SD卡将工程目录下的rootfs.tar.gz解压到SD EXT4分区 为什么使用SD卡挂载petalinux根文件系统 Petalinux 默认的根文件系统类型是 INITRAMFS,不能…...
Java反射学习(1)(Java的“反射“机制、Class类对象的实例化方式)
目录 一、Java的"反射"机制。 (1)生活中的"反射"例子。 (2)Java的"反射"机制。 1、Java程序中"反射"的基本介绍。 2、"反射"机制图解介绍。 3、"反射"常见的应用场景…...
paimon中的Tag
TAG 在传统数仓场景中,从传统数据库中导入的事实表数据一般是全量导入,按天分区每天都存储一份全量数据,paimon对此提供了Tag机制,创建TAG时,会对当前数据做一份全量快照,在之后对表的数据进行更新也不会影…...
使用Vue创建前后端分离项目的过程(前端部分)
前端使用Vue.js作为前端开发框架,使用Vue CLI3脚手架搭建项目,使用axios作为HTTP库与后端API交互,使用Vue-router实现前端路由的定义、跳转以及参数的传递等,使用vuex进行数据状态管理,后端使用Node.jsexpress…...
4、交换机IP接口功能
这一篇是讲端口的功能的,应该放在路由前面的,不过关联不大,就这个顺序也行 1、DHCP功能 作用:交换机端口的DHCP功能可以使网络中的设备(计算机、打印机等等)能够自动的获取IP地址或其它网络参数࿰…...
java 选择排序,涵盖工作原理、算法分析、实现细节、优缺点以及一些实际应用场景
选择排序的详细解析 更深入地探讨选择排序的各个方面,包括其工作原理、算法分析、实现细节、优缺点以及一些实际应用场景。 动画演示 1. 基本概念 选择排序是一种简单的比较排序算法。它的核心思想是将数组分为两个部分:已排序部分和未排序部分。每…...
基于springboot+vue实现的医院急诊(病房)管理系统 (源码+L文+ppt)4-122
摘要 医院急诊(病房)管理系统旨在优化患者的就诊流程,提高医疗效率和服务质量。该系统通过电子化患者信息、实时床位监控和智能调度等功能,确保急诊患者能够快速得到必要治疗,同时协助医护人员高效管理病房资源。系统…...
前端模块化
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言1.概述1.1什么是模块化1.2为什么要使用模块化 2.有哪些模块化规范3.CommonJS3.1导入3.1.1正常导入3.1.2解构导入 3.2导出3.2.1exports导出3.2.2module.exports导…...
在VMware虚拟机上设置Ubuntu与主机共享文件夹
在VMware虚拟机上设置Ubuntu与主机共享文件夹的步骤如下: 主机共享文件夹的设置:首先,在主机上选择一个磁盘分区创建一个文件夹,并设置其共享属性。右键点击该文件夹,选择“属性”,然后在“共享”选…...
无线信道常识(符号与多径、窄带与宽带)
符号长度与时延扩展 符号长度: 符号长度是指一个符号(即一个信息单元)在传输过程中所占用的时间。符号长度通常与系统的带宽和调制方式有关。例如,在GSM系统中,符号长度大约为 5μs。 时延扩展: 时延扩展是…...
人工智能 (AI) 模型的数据泄露问题
目录 1. 数据泄露:2. 模型泄露:3. 社会工程学攻击:参考文献:其他资源: 人工智能 (AI) 模型的数据泄露问题指的是模型训练过程中,训练数据的信息被泄露到模型输出中,导致模型对未见过的数据产生偏差或错误预测。这种泄露可能来自多个方面,包括…...
uniapp Vue3 语法实现浏览器中音频录制、停止、保存、播放、转码、实时音频输出
一、引言 在现代 Web 应用开发中,音频处理功能变得越来越重要。本文将详细介绍如何使用 uniapp 结合 Vue3 语法在浏览器环境中实现音频录制、停止、保存、播放、转码以及实时音频输出等一系列功能。通过深入剖析代码结构和功能实现细节,帮助读者全面理解和掌握相关技术,以便…...
OSPF的基本配置
基本原理图 1. 要求: R1-3为区域0,R3-R4为区域1;其中r3的环回也在区域0。R1,R2也各有一个环回 R1-R3 R3为DR设备,没有BDR R4环回地址以固定,其他所有网段使用192.168.1.0/24进行合理的分配 R4环回不能宣告࿰…...
【Flutter_Web】Flutter编译Web第二篇(webview篇):flutter_inappwebview如何改造方法,变成web之后数据如何交互
前言 欢迎来到第二篇文章,这也是第二个难题,就是原有的移动端本身一些页面H5的形式去呈现(webview),例如某些需要动态更换内容的页面,某些活动页面、支付页面,不仅仅做页面呈现,还包…...
【游戏中orika完成一个Entity的复制及其Entity异步落地的实现】 1.ctrl+shift+a是飞书下的截图 2.落地实现
一、orika工具使用 1)工具类 package com.xinyue.game.utils;import ma.glasnost.orika.MapperFactory; import ma.glasnost.orika.impl.DefaultMapperFactory;/*** author 王广帅* since 2022/2/8 22:37*/ public class XyBeanCopyUtil {private static MapperFactory mappe…...
全局JDK环境和ES自带的JDK混用导致的ES集群创建失败
es配置安全集群es使用的自带的jdk环境,如果服务器全局在有jdk的配置。会导致秘钥解析出问题。各种问题异常密钥解析异常。 错误日志1: [2024-12-20T17:10:44,700][WARN ][o.e.c.c.ClusterFormationFailureHelper] [es-node1] master not discovered yet…...
vmime.net_4.dll详解:它是什么,有何用途?
在.NET开发环境中,DLL(Dynamic Link Library,动态链接库)文件扮演着至关重要的角色。它们封装了代码和资源,使得多个应用程序可以共享这些功能,从而提高开发效率和代码复用性。本文将详细介绍vmime.net_4.d…...
K8s 节点 NotReady 后 Pod的变化
NotReady 后 Pod的变化 当Kubernetes(K8s)节点进入NotReady状态时,该节点将无法接收新的Pod调度,这可能会影响服务的可用性。以下是节点变为NotReady后,其上Pod状态可能发生的一些情况和细节: Pod状态变为…...
使用 esrally race 测试 Elasticsearch 性能:实践指南
在 Elasticsearch 性能优化和容量规划中,使用 esrally 进行基准测试是官方推荐的方式。通过 esrally race 命令,您可以针对不同的数据集与挑战类型,对 Elasticsearch 集群进行精确的性能评估。本文将简要介绍常用的数据集与挑战类型ÿ…...
对象、函数、原型之间的关系
在 JavaScript 中,对象、函数 和 原型 是三者紧密联系的核心概念。它们共同构成了 JavaScript 中面向对象编程的基石,并通过原型链实现了继承与代码复用。本文将从对象、函数、原型的基础概念到它们之间的关系进行详细的讲解,帮助你理解 Java…...
Showrunner AI技术浅析(二):大型语言模型
1. GPT-3模型架构详解 GPT-3是基于Transformer架构的预训练语言模型,由OpenAI开发。其核心思想是通过自注意力机制(Self-Attention)处理输入序列,并生成自然语言文本。 1.1 Transformer架构基础 Transformer架构由Vaswani等人在…...
Web安全攻防入门教程——hvv行动详解
Web安全攻防入门教程 Web安全攻防是指在Web应用程序的开发、部署和运行过程中,保护Web应用免受攻击和恶意行为的技术与策略。这个领域不仅涉及防御措施的实现,还包括通过渗透测试、漏洞挖掘和模拟攻击来识别潜在的安全问题。 本教程将带你入门Web安全攻防…...
买卖股票的最佳时机 - 合集
************* C 买卖股票问题合集 ************* Since I have finished some stocks problems. I wanna make a list of the stocks to figure out the similarities. Here is the storks topucs list, from easy to hard: 121. 买卖股票的最佳时机 - 力扣(L…...
gitlab window如何设置ssh
在GitLab中设置SSH需要以下步骤: 在GitLab账户中,导航到“用户设置”下的“SSH密钥”部分。 生成SSH密钥对(如果你还没有的话)。在Windows上,你可以使用ssh-keygen命令来生成密钥。 在命令提示符或PowerShell中运行以…...
go配置文件
https://github.com/spf13/viper viper golang中常用的配置文件工具为viper库,是一个第三方库。viper功能: 解析JSON、TOML、YAML、HCL等格式的配置文件。监听配置文件的变化(WatchConfig),不需要重启程序就可以读到最新的值。...
深度学习之超分辨率算法——SRGAN
更新版本 实现了生成对抗网络在超分辨率上的使用 更新了损失函数,增加先验函数 SRresnet实现 import torch import torchvision from torch import nnclass ConvBlock(nn.Module):def __init__(self, kernel_size3, stride1, n_inchannels64):super(ConvBlock…...
GIT命令使用手册(详细实用版)
一、git常用操作参考 第一次提交完整步骤: 1.git init; 2.git add . 3.git commit -m "初始化" 4.git remote add origin https://github.com/githubusername/demo.git 5.git pull origin master 6.git push -u origin master(使用-u选项可以将…...
数据分析实战—IMDB电影数据分析
1.实战内容 1.加载数据到movies_df,输出前5行,输出movies_df.info(),movies_df.describe() # (1)加载数据集,输出前5行 #导入库 import pandas as pd import numpy as np import matplotlib import matplotlib.pyplo…...
【SQL/MySQL 如何使用三种触发器】SQL语句实例演示
触发器介绍 – 触发器是与表有关的数据库对象,指在insert/update/delete之前(BEFORE)或之后(AFTER),触发并执行触发器中定义的SQL语句集合。 – 使用别名OLD和NEW来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发器还只…...
社区团购管理系统(源码+数据库)
355.基于SpringBoot的社区团购管理系统,系统包含两种角色:管理员、用户,系统分为前台和后台两大模块,主要功能如下 二、项目技术 编程语言:Java 数据库:MySQL 项目管理工具:Maven 前端技术:Vue …...
时钟分频模块
实现时钟的二分频,四分频 1.时钟分频模块: module clk_div(input clk, //50Mhzinput rst_n,input [15:0] lcd_id,output reg lcd_pclk);reg clk_25m; reg clk_12_5m; reg …...