// ============================================================================ // Copyright © 2026 Hexagon Technology Center GmbH. All Rights Reserved. // 文件名: MorphologyProcessor.cs // 描述: 形态学处理算子,用于二值图像的形态学操作 // 功能: // - 腐蚀(Erode):收缩目标区域 // - 膨胀(Dilate):扩张目标区域 // - 开运算(Open):先腐蚀后膨胀,去除小目标 // - 闭运算(Close):先膨胀后腐蚀,填充小孔洞 // 算法: 数学形态学运算 // 作者: 李伟 wei.lw.li@hexagon.com // ============================================================================ using Emgu.CV; using Emgu.CV.CvEnum; using Emgu.CV.Structure; using XP.ImageProcessing.Core; using Serilog; using System.Drawing; namespace XP.ImageProcessing.Processors; /// /// 形态学处理算子 /// public class MorphologyProcessor : ImageProcessorBase { private static readonly ILogger _logger = Log.ForContext(); public MorphologyProcessor() { Name = LocalizationHelper.GetString("MorphologyProcessor_Name"); Description = LocalizationHelper.GetString("MorphologyProcessor_Description"); } protected override void InitializeParameters() { Parameters.Add("Operation", new ProcessorParameter( "Operation", LocalizationHelper.GetString("MorphologyProcessor_Operation"), typeof(string), "Erode", null, null, LocalizationHelper.GetString("MorphologyProcessor_Operation_Desc"), new string[] { "Erode", "Dilate", "Open", "Close" })); Parameters.Add("KernelSize", new ProcessorParameter( "KernelSize", LocalizationHelper.GetString("MorphologyProcessor_KernelSize"), typeof(int), 3, 1, 21, LocalizationHelper.GetString("MorphologyProcessor_KernelSize_Desc"))); Parameters.Add("Iterations", new ProcessorParameter( "Iterations", LocalizationHelper.GetString("MorphologyProcessor_Iterations"), typeof(int), 1, 1, 10, LocalizationHelper.GetString("MorphologyProcessor_Iterations_Desc"))); _logger.Debug("InitializeParameters"); } public override Image Process(Image inputImage) { string operation = GetParameter("Operation"); int kernelSize = GetParameter("KernelSize"); int iterations = GetParameter("Iterations"); var kernel = CvInvoke.GetStructuringElement(ElementShape.Rectangle, new Size(kernelSize, kernelSize), new Point(-1, -1)); var result = inputImage.Clone(); switch (operation) { case "Erode": CvInvoke.Erode(inputImage, result, kernel, new Point(-1, -1), iterations, BorderType.Default, default); break; case "Dilate": CvInvoke.Dilate(inputImage, result, kernel, new Point(-1, -1), iterations, BorderType.Default, default); break; case "Open": CvInvoke.MorphologyEx(inputImage, result, MorphOp.Open, kernel, new Point(-1, -1), iterations, BorderType.Default, default); break; case "Close": CvInvoke.MorphologyEx(inputImage, result, MorphOp.Close, kernel, new Point(-1, -1), iterations, BorderType.Default, default); break; } _logger.Debug("Process:Operation = {operation},KernelSize = {kernelSize},Iterations = {iterations}", operation, kernelSize, iterations); return result; } }