规范类名及命名空间名称
This commit is contained in:
@@ -0,0 +1,141 @@
|
||||
// ============================================================================
|
||||
// Copyright © 2026 Hexagon Technology Center GmbH. All Rights Reserved.
|
||||
// 文件� SharpenProcessor.cs
|
||||
// æ��è¿°: é”�化算å�,用于增强图åƒ�边缘和细节
|
||||
// 功能:
|
||||
// - 拉普拉斯�化
|
||||
// - ��化掩蔽(Unsharp Masking�
|
||||
// - �调节�化强�
|
||||
// - 支æŒ�多ç§�é”�化æ ?
|
||||
// 算法: 拉普拉斯算å�ã€�é�žé”�化掩蔽
|
||||
// 作� �伟 wei.lw.li@hexagon.com
|
||||
// ============================================================================
|
||||
|
||||
using Emgu.CV;
|
||||
using Emgu.CV.CvEnum;
|
||||
using Emgu.CV.Structure;
|
||||
using Serilog;
|
||||
using XP.ImageProcessing.Core;
|
||||
|
||||
namespace XP.ImageProcessing.Processors;
|
||||
|
||||
/// <summary>
|
||||
/// é”�化算å�
|
||||
/// </summary>
|
||||
public class SharpenProcessor : ImageProcessorBase
|
||||
{
|
||||
private static readonly ILogger _logger = Log.ForContext<SharpenProcessor>();
|
||||
|
||||
public SharpenProcessor()
|
||||
{
|
||||
Name = LocalizationHelper.GetString("SharpenProcessor_Name");
|
||||
Description = LocalizationHelper.GetString("SharpenProcessor_Description");
|
||||
}
|
||||
|
||||
protected override void InitializeParameters()
|
||||
{
|
||||
Parameters.Add("Method", new ProcessorParameter(
|
||||
"Method",
|
||||
LocalizationHelper.GetString("SharpenProcessor_Method"),
|
||||
typeof(string),
|
||||
"Laplacian",
|
||||
null,
|
||||
null,
|
||||
LocalizationHelper.GetString("SharpenProcessor_Method_Desc"),
|
||||
new string[] { "Laplacian", "UnsharpMask" }));
|
||||
|
||||
Parameters.Add("Strength", new ProcessorParameter(
|
||||
"Strength",
|
||||
LocalizationHelper.GetString("SharpenProcessor_Strength"),
|
||||
typeof(double),
|
||||
1.0,
|
||||
0.1,
|
||||
5.0,
|
||||
LocalizationHelper.GetString("SharpenProcessor_Strength_Desc")));
|
||||
|
||||
Parameters.Add("KernelSize", new ProcessorParameter(
|
||||
"KernelSize",
|
||||
LocalizationHelper.GetString("SharpenProcessor_KernelSize"),
|
||||
typeof(int),
|
||||
3,
|
||||
1,
|
||||
15,
|
||||
LocalizationHelper.GetString("SharpenProcessor_KernelSize_Desc")));
|
||||
_logger.Debug("InitializeParameters");
|
||||
}
|
||||
|
||||
public override Image<Gray, byte> Process(Image<Gray, byte> inputImage)
|
||||
{
|
||||
string method = GetParameter<string>("Method");
|
||||
double strength = GetParameter<double>("Strength");
|
||||
int kernelSize = GetParameter<int>("KernelSize");
|
||||
|
||||
if (kernelSize % 2 == 0) kernelSize++;
|
||||
|
||||
Image<Gray, byte> result;
|
||||
|
||||
if (method == "UnsharpMask")
|
||||
{
|
||||
result = ApplyUnsharpMask(inputImage, kernelSize, strength);
|
||||
}
|
||||
else // Laplacian
|
||||
{
|
||||
result = ApplyLaplacianSharpening(inputImage, strength);
|
||||
}
|
||||
|
||||
_logger.Debug("Process: Method = {Method}, Strength = {Strength}, KernelSize = {KernelSize}",
|
||||
method, strength, kernelSize);
|
||||
return result;
|
||||
}
|
||||
|
||||
private Image<Gray, byte> ApplyLaplacianSharpening(Image<Gray, byte> inputImage, double strength)
|
||||
{
|
||||
// 计算拉普拉斯算å�
|
||||
var laplacian = new Image<Gray, float>(inputImage.Size);
|
||||
CvInvoke.Laplacian(inputImage, laplacian, DepthType.Cv32F, 1);
|
||||
|
||||
// 转æ�¢ä¸ºå—节类åž?
|
||||
var laplacianByte = laplacian.Convert<Gray, byte>();
|
||||
|
||||
// å°†æ‹‰æ™®æ‹‰æ–¯ç»“æžœåŠ åˆ°åŽŸå›¾ä¸Šè¿›è¡Œé”�化
|
||||
var floatImage = inputImage.Convert<Gray, float>();
|
||||
var sharpened = floatImage + laplacian * strength;
|
||||
|
||||
// é™�制范围并转æ�¢å›žå—节类型
|
||||
var result = sharpened.Convert<Gray, byte>();
|
||||
|
||||
laplacian.Dispose();
|
||||
laplacianByte.Dispose();
|
||||
floatImage.Dispose();
|
||||
sharpened.Dispose();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private Image<Gray, byte> ApplyUnsharpMask(Image<Gray, byte> inputImage, int kernelSize, double strength)
|
||||
{
|
||||
// 创建模糊图�
|
||||
var blurred = new Image<Gray, byte>(inputImage.Size);
|
||||
CvInvoke.GaussianBlur(inputImage, blurred,
|
||||
new System.Drawing.Size(kernelSize, kernelSize), 0);
|
||||
|
||||
// 计算差异(细节)
|
||||
var floatInput = inputImage.Convert<Gray, float>();
|
||||
var floatBlurred = blurred.Convert<Gray, float>();
|
||||
var detail = floatInput - floatBlurred;
|
||||
|
||||
// å°†ç»†èŠ‚åŠ å›žåŽŸå›?
|
||||
var sharpened = floatInput + detail * strength;
|
||||
|
||||
// 转æ�¢å›žå—节类åž?
|
||||
var result = sharpened.Convert<Gray, byte>();
|
||||
|
||||
blurred.Dispose();
|
||||
floatInput.Dispose();
|
||||
floatBlurred.Dispose();
|
||||
detail.Dispose();
|
||||
sharpened.Dispose();
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user