基于 C#遥感图像处理方法(代码实现)


 

C#图像处理基础

 

在编写图形程序时必须使用GDI(Graphics Device In-terface,图形设备接口)。使用C#语言进行图形图像编程过程中用到的是GDI+,GDI+是在GDI基础上的进一步完善,使用起来更加方便。用C#处理二维图形和图像的过程,是通过System.Drawing命名空间访问GDI+图形功能来完成的。System.Drawing命名空间的Graphics对象是GDI+的关键它封装了GDI+绘图表面,定义了绘制和填充图形对象的属性和方法,Windows窗体中的所有绘图操作都必须通过这个类来进行,这就相当于建立了一块画布,有了画布才可以用各种画图方法进行绘图。Bitmap对象封装了GDI+中的位图,用于处理由像素数据定义的数字图像,在该类中可以使用GetPixel和SetPixel获取或设置图像中指定像素的颜色。BitmapData对象描述了被锁定位图的相关属性,如Scan0、Height、Width属性等。在GDI+中通过Col-or结构封装对颜色的定义,ARGB表示一个颜色,由透明度(A)和红绿蓝(R,G,B)三基色组成,变化范围均用数值表示为0~255。

 

C#图像处理的常用方法

 

基于 C#语言有三种图像处理方法,分别为:直接提取像素法、内存法和指针法。这三种方法各有优缺点,直接提取像素法易于理解,方法简单,但运行时间最慢;内存法是把图像复制到内存中,直接对内存中的数据进行处理,速度明显提高,程序难度也不大;指针法因为直接应用指针来对图像进行处理,运行时间最快,但不易掌握。本文采用的是直接提取像素法进行编程,虽然运行时间较长,但是代码简单易懂,便于操作。

 

灰度化算法

 

将彩色图像转化成为灰度图像的过程称为图像的灰度化处理。因为彩色图像中的每个像素的颜色有R、G、B三个分量,其取值范围均为0~255,即每个分量有256个不同的取值,这样一个像素点就有1600多万(256×256×256)种不同的颜色值。灰度图像是R、G、B三个分量相同的一种特殊的彩色图像,其中一个像素点的变化范围仅为256种,因此在数字图像处理中一般先将彩色图像转变成灰度图像,可以减少后续图像处理的计算量。本文中图像灰度化处理采用的是加权平均法。

 

加权平均法是将彩色图像的三个分量以不同的权值进行加权平均。由于人眼对绿色的敏感最高,对蓝色敏感最低,因此,人们总结出下面这个加权平均公式,按下式对R、G、B三个分量进行加权平均可以得到一幅较合理的灰度图像[10],这也是目前被广泛使用的灰度化处理公式,如下:

 

f(i,j)=0.299R(i,j)+0.587G(i,j)+0.114B(i,j)

 

 

线性变换算法

 

由于人的眼睛只能分辨出大约二三十级的灰度级,而计算机灰度值的范围要大得多,具有256个灰度级,灰度值范围为0~255。通常原始遥感数据的灰度值范围都比较窄,这个范围比计算机具有的范围小很多;此外,由于灰度值会集中在某一段区间内,如图1就会造成遥感图像偏暗(b)、偏亮(c)和亮度过于集中(d)的现象,不会呈现均匀正态分布的正常(a)现象,因此就要改变对比度,进行伸缩图像处理。

 

 

辐射增强就是一种通过直接改变图像中像元的亮度值来改变图像的对比度,从而改善图像质量的图像增强技术。本文采用的是线性变换进行辐射增强,下面简单介绍一下其算法。

根据函数的特点可分为线性变换和非线性变换两种方法。如果变换函数是线性或分段线性的,这种变换即为线性变换。本文主要以线性变换为例,线性变换是按比例扩大原始灰度值的范围,这样使变换后图像的直方图的两达到饱和。例如,某一图像的最小灰度值为10,最大灰度值为60,经线性变换后,输出的最小值为0,最大值为255。

如图2所示,原始图像f(i,j)的灰度范围仅为[a1,a2],对比度较差;经线性变换后图像g(i,j)的灰度范围扩大为[b1,b2],达到增大对比度的效果。变换方程可写为

 

 

 

通过式(3)这个直线方程可以把任一个f(i,j)变换为g(i,j),从而使原来较窄的直方图变为范围较宽的直方图,这种变换也称为直方图拉伸。同样也可以进行图像压缩处理,使灰度范围缩小。通过这种线性变换,就可以达到简单的伸缩图像的目的。

 

 

 

C#程序代码

 

程序运行环境是硬件配置为CPU:core i3;内存:DDRⅢ2G;软件配置为 Microsoft Windows XP:Visual Studio2010;编程方法为直接提取像素法。

下面代码用来呈现遥感图片原始图,灰度化和线性变换后的遥感图片用同样的方法呈现出来。

private void panel1_Paint(object sender,PaintEventArgs e)

  if(null==bmStart)return;

  Graphics g=e.Graphics;//这里打个比方就是相当于生成了一张画布,用来画画

  g.DrawImage(bmStart,0,0,this.panel1.

Width,this.panel1.Height);//这里就是将我们读到的图像画到画布上

 

下面 代 码 用 来 实 现 遥 感 图 片 的 灰 度 化 和 线 性 变 换 处理。

if(max!= min)

//下面是实现线性变换的式子

  if(Math.Abs(((255/(max-min)* (r-min))+ max))> 255)

    return r;

  else

    return Math.Abs(((255/(max-min)*(r-min))+max));

else

  return r;

//下面是实现灰度化处理的式子

for(int i=0;i<bm.Width;i++)

 for(int j=0;j<bm.Height;j++)

 {

  myColor=bm.GetPixel(i,j);

  int ret=(int)(myColor.R*0.299+myColor.G*0.587+myColor.B*0.114);

  bm.SetPixel(i,j,Color.FromArgb(ret,ret,ret));

  }

 

6  实验结果

 

由这两幅遥感图片的实验结果可以看出,灰度化图像与彩色图像相比,仍然反映了整幅图像的整体和局部的色度和亮度等级的分布和特征,但像素点的变化范围远远小于彩色图像,简化了后续的图像处理工作;线性变换后的图像与灰度化图像相比,图像进行拉伸处理后,灰度范围明显扩大,对比度增强,更容易进行分析辨别,图像处理效果很好。

 

 

 

 

 

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页