LeadTools中文图像处理教程(5):图像去噪

发布时间:2014/09/16 00:09 发布者:Linda

返回博客中心

 

  • LeadTools中文图像处理教程(1):更改数据格式 点击进入
  • LeadTools中文图像处理教程(2):图像的几何变换 点击进入
  • LeadTools中文图像处理教程(3):倾斜校正 点击进入
  • LeadTools中文图像处理教程(4):调整图像亮度和对比度 点击进入
  • LeadTools中文图像处理教程(5):图像去噪 点击进入
  • LeadTools中文图像处理教程(6):检测和增强边缘、线条 点击进入
  • LeadTools中文图像处理教程(7):应用艺术效果 点击进入
  • LeadTools中文图像处理教程(8):调整色彩 点击进入
  • LeadTools中文图像处理教程(9):添加图像至另一个图像 点击进入
  • LeadTools中文图像处理教程(10):窗位(仅用于Medical) 点击进入
  • LeadTools中文图像处理教程(11):对比图像 点击进入

 

LeadTools是全球最优秀的图形、图像处理开发包,它可以处理各种格式的文件,并包含所有图形、图像的处理和转换功能,支持图形、图像、多媒体、条形码、OCR、Internet、DICOM等等,具有各种软硬件平台下的开发包,是不可多得优秀软件。

数字图像在数字化和传输过程中常受到成像设备与外部环境噪声干扰等影响,我们将其称为含噪图像或噪声图像。减少数字图像中噪声的过程称为图像去噪。LeadTools在去噪方面也提供了多种类,具有非常强大的功能。

本文主要为大家介绍:

1 创建“图像去噪”应用程序的具体步骤

2 LeadTools“图像去噪”相关类的介绍

3 傅里叶变换:A 知识简介 B LeadTools傅里叶变换类的介绍

4 “图像去噪”支持WCF简介

 

 

创建“图像去噪”应用程序的具体步骤

 

1. 打开Visual Studio .NET。点击 文件->新建->项目…。打开新建项目对话框后,在模板中选择“Visual C#”或“Visual Basic”,随后选择“Windows窗体应用程序”。在名称栏中输入项目名称“RemoveNoise”,并使用“浏览”按钮选择您工程的存储路径,点击“确定”。

2. 在“解决方案资源管理器”中,右击“引用”,选择“添加引用”。根据当前工程的 Framework 版本和生成目标平台,选择添加相应的LeadTools控件,例如工程中的版本为 Framework 4.0、生成目标平台是 x86,则浏览选择Leadtools For .NET文件夹” <LEADTOOLS_INSTALLDIR>\Bin\DotNet4\Win32,选择以下的DLL“:

  • Leadtools.dll
  • Leadtools.Codecs.dll
  • Leadtools.Codecs.Cmp.dll
  • Leadtools.Codecs.Bmp.dll
  • Leadtools.Codecs.Tif.dll
  • Leadtools.ImageProcessing.Color.dll
  • Leadtools.ImageProcessing.Core.dll
  • Leadtools.ImageProcessing.Effects.dll
  • Leadtools.WinForms.dll

3.工具箱(视图->工具箱),添加7个RadioButton控件(将RadioButton的Text属性依照下表修改),两个Panel控件(Name分别修改为panelBefore和panelAfter)。如下图:

Name Text
radioButton1 使用DespeckleCommand 去除一位图像斑点
radioButton2 使用MedianCommand去除椒盐噪声
radioButton3 使用AverageCommand 去除均匀、高斯噪声
radioButton4 使用AutoBinaryCommand 将图像转为二值图像
radioButton5 使用SmoothEdgesCommand平滑图像的边缘
radioButton6 对图像进行离散傅里叶变换
radioButton7 对图像进行快速傅里叶变换

 

4. 切换至Form1的代码视图(右击Form1,选择查看代码),将下面几行代码添加到文件开始处:

  1: using Leadtools;
  2: using Leadtools.Codecs;
  3: using Leadtools.Codecs.Tif;
  4: using Leadtools.ImageProcessing;
  5: using Leadtools.ImageProcessing.Core;
  6: using Leadtools.ImageProcessing.Effects;
  7: using Leadtools.ImageProcessing.Color;
  8: using Leadtools.WinForms;

 

5. 将以下变量添加至Form1类:

  1: private RasterImageViewer beforePic;
  2: private RasterImageViewer afterPic;
  3: private RasterCodecs codecs;
  4: private RasterImage temp;       

 

6. 添加Form1 Load事件句柄,在其中添加以下代码:

  1: beforePic = new RasterImageViewer();
  2: beforePic.BackColor = Color.DarkCyan;
  3: beforePic.Dock = DockStyle.Fill;
  4: beforePic.InteractiveMode = RasterViewerInteractiveMode.Pan;
  5: beforePic.HorizontalAlignMode = RasterPaintAlignMode.Center;
  6: beforePic.VerticalAlignMode = RasterPaintAlignMode.Center;
  7: beforePic.AutoResetScaleFactor = false;           
  8: panelBefore.Controls.Add(beforePic);
  9: beforePic.BringToFront();
 10: 
 11: afterPic = new RasterImageViewer();
 12: afterPic.BackColor = beforePic.BackColor;
 13: afterPic.Dock = beforePic.Dock;
 14: afterPic.InteractiveMode = beforePic.InteractiveMode;
 15: afterPic.HorizontalAlignMode = beforePic.HorizontalAlignMode;
 16: afterPic.VerticalAlignMode = beforePic.VerticalAlignMode;
 17: afterPic.AutoResetScaleFactor = beforePic.AutoResetScaleFactor;
 18: panelAfter.Controls.Add(afterPic);
 19: afterPic.BringToFront();
 20: 
 21: codecs = new RasterCodecs();
 22: codecs.ThrowExceptionsOnInvalidImages = true;

 

7. 双击radioButton1,在radioButton1 CheckedChanged事件句柄中添加以下代码:

(本段代码为DespeckleCommand类的使用)

  1: beforePic.Image = codecs.Load(Path.Combine(Application.StartupPath, @"..\..\Pic\clean.tif"));
  2: 
  3: temp = beforePic.Image.Clone();
  4: 
  5: DespeckleCommand command = new DespeckleCommand();
  6: 
  7: command.Run(temp);
  8: afterPic.Image = temp;            

 

8. 双击radioButton2,在radioButton2 CheckedChanged事件句柄中添加以下代码:

(本段代码为MedianCommand类的使用)

  1: beforePic.Image = codecs.Load(Path.Combine(Application.StartupPath, @"..\..\Pic\Master.jpg"));
  2: 
  3: temp = beforePic.Image.Clone();
  4:  
  5: MedianCommand command = new MedianCommand();
  6:  
  7: command.Dimension = 9;
  8: command.Run(temp);
  9: afterPic.Image = temp;

 

9. 双击radioButton3,在radioButton3 CheckedChanged事件句柄中添加以下代码:

(本段代码为AverageCommand类的使用)

  1: beforePic.Image = codecs.Load(Path.Combine(Application.StartupPath, @"..\..\Pic\Master.jpg"));
  2: 
  3: temp = beforePic.Image.Clone();
  4:  
  5: AverageCommand command = new AverageCommand();
  6:  
  7: command.Dimension = 3;
  8: command.Run(temp);
  9: afterPic.Image = temp;
 10: codecs.Save(temp, Path.Combine(Application.StartupPath, @"..\..\Pic\AverageCommandResult.jpg"), RasterImageFormat.Jpeg, 24);

 

10. 双击radioButton4,在radioButton4 CheckedChanged事件句柄中添加以下代码:

(本段代码为AutoBinaryCommand类的使用)

  1: beforePic.Image = codecs.Load(Path.Combine(Application.StartupPath, @"..\..\Pic\Master.jpg"));
  2: 
  3: temp = beforePic.Image.Clone();
  4:  
  5: AutoBinaryCommand command = new AutoBinaryCommand();
  6:  
  7: command.Run(temp);
  8: afterPic.Image = temp;
  9: codecs.Save(temp, Path.Combine(Application.StartupPath, @"..\..\Pic\AutoBinaryCommand.jpg"), RasterImageFormat.Jpeg, 24);

 

11. 双击radioButton5,在radioButton5 CheckedChanged事件句柄中添加以下代码:

(本段代码为SmoothEdgesCommand类的使用)

  1: beforePic.Image = codecs.Load(Path.Combine(Application.StartupPath, @"..\..\Pic\Master.jpg"));
  2: 
  3: temp = beforePic.Image.Clone();
  4:  
  5: SmoothEdgesCommand command = new SmoothEdgesCommand();
  6: command.Amount = 50;
  7: command.Threshold = 0;
  8:  
  9: command.Run(temp);
 10: afterPic.Image = temp;

 

12. 双击radioButton6,在radioButton6 CheckedChanged事件句柄中添加以下代码:

(本段代码为DiscreteFourierTransformCommand类的使用)

  1: beforePic.Image = codecs.Load(Path.Combine(Application.StartupPath, @"..\..\Pic\Master.jpg"));
  2: 
  3: temp = beforePic.Image.Clone();
  4:  
  5: FourierTransformInformation FTArray = new FourierTransformInformation(temp);
  6: LeadRect rcRange = new LeadRect(0, 0, temp.Width - 1, temp.Height - 1);
  7: DiscreteFourierTransformCommand command = new DiscreteFourierTransformCommand();
  8: 
  9: command.FourierTransformInformation = FTArray;
 10: command.Range = rcRange;
 11: command.Flags = DiscreteFourierTransformCommandFlags.DiscreteFourierTransform |
 12:    DiscreteFourierTransformCommandFlags.Gray |
 13:    DiscreteFourierTransformCommandFlags.Range |
 14:    DiscreteFourierTransformCommandFlags.InsideX |
 15:    DiscreteFourierTransformCommandFlags.InsideY;
 16:  
 17: 
 18: FourierTransformDisplayCommand disCommand = new FourierTransformDisplayCommand();
 19: disCommand.Flags = FourierTransformDisplayCommandFlags.Log | FourierTransformDisplayCommandFlags.Magnitude;
 20: disCommand.FourierTransformInformation = command.FourierTransformInformation;
 21:  
 22: disCommand.Run(temp);
 23: 
 24: afterPic.Image = temp;

 

13. 双击radioButton7,在radioButton7 CheckedChanged事件句柄中添加以下代码:

(本段代码为FastFourierTransformCommand类的使用)

  1: beforePic.Image = codecs.Load(Path.Combine(Application.StartupPath, @"..\..\Pic\Master.jpg"));
  2: 
  3: temp = beforePic.Image.Clone();
  4: 
  5: SizeCommand sizecommand = new SizeCommand(256, 256, Leadtools.RasterSizeFlags.Bicubic);
  6: 
  7: sizecommand.Run(temp);
  8: FourierTransformInformation FTArray = new FourierTransformInformation(temp);
  9: 
 10: FastFourierTransformCommand command = new FastFourierTransformCommand(FTArray, FastFourierTransformCommandFlags.FastFourierTransform | FastFourierTransformCommandFlags.Gray);
 11: command.Run(temp);
 12: LeadRect rcRect = new LeadRect(0, 0, temp.Width / 2, temp.Height / 2);
 13: FrequencyFilterCommand FreqCommand = new FrequencyFilterCommand(FTArray, rcRect, FrequencyFilterCommandFlags.InsideX | FrequencyFilterCommandFlags.OutsideY);
 14: 
 15: FastFourierTransformCommand InvCommand = new FastFourierTransformCommand(FTArray, FastFourierTransformCommandFlags.InverseFastFourierTransform | FastFourierTransformCommandFlags.Gray | FastFourierTransformCommandFlags.Scale | FastFourierTransformCommandFlags.Both);
 16: InvCommand.Run(temp);
 17: 
 18: afterPic.Image = temp;

 

14.编译运行程序。本文DEMO使用了DespeckleCommand、MedianCommand、AverageCommand、AutoBinaryCommand、SmoothEdgesCommand类对图像进行去噪处理,使用了离散傅里叶变换和快速傅里叶变换对图像进行了处理。结果如下图:

clip_image006

clip_image008

更多介绍请继续浏览文章下一部分!

DEMO下载:

 

本博文Demo提供了去除噪声和对图像进行傅里叶变换的功能,若想使用更多的图像去噪类处理图像,欢迎下载LeadTools全功能试用版,你可以在这些代码的基础上修改。非常简单,赶快动手试试吧!

 

LeadTools“图像去噪”相关类的介绍

 

类名

说明

DespeckleCommand

专门用于去除1位图像上的斑点,例如传真或扫描文件。

MedianCommand

它是去除任何种类图像椒盐噪声的有效方法。您可以设置邻域的大小(用于计算中间值的周围像素)来控制方法的强度。这个方法会导致图像的最小模糊。

AverageCommand

它可以移除均匀和高斯噪声,但是有的图像使用中值滤波器图像会变得更加模糊。您可以设置邻域的大小(用于计算算术平均值的周围像素)来控制类的强度。

AddCommand

此类可在一个列表平均图像,消除图像中的随机噪声。

AddWeightedCommand

此类可在一个列表平均图像,消除图像中的随机噪声。通常情况下,调用此类可在短的时间间隔内获取同一对象的一系列图像。此类通过加权平均可以消除随机噪声。

GaussianCommand

此类通过将高斯滤波器应用于图像的每个像素,平滑和模糊图像。模糊的量由类使用的邻域大小决定。

BinaryFilterCommand

Document/Medical专用】二进制过滤器(用于黑色物体的膨胀和腐蚀)可用于噪声去除。BinaryFilterCommand类使用了定向二进制过滤器。MaximumCommandMinimumCommand类可以控制膨胀和腐蚀的邻域大小。这些方法的一种噪声移除技术创建了一个图像的两个副本,将膨胀过滤器应用于一个副本,腐蚀过滤器应用于另一个副本。然后使用设置了OperationAverage (averaging) 标志的CombineCommand 类合并处理后的两个图像。

AutoBinaryCommand

Document/Medical专用】此类基于图像的统计特性,使用自动计算的阈值,将图像转换为二值图像。灰度图像会获取最佳的效果。

DeinterlaceCommand

去除隔行扫描视频信号源图像的黑线。它在图像中合并线和/或将线混合在一起。

SmoothEdgesCommand

平滑图像的边缘

DynamicBinaryCommand

不改变每像素的位数,将图像转换为黑白图像。

傅立叶变换

 

A 知识简介

傅里叶变换在去除谐波噪声时非常有用,如:

  • 图像视频中的人字斜纹图案
  • 正弦波样式
  • 莫尔样式
  • 半色调图案
  • 干扰模式
    傅里叶变换在去除视频信号和CCD的噪声时也十分常有用的。

下面我们为大家介绍下傅里叶变换的一些基本概念和原理:

1 傅里叶变换将一个图像在空间上的强度变化变为在频率上的强度变化。当一个图像被描述为一系列的频率和相位时,便可以使用功率谱分析分析这些信息。功率谱是绘制出像素强度值频率的二维示意图。低频接近源点,高频接近边缘。从分析可以看出,合适的滤波器可以用于去除部分图像,而这些图像恰恰是噪声。使用inverse command标记,图像可被转换回原图像,且没有噪声。

2 离散傅里叶变换使用了一个序列进行傅里叶变换,这个序列的值有真实和设想的组件。离散傅里叶变换揭示了数据的周期性,以及这些周期性的相对强度。

3 由于离散傅里叶变换的计算时间较长,为了减少计算时间,可以使用快速傅里叶变换,它将计算次数从clip_image002降为clip_image004。然后使用快速傅里叶变换要求点的总数为2的整数幂。使用inverse command标记,图像可被转换回原图像,且没有噪声。

 

B LeadTools傅里叶变换类的介绍

 

DiscreteFourierTransformCommand

通过指定flags,计算一个图像的离散傅里叶变换或离散傅里叶逆变换。

FastFourierTransformCommand

通过指定flags,计算一个图像的快速傅里叶变换或快速傅里叶逆变换。

FourierTransformDisplayCommand

将频率谐波振幅或相位转换为图像。它允许将FFT和DFT的结果以图像形式显示出来。

FrequencyFilterCommand

根据矩形范围过滤频率谐波。

FrequencyFilterMaskCommand

将特定频率组件从图像移除时,创建一个遮罩过滤器。

 

 

支持WCF

 

Despeckle

Document/Medical专用】专门用于去除1位图像上的斑点,例如传真或扫描文件。

Median

它是去除任何种类图像椒盐噪声的有效方法。您可以设置邻域的大小(用于计算中间值的周围像素)来控制方法的强度。这个方法会导致图像的最小模糊。

Average

它可以移除均匀和高斯噪声,但是有的图像使用中值滤波器图像会变得更加模糊。您可以设置邻域的大小(用于计算算术平均值的周围像素)来控制类的强度。

Binary

PredefinedBinary

Document/Medical专用】二进制过滤器(用于黑色物体的膨胀和腐蚀)可用于噪声去除。Binary

PredefinedBinary使用了定向二进制过滤器。MaximumMinimum操作可以控制膨胀和腐蚀的邻域大小。

AutoBinary

Document/Medical专用】此类基于图像的统计特性,使用自动计算的阈值,将图像转换为二值图像。灰度图像会获取最佳的效果。

DynamicBinary

不改变每像素的位数,将图像转换为黑白图像。

LeadTools试用版下载

了解LeadTools产品更多特性

若您在使用LeadTools的过程中遇到任何问题,欢迎在葡萄城开发者社区LeadTools板块提问,我们的专业技术团队期待您的到来!

点击查看更多LeadTools使用教程、博文


关于葡萄城

赋能开发者!葡萄城是专业的集开发工具、商业智能解决方案、低代码开发平台于一身的软件和服务提供商,为超过 75% 的全球财富 500 强企业提供服务。葡萄城专注控件软件领域30年,希望通过模块化的开发控件、灵活的低代码应用开发平台等一系列开发工具、解决方案和服务,帮助开发者快速响应复杂多变的业务需求,最大程度地发挥开发者的才智和潜能,让开发者的 IT 人生更从容更美好。

了解详情,请访问葡萄城官网