修复注释乱码
This commit is contained in:
@@ -1,26 +1,26 @@
|
||||
// ============================================================================
|
||||
// Copyright © 2026 Hexagon Technology Center GmbH. All Rights Reserved.
|
||||
// 文件� HDREnhancementProcessor.cs
|
||||
// æ��è¿°: 高动æ€�范围(HDR)图åƒ�增强算å?
|
||||
// 文件名: HDREnhancementProcessor.cs
|
||||
// 描述: 高动态范围(HDR)图像增强算子
|
||||
// 功能:
|
||||
// - å±€éƒ¨è‰²è°ƒæ˜ å°„ï¼ˆLocal Tone Mappingï¼?
|
||||
// - è‡ªé€‚åº”å¯¹æ•°æ˜ å°„ï¼ˆAdaptive Logarithmic Mappingï¼?
|
||||
// - 局部色调映射(Local Tone Mapping)
|
||||
// - 自适应对数映射(Adaptive Logarithmic Mapping)
|
||||
// - Drago色调映射
|
||||
// - 双边滤波色调映射
|
||||
// - 增强图�暗部和亮部细�
|
||||
// - 增强图像暗部和亮部细节
|
||||
// 算法: 基于色调映射的HDR增强
|
||||
// 作� �伟 wei.lw.li@hexagon.com
|
||||
// 作者: 李伟 wei.lw.li@hexagon.com
|
||||
// ============================================================================
|
||||
|
||||
using Emgu.CV;
|
||||
using Emgu.CV.Structure;
|
||||
using Serilog;
|
||||
using XP.ImageProcessing.Core;
|
||||
using Serilog;
|
||||
|
||||
namespace XP.ImageProcessing.Processors;
|
||||
|
||||
/// <summary>
|
||||
/// 高动æ€�范围图åƒ�增强算å?
|
||||
/// 高动态范围图像增强算子
|
||||
/// </summary>
|
||||
public class HDREnhancementProcessor : ImageProcessorBase
|
||||
{
|
||||
@@ -138,8 +138,8 @@ public class HDREnhancementProcessor : ImageProcessorBase
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// å±€éƒ¨è‰²è°ƒæ˜ å°?
|
||||
/// 将图�分解为基础层(光照)和细节层,分别处����
|
||||
/// 局部色调映射
|
||||
/// 将图像分解为基础层(光照)和细节层,分别处理后合成
|
||||
/// Base = GaussianBlur(log(I))
|
||||
/// Detail = log(I) - Base
|
||||
/// Output = exp(Base_compressed + Detail * boost)
|
||||
@@ -156,22 +156,22 @@ public class HDREnhancementProcessor : ImageProcessorBase
|
||||
for (int x = 0; x < width; x++)
|
||||
floatImage.Data[y, x, 0] = floatImage.Data[y, x, 0] / 255.0f + 0.001f;
|
||||
|
||||
// 对数�
|
||||
// 对数域
|
||||
var logImage = new Image<Gray, float>(width, height);
|
||||
for (int y = 0; y < height; y++)
|
||||
for (int x = 0; x < width; x++)
|
||||
logImage.Data[y, x, 0] = (float)Math.Log(floatImage.Data[y, x, 0]);
|
||||
|
||||
// 基础层:大尺度高斯模糊��光照分�
|
||||
// 基础层:大尺度高斯模糊提取光照分量
|
||||
int kernelSize = (int)(sigmaSpace * 6) | 1;
|
||||
if (kernelSize < 3) kernelSize = 3;
|
||||
var baseLayer = new Image<Gray, float>(width, height);
|
||||
CvInvoke.GaussianBlur(logImage, baseLayer, new System.Drawing.Size(kernelSize, kernelSize), sigmaSpace);
|
||||
|
||||
// 细节�
|
||||
// 细节层
|
||||
var detailLayer = logImage - baseLayer;
|
||||
|
||||
// 压缩基础层的动�范�
|
||||
// 压缩基础层的动态范围
|
||||
double baseMin = double.MaxValue, baseMax = double.MinValue;
|
||||
for (int y = 0; y < height; y++)
|
||||
{
|
||||
@@ -200,7 +200,7 @@ public class HDREnhancementProcessor : ImageProcessorBase
|
||||
}
|
||||
}
|
||||
|
||||
// ��:压缩�的基础�+ 增强的细节层
|
||||
// 合成:压缩后的基础层 + 增强的细节层
|
||||
var combined = new Image<Gray, float>(width, height);
|
||||
for (int y = 0; y < height; y++)
|
||||
{
|
||||
@@ -287,7 +287,7 @@ public class HDREnhancementProcessor : ImageProcessorBase
|
||||
for (int x = 0; x < width; x++)
|
||||
floatImage.Data[y, x, 0] /= 255.0f;
|
||||
|
||||
// 计算全局最大亮�
|
||||
// 计算全局最大亮度
|
||||
float globalMax = 0;
|
||||
for (int y = 0; y < height; y++)
|
||||
for (int x = 0; x < width; x++)
|
||||
@@ -364,7 +364,7 @@ public class HDREnhancementProcessor : ImageProcessorBase
|
||||
for (int x = 0; x < width; x++)
|
||||
floatImage.Data[y, x, 0] /= 255.0f;
|
||||
|
||||
// 全局最大亮�
|
||||
// 全局最大亮度
|
||||
float maxLum = 0;
|
||||
for (int y = 0; y < height; y++)
|
||||
for (int x = 0; x < width; x++)
|
||||
@@ -410,7 +410,7 @@ public class HDREnhancementProcessor : ImageProcessorBase
|
||||
|
||||
/// <summary>
|
||||
/// 双边滤波色调映射
|
||||
/// 使用�边滤波分离基础层和细节�
|
||||
/// 使用双边滤波分离基础层和细节层
|
||||
/// 双边滤波保边特性使得细节层更加精确
|
||||
/// </summary>
|
||||
private Image<Gray, byte> BilateralToneMapping(Image<Gray, byte> inputImage,
|
||||
@@ -419,20 +419,20 @@ public class HDREnhancementProcessor : ImageProcessorBase
|
||||
int width = inputImage.Width;
|
||||
int height = inputImage.Height;
|
||||
|
||||
// 转�为浮点并�对�
|
||||
// 转换为浮点并取对数
|
||||
var floatImage = inputImage.Convert<Gray, float>();
|
||||
var logImage = new Image<Gray, float>(width, height);
|
||||
for (int y = 0; y < height; y++)
|
||||
for (int x = 0; x < width; x++)
|
||||
logImage.Data[y, x, 0] = (float)Math.Log(floatImage.Data[y, x, 0] / 255.0f + 0.001);
|
||||
|
||||
// �边滤波��基础层(�边平滑�
|
||||
// 双边滤波提取基础层(保边平滑)
|
||||
int diameter = (int)(sigmaSpace * 2) | 1;
|
||||
if (diameter < 3) diameter = 3;
|
||||
if (diameter > 31) diameter = 31;
|
||||
|
||||
var baseLayer = new Image<Gray, float>(width, height);
|
||||
// 转��byte 进行�边滤波,�转回 float
|
||||
// 转换为 byte 进行双边滤波,再转回 float
|
||||
var logNorm = NormalizeToByteImage(logImage);
|
||||
var baseNorm = new Image<Gray, byte>(width, height);
|
||||
CvInvoke.BilateralFilter(logNorm, baseNorm, diameter, sigmaColor, sigmaSpace);
|
||||
@@ -454,10 +454,10 @@ public class HDREnhancementProcessor : ImageProcessorBase
|
||||
for (int x = 0; x < width; x++)
|
||||
baseLayer.Data[y, x, 0] = (float)(baseNorm.Data[y, x, 0] / 255.0 * logRange + logMin);
|
||||
|
||||
// 细节�= 对数图� - 基础�
|
||||
// 细节层 = 对数图像 - 基础层
|
||||
var detailLayer = logImage - baseLayer;
|
||||
|
||||
// 压缩基础�
|
||||
// 压缩基础层
|
||||
double baseMin = double.MaxValue, baseMax = double.MinValue;
|
||||
for (int y = 0; y < height; y++)
|
||||
for (int x = 0; x < width; x++)
|
||||
|
||||
Reference in New Issue
Block a user