基于LAB颜色空间的增强型颜色迁移算法
本文算法使用Grok完成所有内容,包含算法改进和代码编写,可大大提升代码编写速度,算法改进速度,提供相关idea,提升效率;
概述
本文档描述了一种基于LAB颜色空间的颜色迁移算法,用于将缩略图D的亮度和色调特性迁移到原图S上。算法在保留原图清晰度的同时,增强对比度和亮度的迁移效果,适用于BGRA32像素格式的图像数据。改进版本解决了原始算法中迁移程度较弱的问题,通过引入对比度增强因子、动态融合因子和非线性调整等技术实现了更强的迁移效果。
效果展示
算法流程
-
输入与预处理
-
输入:
-
原图S:srcData(BGRA32格式),尺寸为width × height,步幅为stride。
-
缩略图D:scaledData(BGRA32格式),尺寸为sWidth × sHeight,步幅为sStride。
-
-
预处理:
-
将原图S和缩略图D的RGB像素转换为LAB颜色空间,分别得到L(亮度)、A(色调a)、B(色调b)通道数据。
-
-
低频与高频分离
-
目标:分离原图S的亮度通道(L)为低频(平滑部分)和高频(细节部分),以保护清晰度。
-
方法:
-
对原图的L通道应用均值滤波(3x3核,半径为1),得到低频部分src_l_low。
-
高频部分通过src_l - src_l_low计算。
-
-
统计特性计算
-
目标:提取原图S和缩略图D的亮度和色调统计信息。
-
方法:
-
对原图的低频L通道(src_l_low)、A通道(src_a)、B通道(src_b)计算均值和标准差。
-
对缩略图的L通道(scaled_l)、A通道(scaled_a)、B通道(scaled_b)计算均值和标准差。
-
-
亮度与色调迁移
-
目标:将缩略图D的亮度和色调特性迁移到原图S,同时增强对比度。
-
方法:
-
低频亮度迁移:
-
对低频L通道应用公式:l_mapped = (l_low - src_l_mean) * (scaled_l_std / src_l_std) * contrast_boost + scaled_l_mean。
-
contrast_boost(默认1.5)为对比度增强因子。
-
-
可选非线性调整:
-
使用tanh函数对l_mapped进行非线性调整(当前禁用,可启用)。
-
-
动态融合:
-
计算标准差比率std_ratio = scaled_l_std / src_l_std。
-
动态融合因子alpha = min(0.9, 0.5 + 0.4 * std_ratio),范围[0.5, 0.9]。
-
融合公式:l_final = alpha * l_mapped + (1 - alpha) * l_orig + detail_weight * l_detail。
-
detail_weight(默认0.5)控制高频细节保留程度。
-
-
色调迁移:
-
对A通道:a = (a - src_a_mean) * (scaled_a_std / src_a_std) + scaled_a_mean。
-
对B通道:b = (b - src_b_mean) * (scaled_b_std / src_b_std) + scaled_b_mean。
-
-
-
输出转换
-
目标:将迁移后的LAB值转换回RGB空间并更新原图。
-
方法:
-
将l_final、a、b转换回RGB,限制值在[0, 255]。
-
更新srcData中的RGB值,保持Alpha通道不变。
-
-
内存清理
-
释放所有动态分配的临时数组。
完整代码实现
#include <stdio.h>
#include <stdlib.h>
#include <math.h>// 辅助函数:将值限制在0-255范围内
unsigned char clamp(float value) {if (value < 0.0f) return 0;if (value > 255.0f) return 255;return (unsigned char)value;
}// RGB转LAB
void rgb_to_lab(unsigned char r, unsigned char g, unsigned char b, float* l, float* a, float* b_out) {float rf = r / 255.0f;float gf = g / 255.0f;float bf = b / 255.0f;rf = (rf > 0.04045f) ? powf((rf + 0.055f) / 1.055f, 2.4f) : rf / 12.92f;gf = (gf > 0.04045f) ? powf((gf + 0.055f) / 1.055f, 2.4f) : gf / 12.92f;bf = (bf > 0.04045f) ? powf((bf + 0.055f) / 1.055f, 2.4f) : bf / 12.92f;float x = rf * 0.4124564f + gf * 0.3575761f + bf * 0.1804375f;float y = rf * 0.2126729f + gf * 0.7151522f + bf * 0.0721750f;float z = rf * 0.0193339f + gf * 0.1191920f + bf * 0.9503041f;x /= 0.95047f;z /= 1.08883f;x = (x > 0.008856f) ? powf(x, 1.0f / 3.0f) : (7.787f * x + 16.0f / 116.0f);y = (y > 0.008856f) ? powf(y, 1.0f / 3.0f) : (7.787f * y + 16.0f / 116.0f);z = (z > 0.008856f) ? powf(z, 1.0f / 3.0f) : (7.787f * z + 16.0f / 116.0f);*l = (116.0f * y) - 16.0f;*a = 500.0f * (x - y);*b_out = 200.0f * (y - z);
}// LAB转RGB
void lab_to_rgb(float l, float a, float b, unsigned char* r, unsigned char* g, unsigned char* b_out) {float y = (l + 16.0f) / 116.0f;float x = a / 500.0f + y;float z = y - b / 200.0f;x = 0.95047f * ((x * x * x > 0.008856f) ? x * x * x : (x - 16.0f / 116.0f) / 7.787f);y = 1.00000f * ((y * y * y > 0.008856f) ? y * y * y : (y - 16.0f / 116.0f) / 7.787f);z = 1.08883f * ((z * z * z > 0.008856f) ? z * z * z : (z - 16.0f / 116.0f) / 7.787f);float rf = x * 3.2404542f + y * -1.5371385f + z * -0.4985314f;float gf = x * -0.9692660f + y * 1.8760108f + z * 0.0415560f;float bf = x * 0.0556434f + y * -0.2040259f + z * 1.0572252f;rf = (rf > 0.0031308f) ? (1.055f * powf(rf, 1.0f / 2.4f) - 0.055f) : 12.92f * rf;gf = (gf > 0.0031308f) ? (1.055f * powf(gf, 1.0f / 2.4f) - 0.055f) : 12.92f * gf;bf = (bf > 0.0031308f) ? (1.055f * powf(bf, 1.0f / 2.4f) - 0.055f) : 12.92f * bf;*r = clamp(rf * 255.0f);*g = clamp(gf * 255.0f);*b_out = clamp(bf * 255.0f);
}// 计算均值和标准差
void calculate_stats(float* data, int size, float* mean, float* std_dev) {*mean = 0.0f;for (int i = 0; i < size; i++) {*mean += data[i];}*mean /= size;*std_dev = 0.0f;for (int i = 0; i < size; i++) {float diff = data[i] - *mean;*std_dev += diff * diff;}*std_dev = sqrtf(*std_dev / size);
}// 简单均值滤波(低频提取)
void mean_filter(float* src, float* dst, int width, int height, int radius) {for (int y = 0; y < height; y++) {for (int x = 0; x < width; x++) {float sum = 0.0f;int count = 0;for (int dy = -radius; dy <= radius; dy++) {for (int dx = -radius; dx <= radius; dx++) {int ny = y + dy;int nx = x + dx;if (nx >= 0 && nx < width && ny >= 0 && ny < height) {sum += src[ny * width + nx];count++;}}}dst[y * width + x] = sum / count;}}
}// 非线性调整(可选Sigmoid函数)
float nonlinear_adjust(float value, float mean, float boost) {float normalized = (value - mean) / 50.0f; // 归一化到[-1, 1]范围return mean + 50.0f * (boost * tanhf(normalized)); // 使用tanh增强对比度
}// 颜色迁移主函数
void lightTransfer_color(unsigned char* srcData, int width, int height, int stride,unsigned char* scaledData, int sWidth, int sHeight, int sStride) {// 分配内存float* src_l = (float*)malloc(width * height * sizeof(float));float* src_a = (float*)malloc(width * height * sizeof(float));float* src_b = (float*)malloc(width * height * sizeof(float));float* src_l_low = (float*)malloc(width * height * sizeof(float)); // 低频部分float* scaled_l = (float*)malloc(sWidth * sHeight * sizeof(float));float* scaled_a = (float*)malloc(sWidth * sHeight * sizeof(float));float* scaled_b = (float*)malloc(sWidth * sHeight * sizeof(float));// 转换到LAB空间for (int y = 0; y < height; y++) {for (int x = 0; x < width; x++) {int index = y * stride + x * 4;float l, a, b;rgb_to_lab(srcData[index + 2], srcData[index + 1], srcData[index], &l, &a, &b);src_l[y * width + x] = l;src_a[y * width + x] = a;src_b[y * width + x] = b;}}for (int y = 0; y < sHeight; y++) {for (int x = 0; x < sWidth; x++) {int index = y * sStride + x * 4;float l, a, b;rgb_to_lab(scaledData[index + 2], srcData[index + 1], scaledData[index], &l, &a, &b);scaled_l[y * sWidth + x] = l;scaled_a[y * sWidth + x] = a;scaled_b[y * sWidth + x] = b;}}// 分离原图L通道的低频部分mean_filter(src_l, src_l_low, width, height, 2); // 使用3x3滤波器// 计算统计信息float src_l_mean, src_l_std, scaled_l_mean, scaled_l_std;float src_a_mean, src_a_std, scaled_a_mean, scaled_a_std;float src_b_mean, src_b_std, scaled_b_mean, scaled_b_std;calculate_stats(src_l_low, width * height, &src_l_mean, &src_l_std);calculate_stats(scaled_l, sWidth * sHeight, &scaled_l_mean, &scaled_l_std);calculate_stats(src_a, width * height, &src_a_mean, &src_a_std);calculate_stats(scaled_a, sWidth * sHeight, &scaled_a_mean, &scaled_a_std);calculate_stats(src_b, width * height, &src_b_mean, &src_b_std);calculate_stats(scaled_b, sWidth * sHeight, &scaled_b_mean, &scaled_b_std);// 参数设置float contrast_boost = 1.5f; // 对比度增强因子float detail_weight = 0.5f; // 细节保留权重(0-1,值越小迁移越强)float std_ratio = scaled_l_std / (src_l_std + 1e-6f); // 标准差比率float alpha = fminf(0.9f, 0.5f + 0.4f * std_ratio); // 动态融合因子,范围[0.5, 0.9]// 迁移并增强对比度for (int y = 0; y < height; y++) {for (int x = 0; x < width; x++) {int idx = y * width + x;float l_low = src_l_low[idx];float l_orig = src_l[idx];float a = src_a[idx];float b = src_b[idx];// 低频部分迁移并增强对比度float l_mapped = (l_low - src_l_mean) * (scaled_l_std / src_l_std) * contrast_boost + scaled_l_mean;// 可选非线性调整(取消注释以启用)// l_mapped = nonlinear_adjust(l_mapped, scaled_l_mean, contrast_boost);// 高频细节float l_detail = l_orig - l_low;// 融合并控制细节强度float l_final = alpha * l_mapped + (1.0f - alpha) * l_orig + detail_weight * l_detail;// 限制L通道范围(LAB中L范围为0-100)l_final = fmaxf(0.0f, fminf(100.0f, l_final));// 色调迁移a = (a - src_a_mean) * (scaled_a_std / src_a_std) + scaled_a_mean;b = (b - src_b_mean) * (scaled_b_std / src_b_std) + scaled_b_mean;// 转换回RGBunsigned char r, g, b_out;lab_to_rgb(l_final, a, b, &r, &g, &b_out);int index = y * stride + x * 4;srcData[index + 2] = r;srcData[index + 1] = g;srcData[index] = b_out;}}// 释放内存free(src_l);free(src_a);free(src_b);free(src_l_low);free(scaled_l);free(scaled_a);free(scaled_b);
}// 测试代码
int main() {unsigned char srcData[] = {50, 100, 150, 255, 60, 120, 180, 255};unsigned char scaledData[] = {100, 200, 255, 255, 120, 240, 255, 255};int width = 2, height = 1, stride = 8;int sWidth = 2, sHeight = 1, sStride = 8;lightTransfer_color(srcData, width, height, stride, scaledData, sWidth, sHeight, sStride);printf("Result: ");for (int i = 0; i < width * height * 4; i++) {printf("%d ", srcData[i]);}printf("\n");return 0;
}
参数说明
-
contrast_boost(默认1.5):
-
控制对比度迁移的增强程度,建议范围[1.0, 2.0]。
-
-
detail_weight(默认0.5):
-
控制高频细节的保留强度,范围[0, 1],值越小迁移效果越强。
-
-
alpha(动态计算,范围[0.5, 0.9]):
-
根据标准差比率动态调整迁移与原图的融合比例。
-
-
radius(默认2):
-
均值滤波的核大小,影响低频与高频分离的效果。
-
性能与优化建议
-
时间复杂度:O(width × height × k² + sWidth × sHeight),其中k为滤波核大小(当前为3)。
-
空间复杂度:O(width × height + sWidth × sHeight),用于存储临时LAB数据。
-
优化方向:
-
使用更高效的滤波方法(如高斯滤波或FFT)。
-
引入多线程或SIMD指令加速循环计算。
-
对于大图像,可分块处理以减少内存占用。
-
注意事项
-
输入假设:
-
原图S和缩略图D应具有相似的几何结构,仅存在亮度和色调差异。
-
-
边界处理:
-
L通道值已限制在[0, 100],RGB值限制在[0, 255],避免溢出。
-
-
非线性调整:
-
当前nonlinear_adjust被注释,可根据需求启用以处理极端亮度分布。
-
算法创新点
1. 低频与高频分离的亮度迁移
-
创新描述:
-
算法通过均值滤波将原图的亮度通道(L)分解为低频(平滑部分)和高频(细节部分),仅对低频部分应用亮度迁移,高频细节则以可控权重叠加回结果。
-
-
传统方法的不足:
-
传统方法(如全局均值和标准差匹配)直接对整个亮度通道进行调整,容易丢失边缘和纹理细节,导致清晰度下降。
-
-
创新优势:
-
通过分离低频和高频,算法在迁移缩略图D的亮度特性时,能有效保留原图S的高频细节(如边缘和纹理),从而平衡迁移效果与图像清晰度。
-
-
实现细节:
-
使用mean_filter函数提取低频部分,高频部分通过l_orig - l_low计算,最终融合时通过detail_weight控制细节保留程度。
-
2. 动态融合因子的引入
-
创新描述:
-
算法根据原图S和缩略图D的亮度标准差比率(std_ratio = scaled_l_std / src_l_std)动态计算融合因子alpha,范围限制在[0.5, 0.9]。
-
-
传统方法的不足:
-
传统方法通常使用固定的融合权重(如0.5或用户指定值),无法自适应地反映两张图像的对比度差异,导致迁移效果可能过弱或过强。
-
-
创新优势:
-
动态alpha根据缩略图D的对比度特性自动调整迁移强度,当D的对比度远高于S时,alpha增大以增强迁移效果;反之则减弱,确保结果自然且贴近目标图像。
-
-
实现细节:
-
alpha = fminf(0.9f, 0.5f + 0.4f * std_ratio),通过标准差比率自适应调节。
-
3. 对比度增强因子的可调控制
-
创新描述:
-
在亮度迁移过程中引入对比度增强因子contrast_boost(默认1.5),对标准差缩放比例进行放大,以增强迁移后的对比度效果。
-
-
传统方法的不足:
-
传统统计匹配方法仅基于原始标准差比例(如scaled_l_std / src_l_std),无法充分放大目标图像的对比度特性,尤其是当缩略图D具有显著对比度时。
-
-
创新优势:
-
通过contrast_boost,算法能够更强地反映缩略图D的对比度特征,用户可根据需求调整该参数(建议范围1.0-2.0),实现灵活的迁移强度控制。
-
-
实现细节:
-
迁移公式为l_mapped = (l_low - src_l_mean) * (scaled_l_std / src_l_std) * contrast_boost + scaled_l_mean。
-
4. 细节保留权重的灵活性
-
创新描述:
-
算法引入detail_weight参数(默认0.5,范围[0, 1]),允许用户控制高频细节的叠加强度,从而在迁移效果和细节保留之间找到最佳平衡。
-
-
传统方法的不足:
-
传统方法要么完全忽略细节保留,要么通过固定的方式叠加细节,缺乏对细节保留程度的精细控制。
-
-
创新优势:
-
detail_weight提供了一个显式的调节机制,值越小迁移效果越强,值越大细节保留越完整,使得算法适用于不同场景(如需要强迁移的艺术效果或需要高清晰度的自然图像)。
-
-
实现细节:
-
融合公式中,细节项为detail_weight * l_detail,用户可根据需求调整。
-
5. 可选的非线性亮度调整
-
创新描述:
-
算法提供了一个可选的非线性调整函数nonlinear_adjust,基于tanh函数对迁移后的亮度值进行增强,特别适用于极端亮度分布的图像。
-
-
传统方法的不足:
-
传统线性统计匹配方法无法很好地处理非线性亮度变化(如暗部细节压缩或亮部过曝),导致迁移效果不够自然。
-
-
创新优势:
-
非线性调整能够更好地模拟缩略图D的亮度分布特性,增强暗部和亮部的对比度,同时避免线性方法可能引入的平坦感。用户可根据需要启用此功能。
-
-
实现细节:
-
函数定义为mean + 50.0f * (boost * tanhf(normalized)),当前被注释,可取消注释启用。
-
创新点总结
与传统方法的对比
-
传统方法(如全局统计匹配):
-
仅基于均值和标准差进行全局调整,忽略局部细节和非线性特性,迁移效果单一且易丢失清晰度。
-
-
本算法:
-
通过低频高频分离、动态融合、对比度增强和非线性调整,实现了更强的迁移效果,同时保留了原图的细节特性,适用于更广泛的场景。
-
应用场景
-
图像风格迁移:将缩略图的亮度和色调风格应用到原图,保留细节。
-
照片增强:增强原图的对比度和亮度,同时保持自然清晰度。
-
艺术效果处理:通过调整参数实现艺术化的亮度迁移。
相关文章:
基于LAB颜色空间的增强型颜色迁移算法
本文算法使用Grok完成所有内容,包含算法改进和代码编写,可大大提升代码编写速度,算法改进速度,提供相关idea,提升效率; 概述 本文档描述了一种基于LAB颜色空间的颜色迁移算法,用于将缩略图D的…...
复合材料高置信度 DIC 测量与高级实验技术研讨会邀请函
邀请函 2025年5月8日 上海 中国复合材料学会官网会议通知 您可以点击上方蓝字跳转官网查看官网信息 主办单位: 中国复合材料学会 协办单位: 研索仪器科技(上海)有限公司 数字图像相关技术(Digital Image Correla…...
解决docker部署MySQL的max_allowed_packet 限制问题
报错 Error querying database. Cause: com.mysql.cj.jdbc.exceptions.PacketTooBigException: Packet for query is too large (2,471 > 2,048). You can change this value on the server by setting the max_allowed_packet variable. ### The error may exist in file …...
【XR手柄交互】Unity 中使用 InputActions 实现手柄控制详解(基于 OpenXR + Unity新输入系统(Input Actions))
摘要: 本文主要介绍如何使用 Input Actions(Unity 新输入系统) OpenXR 来实现 VR手柄控制(监听ABXY按钮、摇杆、抓握等操作)。 🎮 Unity 中使用 InputActions 实现手柄控制详解(基于 OpenXR 新…...
C++:继承机制详解
目录 一.继承的概念及定义 一).继承的概念 二).继承定义 1.定义格式 2.继承类型 3.继承类模板 二.基类和派生类间的转换 三.继承中的作用域 四.派生类的默认成员函数 一).4个常见默认成员函数 二).不可被继承的类 五…...
自然语言处理+知识图谱:智能导诊的“大脑”是如何工作的?
智能导诊系统定义与作用 智能导诊系统是一种基于人工智能技术的医疗辅助工具,旨在提高医疗服务效率、改善患者就医体验、降低医院运营成本,通过自然语言处理技术,智能导诊系统能够自动回答患者的常见问题,帮助患者快速了解自己的…...
论文阅读笔记——ZeroGrasp: Zero-Shot Shape Reconstruction Enabled Robotic Grasping
ZeroGrasp 论文 多视角重建计算大、配置复杂,本文将稀疏体素重建(快且效果好)引入机器人抓取且只考虑单目重建,通过利用基于物理的接触约束与碰撞检测(这对精确抓取至关重要),提升三维重建质量将…...
Qt 调试信息重定向到本地文件
1、在Qt软件开发过程中,我们经常使用qDebug()输出一些调试信息在QtCreator终端上。 但若将软件编译、生成、打包为一个完整的可运行的程序并安装在系统中后,系统中没有QtCreator和编译环境,那应用程序出现问题,如何输出信息排查…...
Android Studio开发中Application和Activity生命周期详解
文章目录 Application生命周期Application生命周期概述Application关键回调方法onCreate()onConfigurationChanged()onLowMemory()onTrimMemory()onTerminate() Application生命周期管理最佳实践 Activity生命周期Activity生命周期概述Activity生命周期回调方法onCreate()onSta…...
vite+vue2+elementui构建之 package.json
webpack版本太低,构建依赖太多,头大。 各种查阅资料,弄了一份直通构建vite构建elementUi核心文件, 构建基于开源若依vue2vue3版本改造,感谢开源,感谢若依。 vitevue2elementui构建之 vite.config.js-CSD…...
安全编排自动化与响应(SOAR):从事件响应到智能编排的技术实践
安全编排自动化与响应(SOAR):从事件响应到智能编排的技术实践 在网络安全威胁复杂度指数级增长的今天,人工处理安全事件的效率已难以应对高频攻击(如日均万级的恶意IP扫描)。安全编排自动化与响应…...
《Keras 3 :使用 TFServing 提供 TensorFlow 模型》
《Keras 3 :使用 TFServing 提供 TensorFlow 模型》 作者:Dimitre Oliveira 创建日期:2023/01/02 最后修改时间:2023/01/02 描述:如何使用 TensorFlow Serving 为 TensorFlow 模型提供服务。 (i) 此示例使用 Keras 3 在 Colab 中查看 GitHub 源 介绍 构建机器学习模…...
深入理解C++ 中的list容器
目录 一、引言 二、list的基本介绍 2.1 底层结构 2.2 特性 三、list的使用 3.1 构造函数 3.2 迭代器的使用 3.3 容量相关操作 3.4 元素访问相关操作 3.5 修改器操作 3.6 迭代器失效问题 四、list的模拟实现 4.1 节点定义 4.2 迭代器实现 4.3 list类实现 五、lis…...
附赠二张图,阐述我对大模型的生态发展、技术架构认识。
文章精炼,用两张图说明大模型发展业态方向,以及大模型主体技术架构。(目前还需要进一步验证我的Thought && ideas,等待机会吧.........) 图一:探究大模型三个层次应用方向,浅层次入门简…...
Java实现加密(七)国密SM2算法的签名和验签(附商用密码检测相关国家标准/国密标准下载)
目录 一、国密标准中,关于SM2签名验签的定义二、SM2签名和验签的实现原理1. 前置知识2. 签名生成过程3. 验签过程4. 数学正确性证明5. 安全性与注意事项 三、带userId、不带userId的区别1. 核心区别2.算法区别(1) 哈希计算过程(2) 签名验签流程 四、Java代码实现1. …...
贪心算法~~
目录 一、理论基础 二、题目练习 (1)455. 分发饼干 (2)53. 最大子数组和 - 力扣 (3)122. 买卖股票的最佳时机 II - 力扣(LeetCode) (4)860. 柠檬水找零…...
XYNU2024信安杯-REVERSE(复现)
前言 记录记录 1.Can_you_find_me? 签到题,秒了 2.ea_re 快速定位 int __cdecl main_0(int argc, const char **argv, const char **envp) {int v4; // [esp0h] [ebp-1A0h]const char **v5; // [esp4h] [ebp-19Ch]const char **v6; // [esp8h] [ebp-198h]char v7;…...
NLP系列【自然语言处理的深度学习模型综述】
自然语言处理的深度学习模型 摘要传统自然语言处理模型(略 不作重点)神经网络自然语言处理模型经典神经网络CNN网络模型Word2Vec模型RNN模型GPT网络模型BERT网络模型 BERT变体模型提升模型性能模型压缩 摘要 在自然语言处理任务方面,依据语料…...
【差分隐私】basic primitive的含义
在差分隐私领域,“basic primitive”一词具有特定的技术含义,需从单词本义及学科背景两个层面解析: 一、单词本义解析 “Primitive”在计算机科学中通常指代基础构建单元或核心组件,例如编程语言中的基本数据类型(如整…...
数字浪潮下的算力担当:GPU 服务器的多元应用、核心价值
在当今数据洪流和信息爆炸的时代,算力已成为衡量国家、行业乃至企业发展水平的关键指标。而算力服务器,特别是 GPU 服务器,作为算力的核心载体,正以其卓越性能深刻改变着世界的运行逻辑与模式。从数据处理到云计算,从人…...
【Echarts】使用echarts绘制多个不同类型的中国地图
一、需求 在同一页面上绘制多个不同类型的中国地图,如果是在同一页面上绘制多个同一种类型的地图可以直接引用一个china.js文件,设置两个独立的div分别用于放置两个地图,并实例化配置相关参数即可,但是如果在同一个页面上绘制多个…...
WEB漏洞-XSS跨站原理分类
本文主要内容 原理 XSS漏洞产生原理? XSS漏洞危害影响? 分类 反射型、存储型、DOM型 手法 XSS平台使用 XSS工具使用 XSS结合其他漏洞 靶场搭建 pikachu 靶场搭建(完整版)-CSDN博客https://blog.csdn.net…...
PR第二课--混剪
1.音乐打点 1.1 手动打点 按钮(如图),或者,快捷键M(如果在已有打点处,再次按M键会进入对标记点的设置界面,如下下图) 1.2 插件打点 一段音乐中,有明显的鼓点时,可以使用打点插件,快捷打点;如果鼓点不明显的话,最好还是手动打点,用插件打点会打出大量的标记点,…...
Kafka和flume整合
需求1:利用flume监控某目录中新生成的文件,将监控到的变更数据发送给kafka,kafka将收到的数据打印到控制台: 在flume/conf下添加.conf文件, vi flume-kafka.conf # 定义 Agent 组件 a1.sourcesr1 a1.sinksk1 a1.c…...
Linux 内核网络协议栈中 inet_stream_ops 与 tcp_prot 的深度解析
在 Linux 内核网络协议栈中,TCP 协议的实现依赖于多个关键结构体的协作。其中,inet_stream_ops 和 tcp_prot 是两个核心结构体,它们分别属于不同的层次,共同完成从用户态系统调用到底层协议处理的完整链路。本文将从功能定位、协作关系、代码示例及设计哲学等方面,深入分析…...
flume整合kafka
需求一: 启动flume 启动kafka消费者,验证数据写入成功 新增测试数据 需求二: 启动Kafka生产者 启动Flume 在生产者中写入数据...
EasyRTC音视频实时通话嵌入式SDK,打造社交娱乐低延迟实时互动的新体验
一、方案背景 在数字化时代,社交娱乐已经成为人们生活中不可或缺的一部分。随着移动互联网和智能设备的普及,用户对实时互动的需求越来越高。EasyRTC作为一款基于WebRTC技术的实时音视频通信解决方案,凭借其低延迟、高稳定性和跨平台兼容性&…...
制作一款打飞机游戏21:自定义工具
关于如何在Pico 8中创建我们自己的编辑器。 外部编辑器的需求 首先,我想谈谈为什么我们需要外部编辑器。外部编辑器通常用于编辑游戏中的数据。例如,一个游戏卡或程序通常包含一些代码,但也会包含数据,比如静态信息,…...
面向高性能运动控制的MCU:架构创新、算法优化与应用分析
摘要:现代工业自动化、汽车电子以及商业航天等领域对运动控制MCU的性能要求不断提升。本文以国科安芯的MCU芯片AS32A601为例,从架构创新、算法优化到实际应用案例,全方位展示其在高性能运动控制领域的优势与潜力。该MCU以32位RISC-V指令集为基…...
LWIP中两种重要的数据结构pbuf和pcb详细介绍
LWIP(Lightweight IP)是为嵌入式系统设计的轻量级TCP/IP协议栈。pbuf(Packet Buffer)和PCB(Protocol Control Block)是LwIP中两个核心数据结构,分别负责数据包管理和协议状态维护。 1. pbuf&…...
embedding_model模型通没有自带有归一化层该怎么处理?
embedding_model 是什么: 嵌入式模型(Embedding)是一种广泛应用于自然语言处理(NLP)和计算机视觉(CV)等领域的机器学习模型,它可以将高维度的数据转化为低维度的嵌入空间࿰…...
【蓝桥杯选拔赛真题104】Scratch回文数 第十五届蓝桥杯scratch图形化编程 少儿编程创意编程选拔赛真题解析
目录 scratch回文数 一、题目要求 1、准备工作 2、功能实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 四、程序编写 五、考点分析 六、推荐资料 1、scratch资料 2、python资料 3、C++资料 scratch回文数 第十五届青少年蓝桥杯scratch编…...
1.2-1.3考研408计算机组成原理第一章 计算机系统概述
计算机组成原理第一章 计算机系统概述 一、计算机的层次结构 1.1 计算机系统组成 计算机系统由硬件系统和软件系统两大部分构成: 硬件系统:包括运算器、控制器、存储器、输入设备和输出设备五大核心部件(冯诺依曼体系结构)。软…...
【QQmusic自定义控件实现音乐播放器核心交互逻辑】第三章
🌹 作者: 云小逸 🤟 个人主页: 云小逸的主页 🤟 motto: 要敢于一个人默默的面对自己,强大自己才是核心。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前,其次就是现在&…...
基于图扑 HT 实现的智慧展馆数字孪生应用
在当今数字化时代,智慧展览馆作为传统展览场所的创新升级形态,借助前沿科技与现代化管理理念,实现了全方位的数字化、智能化转型。图扑软件凭借其自主研发的 HT 技术在智慧展馆领域取得了卓越成果,为城市基础设施数字化应用带来了…...
从线性到非线性:简单聊聊神经网络的常见三大激活函数
大家好,我是沛哥儿,我们今天一起来学习下神经网络的三个常用的激活函数。 引言:什么是激活函数 激活函数是神经网络中非常重要的组成部分,它引入了非线性因素,使得神经网络能够学习和表示复杂的函数关系。 在神经网络…...
重生之--js原生甘特图实现
需求: 一个树形结构,根据子节点的时间范围显示显示进度 ,不同的时间范围对应不同的颜色 数据类型大概是这个样子的 甘特图 dom部分 首先要计算所有节点的 最大时间和最小时间 然后再计算每个甘特图的宽度 再计算他的偏移量 再计算颜色...
pnpm monoreop 打包时 node_modules 内部包 typescript 不能推导出类型报错
报错信息如下: ../../packages/antdv/components/pro-table/src/form-render.vue:405:1 - error TS2742: The inferred type of default cannot be named without a reference to .pnpm/scroll-into-view-if-needed2.2.31/node_modules/scroll-into-view-if-needed…...
告别默认配置!Xray自定义POC开发指南
文章涉及操作均为测试环境,未授权时切勿对真实业务系统进行测试! 下载与解压 官网地址: Xray GitHub Releases 根据系统选择对应版本: Windows:xray_windows_amd64.exe.zipLinux:xray_linux_amd64.zipmacOS:xray_darwin_amd64.zip解压后得到可执行文件(如 xray_linux_…...
websheet之 自定义函数
在线代码 {.is-success} 一、自定义函数约定 必须遵守本控件的自定函数约定才可以正常使用。 {.is-warning} 约定如下: 自定义类名称与函数名称一致。(强制)该类方法名称与函数名称一致,该方法是函数的入口。(强制&am…...
Jenkins Pipeline 构建 CI/CD 流程
文章目录 jenkins 安装jenkins 配置jenkins 快速上手在 jenkins 中创建一个新的 Pipeline 作业配置Pipeline运行 Pipeline 作业 Pipeline概述Declarative PipelineScripted Pipeline jenkins 安装 安装环境: Linux CentOS 10:Linux CentOS9安装配置Jav…...
电脑技巧:路由器内部元器件介绍
目录 1. 处理器(CPU) 2. 内存(RAM) 3. 固态存储(Flash Memory) 4. 网络接口卡(NIC) 5. 电源模块 6. 散热系统 7. 无线天线 结语 路由器是我们日常上网的重要设备,今天我们就来深入了解路由器内部的各个元器件,了解它们是如何协同工作,一起来看看吧。 1. 处理器(CPU…...
ArrayUtils:数组操作的“变形金刚“——让你的数组七十二变
各位数组操控师们好!今天给大家带来的是Apache Commons Lang3中的ArrayUtils工具类。这个工具就像数组界的"孙悟空",能让你的数组随心所欲地变大、变小、变长、变短,再也不用对着原生数组的"死板"叹气了! 一…...
电脑温度怎么看 查看CPU温度的方法
监测电脑温度对于保持硬件健康非常重要,特别是在进行高强度运算、游戏或超频等操作时。过高的温度可能导致硬件性能下降,甚至损坏。本篇文章将介绍查看电脑温度的4种方法。 一、使用Windows内置工具查看CPU温度 Windows系统本身并不直接提供查看CPU温度…...
【合新通信】---浸没式液冷光模块化学兼容性测试方法
一、测试目的与核心挑战 测试目标 验证冷媒(氟化液、矿物油等)与光模块材料的化学稳定性,确保长期浸没环境下无腐蚀、溶胀或性能衰减。关键风险点:密封材料(如硅胶、环氧树脂)的溶解或老化;金…...
shell 循环
shell 循环while语句,shell循环until语句在上一篇shell流程控制 1.shell循环until语句 until 条件 #当后面的条件表达式为假的时候的才循环,为真的时候就停止了 do 循环体 done [root@linux-server script]# cat until.sh (1) #!/bin/bash x=1 until [ $x -ge 10 ] 大于…...
【产品经理】常见的交互说明撰写方法
在产品原型设计中,交互说明是确保开发团队准确理解设计意图的关键文档。以下是常见的交互说明撰写方法及其应用场景,帮助您系统化地传达交互逻辑: 文字描述法 方法:用自然语言详细描述操作流程、反馈及规则。 适用场景ÿ…...
使用kubeadmin 部署k8s集群
成功搭建一个 Kubernetes 1.28.2 集群,包含以下组件和状态: 集群拓扑 1 个 Master 节点 IP:10.1.1.100 角色:control-plane 2 个 Worker 节点 Node2:10.1.1.101 Node3:10.1.1.102 核心组件状态 所有节点通过 kubectl get nodes 显示为 Ready。 核心 Pod(如 etc…...
二项式分布html实验
二项式分布html实验 本文将带你一步步搭建一个纯前端的二项分布 Monte-Carlo 模拟器。 只要一个 HTML 文件,打开就能运行: 动态输入试验次数 n、成功概率 p 与重复次数 m点击按钮立刻得到「模拟频数 vs 理论频数」柱状图随着 m 增大,两组柱状…...
[基础] Windows PCIe设备驱动框架与开发实践深度解析
Windows PCIe设备驱动框架与开发实践深度解析 1. PCIe设备驱动技术背景 PCI Express(Peripheral Component Interrupt Express)作为现代计算机系统的核心互连标准,其驱动程序开发涉及复杂的内核模式编程。Windows系统通过模块化的驱动架构支…...