最近在学习基于C#的图像处理,说白的了是使用C#对图像进行处理。 头开始学图像处理环境是VC + Opencv,新手小白艰苦的把Opencv装起来了 ,用了一段时间的opencv函数,后来老师要求使用C#自己写函数实现图像处理的算法,查了很多书和资料。
现在把自己实现的,简单的图像处理的算法系统的编排下。 因为编程很菜,有些算法有些幼稚冗杂,以后会慢慢改进。
在写实现图像遍历前,先了解下数字图像的基本概念 以及 数字图像的基本格式
数字图像概念:http://baike.baidu.com/view/286845.htm
数字图像格式:http://baike.baidu.com/view/13674.htm
注:格式知道 什么是单通道 什么的多通道 以及图像实际宽度 和 系统默认的编排宽度 就行了,当然如果你能全部了解一下更好。
单通道图像(灰度图)一个像素占一个字节。
多通道例如 24rgb 每个色彩占各占一个字节。 (红、绿、蓝各占一个字节)
我们主要使用 24Rgb 格式。
初步了解了数字图像的基本概念接下来对图像进行简单的遍历。
源码:
public static byte[] ChangeByte(Bitmap tp)
{
int w = tp.Width; // 图像实际宽度
int h = tp.Height; // 图像实际高度
BitmapData srcdata = tp.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadOnly,
PixelFormat.Format24bppRgb); // 将图像锁入内存,只读,图像格式为rgb格式
byte[] pixeData = new byte[h * w]; // 声明一个与图像等大的数组,因为每个像素点的(灰度)值
// 范围为 0 - 255 所以使用byte数组
int sride = srcdata.Stride; // 获取图像的系统宽度(字节数)
unsafe // C#使用指针时需要在unsafe中使用,
{ // C#默认不支持unsafe,使用时在项目 -》选项 -》生成中设置
byte* temp = (byte*)srcdata.Scan0.ToPointer(); // 获取图像锁入内存的首地址
for (int i = 0; i < h; i++)
{
for (int j = 0; j < w; j++)
{
pixeData[i * w + j] = temp[0]; // 我们只获取第一个色彩的值,对于灰度图像
// red blue green 像素值相等
temp += 3; // 跳过其余两色
}
temp += sride - w * 3; // 加上系统对齐的宽度
}
}
tp.UnlockBits(srcdata); // 解锁
return pixeData;
}
好了,通过图像遍历,将pictureBox 中的 灰度bitmap变量转变为一维数组,方便进一步的图像处理。