cdut

导航

数字图像处理算法(三)---灰度图的线性点运算

灰度图通过下列公式可以将原图片转化成任意的灰度图

G(X,Y)=PF(X,Y)+L

其中G表示输出图像,F表示输入图像,P表示斜率,L表示偏移量

对于斜率P:

如果P>1,图像的对比度减小

如果1>P>0,图像的对比度将增大

如果P=0,变化L的大小,图像会变亮或是变暗

如果P<0,图像将取补

 

先贴实例图片

运行船体程序

选择一张图片(这里选取的是一张24位的BMP图片)

点击“线性点运算”按钮

输入斜率P和偏移量L

得到的结果

对于前几部的代码不在标记,只对最后通过线性点运算公式写出代码

 

1 private void button3_Click(object sender, EventArgs e)
2 {
3 if (curBitmap != null)
4 {
5 linerOPForm form = new linerOPForm();
6 form.ShowDialog();
7 if (form.DialogResult == DialogResult.OK)
8 {
9 //获得整个图像每个像素的灰度值了
10   Rectangle rect = new Rectangle(0, 0, curBitmap.Width, curBitmap.Height);
11 //定义图像的位图
12   BitmapData bmpData = curBitmap.LockBits(rect, ImageLockMode.ReadWrite, curBitmap.PixelFormat);
13 //获得位图在内存中的首地址
14   IntPtr ptr = bmpData.Scan0;
15 int bytes = curBitmap.Width * curBitmap.Height * 3;
16 byte[] grayValues = new byte[bytes];
17 //将内存中的位图信息复制到数组中
18 System.Runtime.InteropServices.Marshal.Copy(ptr, grayValues, 0, bytes);
19 //获得斜率
20 double a = Convert.ToDouble(form.Scaling);
21 //获得偏移量
22 double b = Convert.ToDouble(form.Offset);
23 int temp = 0;//当前的灰度值
24 for (int i = 0; i < bytes; i += 3)
25 {
26 //通过线性点运算公式获得新的灰度值
27 temp = (int)(a * (grayValues[i] * 0.299 + grayValues[i + 1] * 0.587 + grayValues[i + 2] * 0.114) + b + 0.5);//加0.5表示四舍五入
28 if (temp > 255)
29 {
30 grayValues[i] = grayValues[i+1] = grayValues[i+2] = 255;
31 }
32 else if (temp < 0)
33 {
34 grayValues[i] = grayValues[i + 1] = grayValues[i + 2] = 0;
35 }
36 else
37 {
38 grayValues[i] = grayValues[i + 1] = grayValues[i + 2] = (byte)temp;
39 }
40 }
41 System.Runtime.InteropServices.Marshal.Copy(grayValues, 0, ptr, bytes);
42 curBitmap.UnlockBits(bmpData);
43 }
44 }
45 Invalidate();
46 }

 

posted on 2010-11-08 22:05  cdut  阅读(1192)  评论(0编辑  收藏  举报