当前位置: 首页 > article >正文

基于LAB颜色空间的增强型颜色迁移算法

本文算法使用Grok完成所有内容,包含算法改进和代码编写,可大大提升代码编写速度,算法改进速度,提供相关idea,提升效率;

概述

本文档描述了一种基于LAB颜色空间的颜色迁移算法,用于将缩略图D的亮度和色调特性迁移到原图S上。算法在保留原图清晰度的同时,增强对比度和亮度的迁移效果,适用于BGRA32像素格式的图像数据。改进版本解决了原始算法中迁移程度较弱的问题,通过引入对比度增强因子、动态融合因子和非线性调整等技术实现了更强的迁移效果。

效果展示

算法流程

  1. 输入与预处理

  • 输入

    • 原图S:srcData(BGRA32格式),尺寸为width × height,步幅为stride。

    • 缩略图D:scaledData(BGRA32格式),尺寸为sWidth × sHeight,步幅为sStride。

  • 预处理

    • 将原图S和缩略图D的RGB像素转换为LAB颜色空间,分别得到L(亮度)、A(色调a)、B(色调b)通道数据。

  1. 低频与高频分离

  • 目标:分离原图S的亮度通道(L)为低频(平滑部分)和高频(细节部分),以保护清晰度。

  • 方法

    • 对原图的L通道应用均值滤波(3x3核,半径为1),得到低频部分src_l_low。

    • 高频部分通过src_l - src_l_low计算。

  1. 统计特性计算

  • 目标:提取原图S和缩略图D的亮度和色调统计信息。

  • 方法

    • 对原图的低频L通道(src_l_low)、A通道(src_a)、B通道(src_b)计算均值和标准差。

    • 对缩略图的L通道(scaled_l)、A通道(scaled_a)、B通道(scaled_b)计算均值和标准差。

  1. 亮度与色调迁移

  • 目标:将缩略图D的亮度和色调特性迁移到原图S,同时增强对比度。

  • 方法

    • 低频亮度迁移

      1. 对低频L通道应用公式:l_mapped = (l_low - src_l_mean) * (scaled_l_std / src_l_std) * contrast_boost + scaled_l_mean。

      2. contrast_boost(默认1.5)为对比度增强因子。

    • 可选非线性调整

      1. 使用tanh函数对l_mapped进行非线性调整(当前禁用,可启用)。

    • 动态融合

      1. 计算标准差比率std_ratio = scaled_l_std / src_l_std。

      2. 动态融合因子alpha = min(0.9, 0.5 + 0.4 * std_ratio),范围[0.5, 0.9]。

      3. 融合公式:l_final = alpha * l_mapped + (1 - alpha) * l_orig + detail_weight * l_detail。

      4. detail_weight(默认0.5)控制高频细节保留程度。

    • 色调迁移

      1. 对A通道:a = (a - src_a_mean) * (scaled_a_std / src_a_std) + scaled_a_mean。

      2. 对B通道:b = (b - src_b_mean) * (scaled_b_std / src_b_std) + scaled_b_mean。

  1. 输出转换

  • 目标:将迁移后的LAB值转换回RGB空间并更新原图。

  • 方法

    • 将l_final、a、b转换回RGB,限制值在[0, 255]。

    • 更新srcData中的RGB值,保持Alpha通道不变。

  1. 内存清理

  • 释放所有动态分配的临时数组。

完整代码实现

#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;
}

参数说明

  1. contrast_boost(默认1.5):

    1. 控制对比度迁移的增强程度,建议范围[1.0, 2.0]。

  2. detail_weight(默认0.5):

    1. 控制高频细节的保留强度,范围[0, 1],值越小迁移效果越强。

  3. alpha(动态计算,范围[0.5, 0.9]):

    1. 根据标准差比率动态调整迁移与原图的融合比例。

  4. radius(默认2):

    1. 均值滤波的核大小,影响低频与高频分离的效果。


性能与优化建议

  • 时间复杂度:O(width × height × k² + sWidth × sHeight),其中k为滤波核大小(当前为3)。

  • 空间复杂度:O(width × height + sWidth × sHeight),用于存储临时LAB数据。

  • 优化方向

    • 使用更高效的滤波方法(如高斯滤波或FFT)。

    • 引入多线程或SIMD指令加速循环计算。

    • 对于大图像,可分块处理以减少内存占用。


注意事项

  1. 输入假设

    1. 原图S和缩略图D应具有相似的几何结构,仅存在亮度和色调差异。

  2. 边界处理

    1. L通道值已限制在[0, 100],RGB值限制在[0, 255],避免溢出。

  3. 非线性调整

    1. 当前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完成所有内容&#xff0c;包含算法改进和代码编写&#xff0c;可大大提升代码编写速度&#xff0c;算法改进速度&#xff0c;提供相关idea&#xff0c;提升效率&#xff1b; 概述 本文档描述了一种基于LAB颜色空间的颜色迁移算法&#xff0c;用于将缩略图D的…...

基于SIMMECHANICS的单自由度磁悬浮隔振器PID控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 单自由度磁悬浮减振器工作原理简介 4.2 SIMMECHANICS工具箱 5.完整工程文件 1.课题概述 基于SIMMECHANICS的单自由度磁悬浮隔振器PID控制系统simulink建模与仿真。其中&#xff0c;SIMMECHANICS是M…...

河北省大数据应用创新大赛样题

** 河北省大数据应用创新大赛样题 ** 1. 在Linux下安装Java并搭建完全分布式Hadoop集群。在Linux终端执行命令“initnetwork”&#xff0c;或双击桌面上名称为“初始化网络”的图标&#xff0c;初始化实训平台网络。 【数据获取】 使用wget命令获取JDK安装包&#xff1a; “w…...

RabbitMQ 的专业术语

术语定义示例/说明生产者&#xff08;Producer&#xff09;发送消息到 RabbitMQ 的客户端应用程序。日志系统将错误信息发送到 RabbitMQ。消费者&#xff08;Consumer&#xff09;从 RabbitMQ 队列中接收并处理消息的客户端应用程序。一个订单处理服务从队列中读取消息并更新数…...

【教程】安装 iterm2 打造漂亮且高性能的 mac 终端

【教程】安装 iterm2 打造漂亮且高性能的 mac 终端_mac 安装iterm2-CSDN博客 全面解析&#xff1a;Github网站无法访问的解决方法! 安装myzh 参考文章&#xff1a;https://blog.csdn.net/qq_44741467/article/details/135727124 下载地址&#xff1a;GitCode - 全球开发者的开源…...

redis特性及应用场景

文章目录 什么是redis&#xff1f;热库redis作为热库的特性redis适用场景 什么是redis&#xff1f; redis在系统架构中的位置就是冷热分离架构的热数据库位置&#xff0c; redis就是热库&#xff0c; 我们一般说缓存数据库。 其他的像MySQL、SQL Server这种关系数据库、MongoDB…...

算法 | 鲸鱼优化算法(WOA)原理,公式,应用,算法改进研究综述,完整matlab代码

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 鲸鱼优化算法 一、原理与公式二、应用领域三、算法改进研究四、完整MAT…...

前端面试常见部分问题,及高阶部分问题

面试中也极有可能让你徒手写代码,无聊的面试问题o( ̄︶ ̄)o 一、HTML/CSS 基础与进阶 常见问题 什么是语义化标签?有哪些常用语义化标签? 答案:语义化标签是指具有明确含义的 HTML 标签,如 <header>、<footer>、<article>、<section> 等。它们有…...

C++初登门槛

多态 一、概念 多态是指不同对象对同一消息产生不同响应的行为。例如&#xff0c;蓝牙、4G、Wi-Fi 对“发送数据”指令有不同的具体实现。 二、核心理解 本质&#xff1a;通过基类指针或引用操作子类对象&#xff0c;实现运行时动态绑定。 表现形式&#xff1a; 接口统一&a…...

C/C++线程详解

一、C语言线程创建&#xff08;POSIX线程&#xff09; 1. 基本创建方法 POSIX线程&#xff08;pthread&#xff09;是C语言中创建线程的标准API&#xff1a; #include <pthread.h> #include <stdio.h>void* thread_func(void* arg) {printf("Thread runnin…...

红队系列-网络安全知识锦囊-CTF(持续更新)

CTF CTF系列-AWD专题篇CTF-比赛培训基础1 CTF 介绍HTTP协议分析进阶001.CTF简介_宽字节注入高级 2018CTF——黑客大赛特训CTF-PWNPWNCTF竞赛中的主要题型之一了解CTF Capture The Flag 夺旗描述:# gets从标准输入设备读字符串函数#下面是对main函数中的汇编代码的解释:modifi…...

Windows环境下常用网络命令使用

ipconfig命令使用&#xff1a; ipconfig可用于显示当前的TCP/IP配置的设置值&#xff0c;通常是用来检验人工配置的TCP/IP设置是否正确。在网络连接出现问题时&#xff0c;可以使用ipconfig /release和ipconfig /renew命令来刷新IP地址&#xff0c;这通常能解决因IP地址冲突或…...

双系统下 ubuntu 20.04 突然 开机黑屏报错 hdaudioC0D2: unable to configure disabling

双系统下 ubuntu 20.04 突然 开机黑屏报错 hdaudioC0D2: unable to configure disabling 简介:今天在开实验室开双系统台式机时,ubuntu 20.04 系统下,突然在某次关机后再开机时,本来启动好好的,但是在进行图形化启动时,本来应该是显示输入账号和密码时,直接黑屏报错了,…...

easyExcel导入导出convert

easyExcel版本2.2.7&#xff0c;3.0及以上使用不一致 类上加注解 ExcelProperty(value "下发类型",converter ComponentPurchaseBomExceladvanceStatusConvert.class)private Integer advanceStatus; 转换类 import com.alibaba.excel.converters.Converter; impo…...

C语言高频面试题——指针函数和函数指针的区别

在 C 语言中&#xff0c;指针函数 和 函数指针 是两个容易混淆的概念&#xff0c;但它们的功能和用途完全不同。以下是详细的对比分析&#xff0c;帮助你彻底理解它们的区别。 1. 指针函数&#xff08;Function Returning a Pointer&#xff09; 定义 指针函数 是一个返回值为…...

软考中级-软件设计师 知识点速过1(手写笔记)

第一章&#xff1a;数值及其转换 没什么可说的&#xff0c;包括二进制转八进制和十六进制 第二章&#xff1a;计算机内部数据表示 真值和机器数&#xff1a; 原码&#xff08;后面都拿x -19举例) &#xff1a; 反码&#xff1a; 补码&#xff1a; 移码&#xff1a; 定点数…...

【美化vim】

美化vim 涉及文件一个例子 涉及文件 ~/.vimrc修改这个文件即可 一个例子 let mapleader ,set number " 显示行号"set relativenumber " 显示相对行号set incsearch " 实时开启搜索高亮set hlsearch " 搜索结果高亮set autoinden…...

Dash框架深度解析:数据驱动型Web应用的Python化革命

一、Dash的定位与技术基因 Dash作为Python生态中的现象级框架,重新定义了数据科学家与Web应用开发之间的边界。它以**“零前端”**为核心设计理念,将React的组件化思想、Plotly的可视化能力与Flask的轻量化服务完美融合,使得Python开发者无需深入JavaScript技术栈即可构建交…...

Linux——线程(1)线程概念与控制

线程&#xff1f;这个名字我们似乎有些眼熟&#xff1f;没错&#xff0c;我们之前提到过的进程和这个有点像。但进程和线程有什么关系呢&#xff1f;本系列我们讲从线程的概念出发&#xff0c;了解一下Linux中的线程以及线程和进程的关系等内容。 一、线程的概念 线程是一个执…...

Redis LFU 策略参数配置指南

一、基础配置步骤‌ 设置内存上限‌ 在 redis.conf 配置文件中添加以下指令&#xff0c;限制 Redis 最大内存使用量&#xff08;例如设置为 4GB&#xff09;&#xff1a; maxmemory 4gb选择 LFU 淘汰策略‌ 根据键的作用域选择策略&#xff1a; # 所有键参与淘汰 maxmemory-…...

备忘录模式:实现对象状态撤销与恢复的设计模式

备忘录模式&#xff1a;实现对象状态撤销与恢复的设计模式 一、模式核心&#xff1a;在不破坏封装性的前提下保存和恢复对象状态 在软件开发中&#xff0c;经常需要实现 “撤销” 功能&#xff08;如文本编辑器的撤销修改、游戏存档读取&#xff09;。直接暴露对象内部状态会…...

蓝桥杯 5. 交换瓶子

交换瓶子 原题目链接 题目描述 有 N 个瓶子&#xff0c;编号为 1 ~ N&#xff0c;放在架子上。 例如有 5 个瓶子&#xff0c;当前排列为&#xff1a; 2 1 3 5 4每次可以拿起 2 个瓶子&#xff0c;交换它们的位置。 要求通过若干次交换&#xff0c;使得瓶子的编号从小到大…...

本地使用Ollama部署DeepSeek

以下是在本地使用Ollama部署DeepSeek的详细教程&#xff0c;涵盖安装、修改安装目录、安装大模型以及删除大模型的操作步骤。 安装Ollama 1. 系统要求 确保你的系统满足以下条件&#xff1a; 操作系统&#xff1a;macOS、Linux或者Windows。足够的磁盘空间和内存。 2. 安装…...

freecad参数化三维模型装配体解析至web端,切换参数组或修改参数

用免费开源的freecad制作全参数化的三维模型&#xff0c;并且装配&#xff0c;上传至服务器&#xff0c;解析至web端&#xff0c;用户可以切换参数或修改参数&#xff0c;驱动模型改变。 freecad全参数化装配体模型解析至web端进行参数切换、修改完整展示_哔哩哔哩_bilibili …...

前端基础之《Vue(9)—混入》

一、什么是混入 1、是一种代码复用的技巧 Vue组件是由若干选项组成的&#xff0c;向组件中混入可复用的选项。 2、作用 比如我封装两个组件&#xff0c;一个是A组件&#xff0c;一个是B组件&#xff0c;发现它里面有相同的选项&#xff0c;就可以用混用的方式来复用它。 二、…...

ORACLE DATAGUARD遇到GAP增量恢复方式修复RAC环境备机的实践

ORACLE DATAGUARD技术是一个常用的数据保护机制&#xff0c;在DATAGUARD运行过程中&#xff0c;遇到异常导致备机不同步&#xff0c;而主库的归档日志也被清理&#xff0c;此时出现GAP&#xff0c;无法同步&#xff1b;就需要人工处理&#xff1b;对于小型数据库重新全量同步数…...

机器人进阶---视觉算法(六)傅里叶变换在图像处理中怎么用

傅里叶变换在图像处理中怎么用 傅里叶变换的基本原理应用场景Python代码示例逐行解释总结傅里叶变换在图像处理中是一种重要的工具,它将图像从空间域转换到频域,从而可以对图像的频率特性进行分析和处理。傅里叶变换在图像滤波、图像增强、图像压缩和图像分析等方面都有广泛应…...

Java知识日常巩固(五)

Java中wait()和 sleep()的区别? 在Java中,wait()和sleep()方法用于线程控制,但它们之间存在几个关键区别: 1. 用途 wait():用于线程间的协作。当一个线程需要等待某个条件满足时,它会调用wait()方法释放锁并进入等待状态,直到其他线程调用相同对象的notify()或notifyAl…...

浅析锁的应用与场景

锁的应用与场景&#xff1a;从单机到分布式 摘要&#xff1a;在多线程和分布式系统中&#xff0c;“锁”是避免资源竞争、保障数据一致性的核心机制。但你真的了解锁吗&#xff1f;什么时候该用锁&#xff1f;用哪种锁&#xff1f;本文通过通俗的比喻和代码示例&#xff0c;带…...

语音合成之五语音合成中的“一对多”问题主流模型解决方案分析

语音合成中的“一对多”问题主流模型解决方案分析 引言“一对多”指的是什么&#xff1f;优秀开源模型的方法CosyvoiceSparkTTSLlaSA TTSVITS 引言 TTS系统旨在模仿人类的自然语音&#xff0c;但其核心面临着一个固有的挑战&#xff0c;即“一对多”问题 。这意味着对于给定的…...