RGB色彩模式使用RGB模型为图像中每一个像素的RGB分量分配一个0~255范围内的强度值。RGB图像只使用三种颜色,R(red)、G(green)、B(blue),就可以使它们按照不同的比例混合,在屏幕上呈现16777216(256 * 256 * 256)种颜色。
在电脑中,RGB的所谓“多少”就是指亮度,并使用整数来表示。通常情况下,RGB各有256级亮度,用数字表示为从0、1、2...直到255。
public Bitmap binarization() { Bitmap bitImage = new Bitmap(pictureBox1.Image);//二值化pictureBox1中的图片 Color c; int height = pictureBox1.Image.Height; int width = pictureBox1.Image.Width; for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { c = bitImage.GetPixel(j,i); int r = c.R; int g = c.G; int b = c.B; if ((r + g + b) / 3 >= 127) { bitImage.SetPixel(j, i, Color.FromArgb(255, 255, 255)); } else { bitImage.SetPixel(j, i, Color.FromArgb(0,0,0)); } } } return bitImage; }
膨胀是将与物体接触的所有背景点合并到该物体中,使边界向外部扩张的过程。
可以用来填补物体中的空洞。
用3x3的结构元素,扫描图像的每一个像素
用结构元素与其覆盖的二值图像做“或”操作
如果都为0,结果图像的该像素为0。否则为1
结果:使二值图像扩大一圈
膨胀(dilation)可以看做是腐蚀的对偶运算,其定义是:把结构元素B平移a后得到Ba,若Ba击中X,我们记下这个a点。所有满足上述条件的a点组成的集合称做X被B膨胀的结果。用公式表示为:D(X)={a | Ba↑X}=XB,如下图所示。图中X是被处理的对象,B是结构元素,不难知道,对于任意一个在阴影部分的点a,Ba击中X,所以X被B膨胀的结果就是那个阴影部分。阴影部分包括X的所有范围,就象X膨胀了一圈似的,这就是为什么叫膨胀的原因。
在下图中,左边是被处理的图象X(二值图象,我们针对的是黑点),中间是结构元素B。膨胀的方法是,拿B的中心点和X上的点及X周围的点一个一个地对,如果B上有一个点落在X的范围内,则该点就为黑;右边是膨胀后的结果。可以看出,它包括X的所有范围,就象X膨胀了一圈似的。
我设计了一个简单的膨胀算法,依次遍历整个图片的像素,分析每一个像素的周围八个像素,只要该像素周围存在黑色的像素,就设置该像素颜色为黑色。下面是使用膨胀算法处理经过二值化后的图像的C#实现代码:
public bool[] getRoundPixel(Bitmap bitmap, int x, int y)//返回(x,y)周围像素的情况,为黑色,则设置为true { bool[] pixels=new bool[8]; Color c; int num = 0; for (int i = -1; i < 2; i++) { for (int j = -1; j < 2; j++) { c = bitmap.GetPixel(x+i,y+j); if (i != 0 || j != 0) { if (255 == c.G)//因为经过了二值化,所以只要检查RGB中一个属性的值 { pixels[num] = false;//为白色,设置为false num++; } else if(0==c.G) { pixels[num] = true;//为黑色,设置为true num++; } } } } return pixels; }
public Bitmap expend() { Bitmap bitImage = new Bitmap(pictureBox2.Image);//处理pictureBox2中的图片 Bitmap bitImage1 = new Bitmap(pictureBox2.Image); int height = pictureBox1.Image.Height; int width = pictureBox1.Image.Width; bool[] pixels; for (int i = 1; i < width-1; i++) { for (int j = 1; j < height-1; j++) { if (bitImage.GetPixel(i, j).R != 0) { pixels = getRoundPixel(bitImage, i, j); for (int k = 0; k < pixels.Length; k++) { if (pixels[k] == true) { //set this piexl's color to black bitImage1.SetPixel(i, j, Color.FromArgb(0,0,0)); break; } } } } } return bitImage1; }
运行结果如图:
腐蚀是一种消除边界点,使边界向内部收缩的过程。可以用来消除小且无意义的物体。
用3x3的结构元素,扫描图像的每一个像素
用结构元素与其覆盖的二值图像做“与”操作
如果都为1,结果图像的该像素为1。否则为0。
结果:使二值图像减小一圈
把结构元素B平移a后得到Ba,若Ba包含于X,我们记下这个a点,所有满足上述条件的a点组成的集合称做X被B腐蚀(Erosion)的结果。用公式表示为:E(X)={a| Ba X}=X B。
下图中X是被处理的对象,B是结构元素。不难知道,对于任意一个在阴影部分的点a,Ba包含于X,所以X被B腐蚀的结果就是那个阴影部分。阴影部分在X的范围之内,且比X小,就象X被剥掉了一层似的,这就是为什么叫腐蚀的原因。
我设计了一个简单的腐蚀算法,一次遍历图像中每一个像素,检查它四周的八个像素,如果有白色的像素,则设置改点为白色。用二值化处理后的图片进行腐蚀算法C#代码如下:
public Bitmap corrode() { Bitmap bitImage = new Bitmap(pictureBox2.Image); Bitmap bitImage1 = new Bitmap(pictureBox2.Image); Color c; int height = pictureBox1.Image.Height; int width = pictureBox1.Image.Width; bool[] pixels; for (int i = 1; i < width - 1; i++) { for (int j = 1; j < height - 1; j++) { c = bitImage.GetPixel(i, j); if (bitImage.GetPixel(i, j).R == 0) { pixels = getRoundPixel(bitImage, i, j); for (int k = 0; k < pixels.Length; k++) { if (pixels[k] == false) { //set this piexl's color to black bitImage1.SetPixel(i, j, Color.FromArgb(255, 255, 255)); break; } } } } } return bitImage1; }
处理后图片变成:
先腐蚀后膨胀的过程称为开运算。用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积。
先膨胀后腐蚀的过程称为闭运算。用来填充物体内细小空洞、连接邻近物体、平滑其边界的同时并不明显改变其面积。
图像处理——灰度化、二值化、膨胀算法、腐蚀算法以及开运算和闭运算
原文地址:http://blog.csdn.net/hellousb2010/article/details/37939809