利用Visual C#处理数字图像(2)

转载 2007年09月21日 23:21:00
【导读】本文通过一个简单的实例向大家展现了用Visual C#以及GDI+完成数字图像处理的基本方法
 
注:由于是要编译不安全代码,所以得将项目属性页中的"允许不安全代码块"属性设置为true,图示如下:

 



该函数实现的程序效果如下:



(处理前)





(处理后)

 

Gray()函数的算法如下:

public static bool Gray(Bitmap b)

{

BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height),

ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

int stride = bmData.Stride;

System.IntPtr Scan0 = bmData.Scan0;

unsafe

{

byte * p = (byte *)(void *)Scan0;

int nOffset = stride - b.Width*3;

byte red, green, blue;

for(int y=0;y
{

for(int x=0; x < b.Width; ++x )

{

blue = p[0];

green = p[1];

red = p[2];

p[0] = p[1] = p[2] = (byte)(.299 * red + .587 * green + .114 * blue);

p += 3;

}

p += nOffset;

}

}

b.UnlockBits(bmData);

return true;

}

本函数完成的功能是对图像进行灰度处理,我们的基本想法可是将每个象素点的三种颜色成分的值取平均值。然而由于人眼的敏感性,这样完全取平均值的做法的效果并不好,所以在程序中我取了三个效果最好的参数:.299,.587,.114。不过在这里要向读者指明的是,在GDI+中图像存储的格式是BGR而非RGB,即其顺序为:Blue、Green、Red。所以在for循环内部一定要设置好red、green、blue等变量的值,切不可颠倒。函数执行成功后,同样返回true值。

该函数实现的程序效果如下:



(处理前)



(处理后)

Brightness()函数的算法如下:
public static bool Brightness(Bitmap b, int nBrightness)

{

if (nBrightness < -255 || nBrightness > 255)

return false;

BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width,

b.Height), ImageLockMode.ReadWrite,

PixelFormat.Format24bppRgb);

int stride = bmData.Stride;

System.IntPtr Scan0 = bmData.Scan0;

int nVal = 0;

unsafe

{

byte * p = (byte *)(void *)Scan0;

int nOffset = stride - b.Width*3;

int nWidth = b.Width * 3;

for(int y=0;y
{

for(int x=0; x < nWidth; ++x )

{

nVal = (int) (p[0] + nBrightness);

if (nVal < 0) nVal = 0;

if (nVal > 255) nVal = 255;

p[0] = (byte)nVal;

++p;

}

p += nOffset;

}

}

b.UnlockBits(bmData);

return true;

}

本函数完成的功能是对图像进行增亮处理,它比上面两个函数多了一个增亮参数-nBrightness,该参数由用户输入,范围为-255~255。在取得了增亮参数后,函数的unsafe代码部分对每个象素点的不同颜色成分进行逐个处理,即在原来值的基础上加上一个增亮参数以获得新的值。同时代码中还有一个防止成分值越界的操作,因为RGB成分值的范围为0~255,一旦超过了这个范围就要重新设置。函数最后执行成功后,同样得返回true值。

该函数实现的程序效果如下:



首先,我们把图像增亮的参数设置为100(其范围为-255~255),然后执行效果如下,读者也可尝试其他的参数值。



(处理前)


 

利用Visual C#处理数字图像

引言:   微软的新的.NET平台为开发者带来了许多新的诸如GDI+、Globalization之类的编程机制,同时还发明了一门全新的类似Java的编程语言-C#。对于这些新知识,我们应尽快了解、掌握...
  • yudehui
  • yudehui
  • 2004年01月30日 19:23
  • 1524

利用Visual C#处理数字图像1

更新时间:2005-09-30 09:55关 键 词:C#阅读提示:本文通过一个简单的实例向大家展现了用Visual C#以及GDI+完成数字图像处理的基本方法  本文就通过一个简单的实例,向大家展示...
  • yjyb
  • yjyb
  • 2007年09月21日 23:20
  • 631

Win8 Metro(C#)数字图像处理--2.39二值图像投影

[函数名称]   二值图像投影         ImageProjection(WriteableBitmap src) [算法说明] [函数代码] /// ///...
  • Trent1985
  • Trent1985
  • 2015年04月14日 12:34
  • 1056

【140810】VC++数字图像模式识别技术及工程实践pdf电子书

VC++数字图像模式识别技术及工程实践pdf电子书,本书介绍模式识别和人工智能中的一些基本理论和相关模型,比如神经网络、聚类技术、线性差别函数等,同时结合了模式识别中的一些经典问题,比如人脸检测、车牌...
  • qutadi
  • qutadi
  • 2014年08月10日 09:59
  • 1892

[Coursera 数字图像和视频处理基础 第二周]Signals and Systems

信号和系统 1.2D和3D离散信号 2.复指数信号 3.线性移位不变系统 4.二维卷积 5.空间域过滤(Filtering in the spatial domian))...
  • abc8730866
  • abc8730866
  • 2016年09月22日 19:35
  • 946

C#数字图像处理<一>

C#数字图像处理基础 Bitmap类,BitmapData类和Graph
  • u013488148
  • u013488148
  • 2014年09月26日 10:07
  • 1043

visual C++数字图像处理类

由于现在手头的学习是关于图像处理的,有些技能肯定迟早要用上,于是决定利用假期学习Visual C++的相关知识。 今天是第一天,主要学习使用visual c++进行面向对象编程的基本方法。并给出数字...
  • a1154761720
  • a1154761720
  • 2015年01月21日 22:53
  • 1746

数字图像处理:第四章 点运算

第四章 点运算 目录 引言线性点运算非线性运算伪彩色 作业 1. 引言 点运算将输入图象映射为输出图象,输出图象每个象素点的灰度值仅由对应的输入象素点的值决定。它常用于改变图...
  • GarfieldEr007
  • GarfieldEr007
  • 2015年12月01日 21:48
  • 2492

Win8Metro(C#)数字图像处理--2.29图像除法运算

[函数名称] 图像除法函数DivisionProcess(WriteableBitmap src, WriteableBitmap divSrc) [函数代码] /// ...
  • Trent1985
  • Trent1985
  • 2015年04月10日 13:01
  • 904

matlab编程之傅里叶变换

第一部分 图像的傅立叶变换 一、   实验目的 1.了解图像变换的意义和手段; 2. 熟悉傅里叶变换的基本性质; 3. 熟练掌握FFT的方法及应用; 4. 通过实验了解二维频谱的分布特点; ...
  • llw01
  • llw01
  • 2013年07月06日 20:21
  • 1258
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用Visual C#处理数字图像(2)
举报原因:
原因补充:

(最多只允许输入30个字)