LeadTools中文图像处理教程(4):调整图像亮度和对比度

发布时间: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是全球最优秀的图形、图像处理开发包,它可以处理各种格式的文件,并包含所有图形、图像的处理和转换功能,支持多种平台,包括Raster ImagingDocument ImagingMedical ImagingMultimedia Imaging四个产品系列。

LeadTools在调整图像对比度和亮度方面提供了多种方法,除了基本的亮度和对比度调整方法外,还有基于直方图的对比度方法。

本博文概览:

1 创建“调整亮度和对比度”应用程序的具体步骤

2 LeadTools基本的调整亮度和对比度的类简介

3 LeadTools基于直方图的对比度方法相关类简介

4 “调整亮度和对比度”专用方法简介

创建“调整亮度和对比度”应用程序的具体步骤

 

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

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.ImageProcessing.Color.dll
  • Leadtools.WinForms.dll
    3.工具箱(视图->工具箱),添加8个RadioButton控件(将RadioButton的Text属性依照下表修改),两个Panel控件(Name分别修改为panelBefore和panelAfter)。如下图:
    Name Text
    radioButton1 使用ChangeIntensityCommand 调整亮度
    radioButton2 使用ChangeContrastCommand 调整对比度
    radioButton3 使用GammaCorrectCommand 调整图像
    radioButton4 使用MultiplyCommand 调整图像亮度
    radioButton5 使用ColorIntensityBalanceCommand 调整图像
    radioButton6 使用ContrastBrightnessIntensityCommand 调整图像
    radioButton7 使用AddWeightedCommand 调整图像
    radioButton8 使用ChangeHueSaturationIntensityCommand 调整图像

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

  1: using Leadtools;
  2: using Leadtools.Codecs;
  3: using Leadtools.WinForms;
  4: using Leadtools.ImageProcessing.Color;

 

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;
 23: beforePic.Image = codecs.Load(Path.Combine(Application.StartupPath, @"..\..\Pic\Image.jpg"));

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

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

  1: temp = beforePic.Image.Clone();
  2: ChangeIntensityCommand command = new ChangeIntensityCommand();           
  3: command.Brightness = 250;
  4: command.Run(temp);
  5: codecs.Save(temp, Path.Combine(Application.StartupPath, @"..\..\Pic\ChangeIntensityCommandResult.jpg"), RasterImageFormat.Jpeg, 24);
  6: afterPic.Image = temp;

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

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

  1: temp = beforePic.Image.Clone();
  2: ChangeContrastCommand command = new ChangeContrastCommand();

3:

  4: command.Contrast = 250;
  5: command.Run(temp);
  6: afterPic.Image = temp;

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

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

  1: temp = beforePic.Image.Clone();
  2: GammaCorrectCommand command = new GammaCorrectCommand();
  3:  
  4: command.Gamma = 250;
  5: command.Run(temp);
  6: afterPic.Image = temp;

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

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

  1: temp = beforePic.Image.Clone();
  2: MultiplyCommand command = new MultiplyCommand();
  3: command.Factor = 151;
  4:  
  5: command.Run(temp);
  6: afterPic.Image = temp;

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

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

  1: temp = beforePic.Image.Clone();
  2: ColorIntensityBalanceCommand command = new ColorIntensityBalanceCommand();
  3: ColorIntensityBalanceCommandData Shadows = new ColorIntensityBalanceCommandData();
  4: ColorIntensityBalanceCommandData MidTone = new ColorIntensityBalanceCommandData();
  5: ColorIntensityBalanceCommandData HighLight = new ColorIntensityBalanceCommandData();
  6: 
  7: Shadows.Red = 60;
  8: Shadows.Blue = 0;
  9: Shadows.Green = 0;
 10: 
 11: MidTone.Red = 40;
 12: MidTone.Blue = 0;
 13: MidTone.Green = 0;
 14: 
 15: HighLight.Red = 70;
 16: HighLight.Blue = 0;
 17: HighLight.Green = 0;
 18: 
 19: command.Shadows = Shadows;
 20: command.MidTone = MidTone;
 21: command.HighLight = HighLight;
 22: command.Luminance = false;
 23: 
 24: command.Run(temp);
 25: afterPic.Image = temp;

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

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

  1: temp = beforePic.Image.Clone();
  2: ContrastBrightnessIntensityCommand command = new ContrastBrightnessIntensityCommand();
  3: command.Contrast = -146;
  4: command.Brightness = 358;
  5: command.Intensity = 240;
  6: command.Run(temp);
  7: afterPic.Image = temp;

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

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

  1: temp = beforePic.Image.Clone();
  2: AddWeightedCommand command = new AddWeightedCommand();
  3: command.Type = AddWeightedCommandType.Average;
  4: command.Factor = new int[5];
  5: command.Factor[0] = 100;
  6: command.Factor[1] = 100;
  7: command.Factor[2] = 100;
  8: command.Factor[3] = 100;
  9: command.Run(temp);
 10: afterPic.Image = temp;

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

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

  1: temp = beforePic.Image.Clone();
  2: ChangeHueSaturationIntensityCommand command = new ChangeHueSaturationIntensityCommand();
  3: ChangeHueSaturationIntensityCommandData[] data = new ChangeHueSaturationIntensityCommandData[1];
  4: data[0] = new ChangeHueSaturationIntensityCommandData();
  5: data[0].Hue = 18000;
  6: data[0].Saturation = 0;
  7: data[0].Intensity = 0;
  8: data[0].OuterLow = 315;
  9: data[0].OuterHigh = 45;
 10: data[0].InnerLow = 345;
 11: data[0].InnerHigh = 15;
 12: command.Data = data;
 13: command.Hue = 0;
 14: command.Saturation = 0;
 15: command.Intensity = 0;
 16: 
 17: command.Run(temp);
 18: afterPic.Image = temp;

15. 编译运行程序,本DEMO使用了10个类对图像的对比度和亮度进行调整,截图如下:

1

2

更多介绍请继续阅读文章!

DEMO下载:

 

本文使用了调整亮度和对比度的一部分类对图像进行处理,若想尝试其他类的使用,不妨下载LeadTools全功能试用版,在本Demo的代码基础上修改。很简单的,你来试一试吧。

 

基本的亮度和对比度方法

使用基本的亮度和对比度方法,您可以使用一个平尺改变亮度和对比度,或调整伽马校正。伽马校正使用计算尺改变了亮度。您可以在显示图像时使用这些基本的亮度和对比度命令类,还可以将其直接应用于图像本身。

在调整显示时,可使用图像的PaintIntensity, PaintContrast, 和PaintGamma属性。这些方法不是真正的图像处理组的一部分,因为它只影响了图像的显示,并没有改变图像本身。当调整亮度和对比度的需要是设备专用而非图像专用时,这些方法比图像处理方法更有用。

以下表格为基本亮度和对比度方法的简介,若想了解更多,您可以点击类名,在帮助文档中查看更多详细信息:

类名

说明

ChangeIntensityCommand

ChangeContrastCommand

GammaCorrectCommand

改变图像的亮度和对比度,且在文件中保存图像时这些改变是永久性的。

AddCommand

在一个图像列表中添加图像,来改进图像的亮度。这个图像列表包含相同视图或图像的诸多版本。

AddWeightedCommand

在一个图像列表中添加图像,来改进图像的亮度。通常情况下,您可以使用这个命令在很短的时间间隔内获取同一对象的一系列图像。这个类还可以获取是一个几种加权图像总和的图像。

MultiplyCommand

MultiplyCommand通过将特定图像中的颜色与Factor的100分之1相乘,来增强或降低图像的亮度。例如,如果Factor是131,特定图像中的颜色会与1.31相乘。

ColorIntensityBalanceCommand

改变红色、绿色和蓝色通道的分布。

ContrastBrightnessIntensityCommand

应用亮度、对比度的调整,来增强图像的色调范围。

ChangeHueSaturationIntensityCommand

改变图像中所有或特定颜色的色相、饱和度和亮度。这个类允许您同时改变所有色相、饱和度和亮度,还允许您单独调整参数,或在连续传递的过程中调整。

ApplyMathematicalLogicCommand

MathematicalFunctionCommand

通过将数学方法应用到一个图像的像素值来调整色相、饱和度和对比度,这些方法包括平方、平方根、对数、正弦和余弦,然后将结果与特定的因子相乘。

ApplyModalityLookupTableCommand

ApplyLinearModalityLookupTableCommand

当处理DICOM文件时,除了使用LookupTable重新映射像素值外,您还可以分别使用这两个类进行线性变换。

ApplyVoiLookupTableCommand

ApplyLinearVoiLookupTableCommand

当处理DICOM文件时,除了使用LookupTable设置窗位选项,还可以分别使用这两个类进行线性变换。

 

基于直方图的对比度方法

一些图像处理方法根据内部生成的直方图进行更复杂的对比度改进。直方图是一个可以反映图像中每个亮度值出现次数的表。

以下表格简单介绍了LeadTools中一些基于直方图的对比度方法:

类名

说明

HistogramContrastCommand

它与普通的ChangeContrastCommand类相似,唯一的不同之处是使用了图像特定的中间值。一般的对比度类会找出大于128的所有亮度值,并将这些值降到128以下。这个类首先在图像中找到中间亮度值,然后使用中间值替代128。使用这两个类中的任何一个,您都可以设置参数表明期望对比度提高的幅度。

StretchIntensityCommand

此类提高了低反差图像的对比度,同时保留了不同亮度值的原始数目。使用其他对比类时,在提高对比度时可能会在范围的最大和最小处丢失值。这个类将最低的亮度值设为0,将最高的亮度值设为255,然后按照比例重新映射原始值。如果原始值的均在0~255间,此函数无效。

LocalHistogramEqualizeCommand

这个类基于指定的颜色空间本地线性化一个图像中像素的数目。这可以调出图像暗区的一些细节,并平滑块之间的一些边缘。

HistogramEqualizeCommand

这个类在对比度改进时是带出隐藏细节最有效的方法。它重新均匀分布值,在亮度范围内平衡像素的数目。因此,原始图像中相同亮度的集群展开了,您就可以看到原始图像中非常细微的差别。

LightControlCommand

通过重新映射像素值调亮或调暗一个图像的整体或部分。这个类在可用的像素值范围内重新映射图像的像素值,来获得新的平均值。

AutoColorLevelCommand

通过将暗值调的更暗、亮值调的更亮,增强阴影、调亮图像。

ColorLevelCommand

将Color Leveling应用于图像中,它改变了图像的阴影、中间色调和高光。

HistogramCommand

使用此类获取12位或16位灰度图像的直方图。注意:只在Document/Medical工具包中支持12、16位灰度图像。

当您要自己创建一个基于直方图的方法时,需依照以下步骤

1.使用HistogramCommand 类 获取一个图像的直方图,

2.创建LookupTable操纵直方图。

3.使用RemapIntensityCommand类通过LookupTable改变图像的强亮度。

注意:在使用RemapIntensityCommand类之前,GetFunctionalLookupTableGetUserLookupTable提供了编程式更新LookupTable的方式。

亮度值是灰度级的值。当改变一个彩色图像的亮度值时,LEADTOOLS类实际上改变了每个颜色层的值。高级的类自动改变所有层的值,当您创建自己的类时,改变哪些层的值是由您决定的。使用HistogramCommandRemapIntensityCommand类,您可以操纵一个单独的颜色层,还可以指定主通道来操纵所有的颜色层。

对于彩色图像,您可以首先使用ColorSeparateCommand方法完成一个HSV分离,这样可以保留更多的本色。随后您可以操纵这些层,使用ColorMergeCommand方法重组颜色层。

在HSV颜色空间中,颜色由色相、饱和度和明度表示。这些值可以使用RemapHueCommand类映射。在HSV和RGB颜色空间之间转换时,可使用ToRasterColorFromRasterColor

专用的方法

 

DynamicBinaryCommand

不改变每个像素的位数,使用图像每个像素的本地阈值将图像转换为黑白图像。

MultiScaleEnhancementCommand

包括图像增强的技巧,例如对比度增强、边缘增强和区域调整,可用于计算机摄影(CR)。

SubtractBackgroundCommand

此类在校正不均匀亮度,特别是医学图像和灰度图像时很有用。这个方法使用了一个滚球算法,来决定哪些点是背景点。小的滚球半径确定了小的对象,大的半径确定了大物体和小物体。由于通常情况下图像较暗,因此该方法包括了与MultiplyCommand类似的方法,可以提高最终图像的亮度。

LeadTools试用版下载

了解LeadTools产品更多特性

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

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


关于葡萄城

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

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