计算机视觉颜色校正方法

news2024/11/25 6:39:02

计算机视觉颜色校正方法

  • 调色和色彩矫正之间的区别
  • 直方图均衡化
    • 原理
    • 实现代码
  • CCM颜色校正矩阵
    • 原理
  • 深度学习Deep_White_Balance
    • 什么是sRGB图像
    • 问题描述:
    • 方法概述:
    • 模型架构:
    • 训练损失函数
    • 实现
      • 快速开始

调色和色彩矫正之间的区别

调色是指通过调整图像的色调、饱和度和亮度等参数来改变图像的整体颜色效果。这种调整可以是主观的,根据个人或艺术家的审美意图进行。调色通常用于图像处理、摄影和电影制作等领域,以达到特定的视觉效果或情感表达。

色彩校正(Color Correction)则是指对图像的色彩进行修正,使其符合真实场景中的颜色。色彩校正旨在消除图像中的色偏、色差或色均衡问题,以还原真实的色彩。它是通过校准图像的颜色分布或调整色彩通道来实现的。

总结来说,调色更侧重于艺术性和主观性,通过调整参数来改变图像的整体色调和效果。而色彩校正更侧重于修正图像中的色彩问题,使其更准确地反映真实场景中的颜色。

下文主要是为大家介绍几种方法以及对应实现代码(已跑通),:直方图方法、色彩矩阵CCM方法、深度学习方法方法

直方图均衡化

当拍摄图像的环境较暗时,图像往往会显得较为暗淡。我们可以通过直方图处理方法对图像的颜色进行校正,以改善图像的亮度和对比度。直方图处理方法是一种基于像素强度值的统计分析方法,通过重新分配图像的强度值来实现校正。

在这种方法中,我们首先观察图像的直方图,特别是像素强度值的概率密度函数(PDF)。夜间拍摄的图像往往呈现出在较低光谱上偏斜的分布。这意味着图像中的强度值倾向于集中在较暗的区域。

为了校正这种偏斜,我们的目标是将图像的累积分布函数(CDF)拉伸到一个新的目标CDF。这样一来,原本位于较低光谱的强度值将被映射到较高的强度值,从而提亮图像。我们通过对图像的像素值进行变换来实现这个过程。

具体而言,直方图处理方法可以采用直方图均衡化或直方图规定化等技术。直方图均衡化通过重新分配像素强度值,增强图像的对比度。而直方图规定化则通过匹配图像的CDF与目标CDF来调整强度值分布。这些方法都利用了图像中强度值的统计信息,从而提高图像的视觉效果。

同理对于拍摄图像的环境较亮时,也是一个道理

原理

当进行直方图均衡化的图像处理时,我们将原始图像拆分成红、绿、蓝三个通道(RGB)。然后对每个通道进行以下计算流程:

  1. 计算每个通道的直方图:使用灰度图像的直方图计算方法,统计每个像素值的频率。
  2. 计算累积分布函数(CDF):将直方图进行累加,得到每个像素值的累积频率。
  3. 标准化CDF:将CDF值除以图像的总像素数,将其范围限制在0到1之间。
  4. 构建目标CDF:创建一个线性分布的CDF,其中像素值从0到255均匀分布。
  5. 映射像素值:对于每个像素值,根据当前通道的标准化CDF和目标CDF,找到最接近的像素值并进行映射。
  6. 重建通道:将经过映射后的通道重新组合。
  7. 重复步骤2到6,对于剩下的两个通道进行处理。

将三个处理后的通道堆叠到一起,得到最终的处理图像。

实现代码

导入库

import numpy as np
import matplotlib.pyplot as plt
from skimage.io import imread, imshow
from skimage import img_as_ubyte, img_as_float
from skimage.color import rgb2gray
from skimage.exposure import histogram, cumulative_distribution
from scipy.stats import norm, cauchy, logistic

meimei = imread('meimei.jpg')
meimei_gray = rgb2gray(meimei)

在这里插入图片描述

  1. skimage.exposure.histogram(image, nbins=256):

    • 该函数用于计算图像的直方图。
    • 参数 image 是输入的图像数组。
    • 参数 nbins 是直方图的 bin 数量,默认为 256。
    • 返回值是一个包含两个数组的元组 (hist, bin_centers),其中 hist 是长度为 nbins 的数组,表示每个 bin 中的像素数量,bin_centers 是对应的 bin 中心值。
  2. skimage.exposure.cumulative_distribution(image, nbins=256):

    • 该函数用于计算图像的累积分布函数(CDF)。
    • 参数和返回值同 skimage.exposure.histogram 函数相同。
    • 返回的 CDF 数组表示图像中小于或等于对应像素值的像素所占的比例。

我们先看下这个妹妹的真实CDF和目标CDF的对比

image_intensity = img_as_ubyte(meimei_gray)
freq, bins = cumulative_distribution(image_intensity)
target_bins = np.arange(256)
target_freq = np.linspace(0, 1, 256)
new_vals = np.interp(freq, target_freq, target_bins)


fig, ax = plt.subplots(1,2, figsize=(15,5))
ax[0].step(bins, freq, c='b', label='Actual CDF')
ax[0].plot(target_bins, target_freq, c='r', label='Target CDF')
ax[0].legend()
ax[0].set_title('Grayscale: Actual vs. Target Cumulative Distribution')

ax[1].imshow(new_vals[image_intensity.clip(0, len(new_vals)-1)].astype(np.uint8), 
             cmap='gray')
ax[1].set_title('Corrected Image in Grayscale');

在这里插入图片描述
分通道实现CDF转化

def linear_distribution(image, channel):
    image_intensity = img_as_ubyte(image[:,:,channel])
    print(len(image_intensity))
    freq, bins = cumulative_distribution(image_intensity)
    target_bins = np.arange(255)
    target_freq = np.linspace(0, 1, len(target_bins))
    new_vals = np.interp(freq, target_freq, target_bins)
    print(len(new_vals))
    return new_vals[image_intensity.clip(0,len(new_vals)-1)].astype(np.uint8)

red_channel = linear_distribution(meimei, 0)
green_channel = linear_distribution(meimei, 1)
blue_channel = linear_distribution(meimei, 2)

fig, ax = plt.subplots(1,2, figsize=(15,5))
ax[0].imshow(meimei);
ax[0].set_title('Original Image')
ax[1].imshow(np.dstack([red_channel, green_channel, blue_channel]));
ax[1].set_title('Transformed Image');

在这里插入图片描述

CCM颜色校正矩阵

CCM(Color Correction Matrix,颜色校正矩阵)是一种用于图像颜色校正的方法。它通过建立输入图像的颜色空间与目标颜色空间之间的映射关系,实现对图像颜色的校正和调整。CCM方法可以校正图像中的色偏、色彩失真和色彩不一致等问题,以获得更准确和自然的色彩表现。

CCM的基本原理是建立输入图像的颜色空间与目标颜色空间之间的映射关系。通常,CCM使用一个矩阵来表示这种映射关系。矩阵的每个元素表示输入颜色通道与目标颜色通道之间的权重关系。通过将输入图像的每个像素值与CCM矩阵相乘,可以得到校正后的颜色值。这样,输入图像的颜色将根据预先定义的目标颜色进行调整,以实现颜色的校正和调整。

原理

CCM方法的计算流程如下:

  1. 收集参考图像和参考数据:

使用彩色测试图表,例如X-Rite Colorchecker,其中包含多个色块以代表不同的颜色。
参考数据可以是标准参考值、使用光谱仪测量得到的值,或者是从“黄金标准”图像中提取的Lab*值。

  1. 图像预处理:

线性化处理:由于CCM的计算需要线性的R、G、B值,因此需要对图像进行适当的线性化处理,以确保输入数据是线性表示的。
饱和度处理:根据需要,可能需要对图像的饱和度进行调整,以控制颜色的鲜艳度或减少颜色失真。

  1. CCM计算方法:

多项式拟合法:通过对原始图像数据和参考数据进行多项式拟合,计算得到CCM的系数。拟合的目标是使拟合结果与参考数据之间的差异最小化。
三维查找表(3D-LUT)法:将颜色空间划分为离散的网格,并在每个网格点上定义一个CCM。通过对原始图像中的像素进行插值,确定其所在网格,并使用相应的CCM进行校正。

  1. 优化和评估:

目标函数选择:选择适当的目标函数来评估CCM的校正效果。常用的目标函数包括均方根误差(RMSE)和颜色差异度量(如ΔE 2000)。目标函数的选择取决于具体的应用需求。
非线性优化算法:使用适当的优化算法(如梯度下降法、Levenberg-Marquardt算法等)来寻找最小化目标函数的解,即找到使得CCM能够最好地将原始图像校正为参考数据的参数。

  1. 评估和调整

对计算得到的CCM进行评估,可以使用其他测试图像或验证数据集来验证校正效果。
根据评估结果,可能需要进行进一步的调整和优化,以获得更好的校正结果。

当计算CCM时,涉及到以下几个公式的计算:

  1. 彩色图像表示

彩色图像可以表示为一个 m × n × 3 的数组,其中 m 表示图像的高度,n 表示图像的宽度,3 表示颜色通道(R、G、B)。假设原始图像的像素数据被表示为 input_img。

  1. 线性化处理

对于每个像素 i,首先需要进行线性化处理,将非线性的原始像素值转换为线性表示。线性化后的像素值用 linear_img 表示。具体的线性化处理公式如下:

在这里插入图片描述

这里将原始像素值除以 255 是为了将像素值归一化到 [0, 1] 的范围内。

  1. CCM计算

CCM 是一个 3×3 或 4×3 的矩阵,用来将原始图像的颜色校正为目标颜色。在计算 CCM 之前,需要定义参考数据,可以是标准参考值、光谱仪测量值或从“黄金标准”图像中提取的 Lab* 值。
多项式拟合法:
使用多项式拟合法计算 CCM,将线性化后的输入图像 linear_img 和参考数据进行拟合。假设 CCM 为一个 3×3 矩阵,表示为 ccm,则拟合的过程可以表示为以下公式:

在这里插入图片描述

详细资料可以参考链接:https://www.imatest.com/support/docs/23-1/colormatrix/

深度学习Deep_White_Balance

论文地址:https://openaccess.thecvf.com/content_CVPR_2020/papers/Afifi_Deep_White-Balance_Editing_CVPR_2020_paper.pdf
项目地址:https://github.com/mahmoudnafifi/Deep_White_Balance

什么是sRGB图像

sRGB(standard Red Green Blue)是由Microsoft影像巨擘共同开发的一种彩色语言协议,它提供了一种标准方法来定义色彩,让显示、打印和扫描等各种计算机外部设备和应用软件对于色彩有一个共通的语言。

白平衡(White Balance,简称WB)是一项重要的图像处理任务,旨在确保不同照明条件下拍摄的图像中的颜色保持一致。然而,传统的白平衡编辑方法在纠正错误的白平衡设置时面临一些挑战,特别是由于相机综合信号处理器(ISP)的非线性渲染效果。为了解决这一问题,我们引入了一种名为"Deep White-Balance Editing"的深度学习方法。

Deep White-Balance Editing通过训练端到端的深度神经网络(DNN)模型,实现了对sRGB图像进行真实的白平衡编辑。相较于传统的基于k最近邻(KNN)的方法,我们的DNN模型不仅在纠正错误的白平衡设置方面更准确,还允许用户自由编辑图像的白平衡,调整到其他照明条件下。

该方法基于一个单编码器网络和三个解码器网络构成。其中,编码器网络用于提取图像特征,而解码器网络针对三种白平衡设置进行学习:正确的自动白平衡(AWB)设置、室内照明设置和室外照明设置。第一个解码器允许对错误白平衡的图像进行编辑,实现后期白平衡校正的目标。而室内和室外解码器则提供了多种不同白平衡效果的融合输出,为调整图像的美学白平衡属性提供了灵活性。

问题描述:

Deep White-Balance Editing是一种用于编辑图像颜色的方法。给定一个通过未知相机ISP和任意白平衡设置 W B ( i n ) WB^{(in)} WB(in)生成的sRGB图像 W B ( i n ) WB^{(in)} WB(in),我们的目标是将其编辑成具有目标白平衡设置 W B ( t ) WB^{(t)} WB(t)的外观。

I W B ( t ) = G ( F ( I W B ( i n ) ) ) I_{WB^{(t)}}=G(F(I_{WB^{(in)}})) IWB(t)=G(F(IWB(in)))

方法概述:

Deep White-Balance Editing方法旨在建立一个编码器-解码器模型,将输入图像转换为具有不同白平衡设置的输出图像。该方法通过分析图像处理链中的函数G和F的协作方式来实现目标图像的生成。函数F将输入图像转换为中间表示(即具有当前WB(in)设置的原始RGB图像),而函数G接受这个中间表示,并使用目标WB设置将其渲染为sRGB颜色空间编码的最终图像。

为了实现不同白平衡设置的目标定位,Deep White-Balance Editing采用了多解码器架构。每个解码器负责生成具有不同白平衡设置的输出图像。本方法选择了三种不同的白平衡设置:AWB(自动白平衡,表示捕获图像场景的正确照明)、Tungsten/Incandescent(白炽灯,表示室内照明的白平衡)和Shade(阴影,表示室外照明的白平衡)。这些解码器分别命名为gA、gT和gS,并通过独立的解码器实现了对应于这三种白平衡设置的输出图像的生成。

在这里插入图片描述

模型架构:

Deep White-Balance Editing采用了U-Net架构,并在编码器和解码器之间使用了多尺度的跳跃连接。整个架构包括两个主要单元:一个4级编码器单元和三个4级解码器单元。编码器负责提取输入图像的多尺度潜在表示,而解码器则根据特定的白平衡设置生成输出图像。在编码器和解码器的不同级别,使用了转置卷积层和具有不同通道数的卷积层,以实现特征的传递和信息的重建。

训练损失函数

模型方法中,使用L1范数损失函数来衡量重建图像与真实图像之间的差异。损失计算的具体步骤如下:

对于每个训练图像和对应的目标白平衡设置(正确AWB、Shade WB和Incandescent WB),从训练图像中随机选择四个大小为128×128的图像块,分别作为输入图像和对应的目标图像。

将输入图像通过编码器网络进行编码,得到特征表示。

将特征表示通过解码器网络分别生成AWB、Shade WB和Incandescent WB三个目标图像的重建结果。

对于每个解码器生成的重建图像和对应的目标图像,计算它们之间的像素级差异,即L1范数损失。这可以通过对每个像素进行绝对值差的累加求和来实现。

将三个解码器生成的重建图像与目标图像的L1损失进行累加,得到总体损失。

具体而言,损失计算公式如下:

L = ∑ i ∑ p = 1 3 h w ∣ P W B ( i ) ( p ) − C W B ( i ) ( p ) ∣ L = \sum_i\sum_{p=1}^{3hw}|P_{WB^{(i)}}(p)-C_{WB^{(i)}}(p)| L=ip=13hwPWB(i)(p)CWB(i)(p)

其中,L表示总体损失, i ∈ A , T , S i \in {A, T, S} iA,T,S 是目标白平衡设置(AWB、Shade WB和Incandescent WB)的索引,p表示训练图像和目标图像的像素索引。

P W B ( i ) ( p ) P_{WB^{(i)}}(p) PWB(i)(p)表示解码器生成的重建图像中的像素值
C W B ( i ) ( p ) C_{WB^{(i)}}(p) CWB(i)(p)表示对应的目标图像中的像素值。

对所有像素进行累加求和,得到每个目标图像与对应重建图像的L1损失,然后对三个目标图像的损失进行累加,得到总体损失。

这种损失计算方式能够使模型学习到与目标图像尽可能接近的重建结果,从而实现准确的白平衡编辑。通过优化这个损失函数,模型能够逐渐提高对不同白平衡设置下图像处理的准确性。

实现

这个项目旨在提供一种深度学习方法,用于进行图像的白平衡编辑。下面是使用该项目的简要介绍和操作指南:

环境要求:

Python 3.6
PyTorch(已测试版本为1.2.0和1.5.0)
torchvision(已测试版本为0.4.0和0.6.0)
cudatoolkit
tensorboard(可选)
numpy
Pillow
future
tqdm
matplotlib
scipy
scikit-learn

请注意,代码可能适用于其他版本的库。

快速开始

示例

  • 运行 demo_single_image.py 来处理单个图像。例如,应用AWB和不同的WB设置:python demo_single_image.py --input_image …/example_images/00.jpg --output_image …/result_images --show。这个示例将保存输出图像到 …/result_images 目录,并输出以下结果图像:
    在这里插入图片描述
  • 运行 demo_images.py 来处理图像目录。例如:python demo_images.py --input_dir …/example_images/ --output_image …/result_images --task AWB。可用的任务包括 AWB、all 和 editing。你也可以在 demo_single_image.py 示例中指定任务。

训练代码

  • 运行 training.py 开始训练。在运行代码之前,请调整训练图像目录。

例如:CUDA_VISIBLE_DEVICE=0 python train.py --training_dir …/dataset/ --fold 0 --epochs 500 --learning-rate-drop-period 50 --num_training_images 0。在这个示例中,fold = 0num_training_images = 0 表示训练将使用所有的训练数据,而不进行交叉验证。如果你想限制训练图像的数量为 n 张图像,请将 num_training_images 设置为 n。如果你想进行 3 折交叉验证,请使用 fold = testing_fold。代码将在剩余的折中进行训练,并保留选择的折用于测试。

其他有用的选项包括:–patches-per-image(选择每个图像的随机补丁数量)、–learning-rate-drop-period 和 –learning-rate-drop-factor(控制学习率的衰减周期和因子),以及 –patch-size(设置训练补丁的大小)。你可以使用 –load 选项从训练检查点 .pth 文件中继续训练。

如果你的机器上安装了 TensorBoard,可以在开始训练后运行 tensorboard --logdir ./runs 来查看训练进展并可视化输入/输出补丁的样本。

这个项目提供了示例代码和训练代码,使你能够快速上手并开始进行白平衡编辑任务。你可以根据自己的需求和数据集进行相应的调整和训练代码提供了灵活的选项,允许你根据自己的需求进行调整。你可以指定训练图像的目录,并选择使用的训练数据数量、训练周期、学习率衰减周期和因子,以及训练补丁的大小。如果你已经有了之前的训练检查点文件,还可以通过使用 --load 选项来从检查点文件中继续训练。

另外,如果你在机器上安装了TensorBoard,你可以在训练过程中运行 tensorboard --logdir ./runs 来可视化训练的进展情况,并查看输入/输出补丁的样本。这可以帮助你更好地理解模型的性能和训练效果。

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

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

相关文章

Vue3使用element-plus实现弹窗效果-demo

使用 <ShareDialog v-model"isShow" onChangeDialog"onChangeDialog" /> import ShareDialog from ./ShareDialog.vue; const isShow ref(false); const onShowDialog (show) > {isShow.value show; }; const onChangeDialog (val) > {co…

使用AI人工智能给线稿上色,给漫画上色

【深度学习】AIGC &#xff0c;ControlNet 论文中的图。 一些酷炫的可以做纵深领域的图&#xff0c;这里再放一下。 下图是由手绘草稿给出图&#xff1a; 由线稿得到图&#xff0c;给漫画上色&#xff1a;

简单的PWN学习-ret2shellcode

最近笔者开始钻研pwn的一些知识&#xff0c;发现栈溢出真的非常的有意思&#xff0c;于是经过一个多礼拜的学习&#xff0c;终于是把2016年的一道CTF题给看明白了了&#xff0c;首先我们学习一下前置技能 0x01 shellcode​ 首先简单看一下shellcode是怎么生成的&#xff0c;首…

Linux和Windows两种平台安装Maven

Linux和Windows两种平台安装Maven 0. 写在前面 Linux版本&#xff1a;Centos-7.5Windows版本&#xff1a;Windows10Maven版本&#xff1a;Maven-3.5.4JDK版本&#xff1a;jdk1.8 1. Linux平台安装 1.1 查看Linux内核版本命令 查看Linux内核版本命令 [whybigdatanode02 ~]$ …

AI医疗。

随着技术的发展&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到了我们生活的许多领域&#xff0c;包括凭其强大的预测和分析能力已经走入了医疗卫生领域。特别是在使用OpenAI的GPT-4技术的chatbot&#xff0c;如chatGPT和GPT-4等&#xff0c;已经成为了给医疗行业注…

驾驶舱数据指标体系设计指南

大数据时代下&#xff0c;各行各业面对众多的顾客和复杂多变的市场需求&#xff0c;要想及时适应市场变化&#xff0c;掌握市场动态&#xff0c;就需要对各个环节的数据进行分析&#xff0c;得到科学有效的结论来指导决策&#xff0c;这就离不开领导驾驶舱。 一、领导驾驶舱是什…

记一次 .NET 某工控视觉系统 卡死分析

一&#xff1a;背景 1. 讲故事 前段时间有位朋友找到我&#xff0c;说他们的工业视觉软件僵死了&#xff0c;让我帮忙看下到底是什么情况&#xff0c;哈哈&#xff0c;其实卡死的问题相对好定位&#xff0c;无非就是看主线程栈嘛&#xff0c;然后就是具体问题具体分析&#x…

为生信写的Python简明教程 | 视频7

开源生信 Python教程 生信专用简明 Python 文字和视频教程 源码在&#xff1a;https://github.com/Tong-Chen/Bioinfo_course_python 目录 背景介绍 编程开篇为什么学习Python如何安装Python如何运行Python命令和脚本使用什么编辑器写Python脚本Python程序事例Python基本语法 数…

BurpSutie拓展插件推荐-辅助测试插件

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 chunked-coding-converter-0.4.0&#xff08;1&#xff09;工具介绍&#xff08;2&#xff09;下载地址&#xff08;3&#xff09;使用说明 02 captcha-killer&#xff08;1&#xff09;工具介绍&a…

HOT43-验证二叉搜索树

leetcode原题链接&#xff1a;验证二叉搜索树 题目描述 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右…

tty(三)uart框架分析

基于linux-3.14.16 重点文件&#xff1a;serial_core.c 一、基本数据结构和接口 这里显然是导出符号给需要用到uart核心的代码使用的&#xff0c;我们从uart_register_driver和uart_add_one_port来分析&#xff0c;搞清楚uart和tty核心的关系。 二、uart_register_driver 首…

服务案例|消失的Linux定时清除任务

企业数字化转型&#xff0c;应用软件不断升级&#xff0c;对运行环境的要求也越来越高&#xff0c;CPU、内存等硬件也同步进入升级。当业务运行或备份时&#xff0c;将产生大量历史文件和临时文件&#xff0c;这就是在运维检测中&#xff0c;我们常看到文件每天几个G&#xff0…

软中断通信及signal()解读

目录 软中断通信 signal() 概述 signal()类似的函数 signal()之SIGINT signal()之SIGTERM signal()之SIGALRM signal()之SIGQUIT SIG_IGN使用 软中断通信 进程间通信方式有多种&#xff0c;其中软中断通信是一种常见的方式&#xff0c;它基于信号机制&#xff0c;可…

【mysql】索引存储结构B+树

参考&#xff1a; https://zhuanlan.zhihu.com/p/545113372 https://www.bilibili.com/read/cv18157852 Mysql数据库引擎默认使用InnoDB&#xff0c;使用B树数据结构。 一个表只能有一个聚簇索引&#xff0c;但可以有多个非聚簇索引&#xff0c;也就是多个索引目录提供数据检索…

coord软件的一些操作

文章目录 1. 大地坐标&#xff08;B&#xff0c;L&#xff09;转换为平面坐标&#xff08;X&#xff0c;Y&#xff09;操作流程示例 2. 大地坐标系下的平面坐标转换&#xff08;X&#xff0c;Y&#xff09;为大地坐标&#xff08;B&#xff0c;L&#xff09;操作示例 3. 6带坐标…

docker专题系列之十六:安装mycat

由于docker镜像仓库中mycat镜像比较少或相对比较旧&#xff0c;因此一般使用手动制作镜像方式安装部署。下文&#xff0c;良哥通过实验&#xff0c;分别介绍两种方式下如何安装部署mycat。 一、手动制作镜像方式 1.创建镜像 #创建工作目录 mkdir /usr/rdc mkdir /usr/rdc/my…

GOLANG进阶:Viper,Mysql,Swagger,Log

GOLANG从浅入深必须学习的一些工具包 1.Viper&#xff1a; Viper 是一个完整的 Go 应用程序配置解决方案&#xff0c;优势就在于开发项目中你不必去操心配置文件的格式而是让你腾出手来专注于项目的开发。其特性如下&#xff1a; 支持 JSON/TOML/YAML/HCL/envfile/Java proper…

【Java-数据结构】指定ArrayList 数组的大小有利于数据扩容和缩短耗时

关键 “因为扩容操作涉及内存申请和数据搬移&#xff0c;是比较耗时的。所以&#xff0c;如果事先能确定需要存储的数据大小&#xff0c;最好在创建 ArrayList 的时候事先指定数据大小。” 如下代码所示&#xff1a; ArrayList<User> users new ArrayList(10000); fo…

LogicFlow 在HTML中的引入与使用

LogicFlow 在HTML中的引入与使用 LogicFlow的引入与使用&#xff0c;相较于BPMNJS相对容易一些&#xff0c;更加灵活一些&#xff0c;但是扩展代码可能写得更多一些。 示例展示 示例代码 github: https://github.com/iotzzh/origin-examples/blob/main/%E6%B5%81%E7%A8%8B%E5%9…

SpringBoot2+Vue2实战(十)权限管理

一、父子菜单实现 新建数据库表 sys_menu sys_role 实体类 Role import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName;import java.io.Serializable;import l…