本人本科小菜一个,南方某山中大学就读,今年大四,临近毕业,哎,论文虐我千百遍,我对论文如初恋,最近都在死理拼命赶,但是无奈结果还是那样,出不来,于是乎,想在这里愤青一把。
毕业论文做的是交通图像处理题目---基于视频图像处理的交通标线识别,其实一开始想做电动车信息采集系统的开发的,而且那个系统我在大二大三参加本田节能竞技大赛的时候有实际开发过,有了差不多两年的积累,但是后来想到要去广汽,那么就必须学点高端大气上档次的东西啊,于是乎直接扭头,奔向本院的老师,学习图像处理相关知识。结缘图像处理是在大三的下一个学期,那个时候很多人都准备忙着保研,出国,找工作。对于选修课大伙都是兴趣不高,认为修个学分就可以了,于是在修读图像处理这门课程的时候,班里的学习氛围不高,本来选修的人数就少得可怜,但是每次居然去的还只有那么几个,虽说这样子,但是我还是还认真地修读了这门课程,而且收益匪浅啊。
选择了图像处理,现在想想感觉走到了一个不归路,╮(╯▽╰)╭,因为这条路远远没有自己想象的那么容易,实则坎坷啊。
路漫漫其修远兮,吾将上下而求索!
每次遇到困难,心里总是用这一句话来勉励自己,哎,谁叫自己选了呢!既然选择了,就应该义无反顾地往前走。
还是回归到主题了吧,写论文。。。。。。。。。。。。。。。
图像处理的前提,图像预处理,一开始就查找了很多关于图像预处理的论文,包括图像灰度化、图像增强、直方图均衡化等一些相关论文,其中基于模糊集理论的图像直方图均衡化和基于RGB模型的直方图均衡化效果还是比较理想的。
基于RGB模型的直方图均衡化程序如下:
private void button10_Click(object sender, EventArgs e) //基于RGB模型的直方图均衡化
{
myTimer.ClearTimer();
myTimer.Start(); //开始计算时间
if (curBitmap != null)
{
Rectangle rect = new Rectangle(0, 0, curBitmap.Width, curBitmap.Height);
System.Drawing.Imaging.BitmapData bmpData = curBitmap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, curBitmap.PixelFormat);
IntPtr ptr = bmpData.Scan0;
int bytes = curBitmap.Width * curBitmap.Height;
byte[] rgbValues = new byte[bytes * 3];
System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes * 3);
double[] hue = new double[bytes];
double[] sat = new double[bytes];
byte[] inten = new byte[bytes];
double r, g, b;
for (int i = 0; i < bytes; i++)
{
r = rgbValues[i * 3 + 2];
g = rgbValues[i * 3 + 1];
b = rgbValues[i * 3];
double theta = Math.Acos(0.5 * ((r - g) + (r - b)) / Math.Sqrt((r - g) * (r - g) + (r - b) * (g - b) + 1)) / (2 * Math.PI);
hue[i] = ((b <= g) ? theta : (1 - theta));
sat[i] = 1.0 - 3.0 * Math.Min(Math.Min(r, g), b) / (r + g + b + 1);
inten[i] = (byte)((r + g + b) / 3);
}
inten = equalization(inten);
for (int i = 0; i < bytes; i++)
{
r = rgbValues[i * 3 + 2];
g = rgbValues[i * 3 + 1];
b = rgbValues[i * 3];
hue[i] = hue[i] * 2 * Math.PI;
if (hue[i] >= 0 && hue[i] < 2 * Math.PI / 3)
{
b = inten[i] * (1 - sat[i]);
r = inten[i] * (1 + sat[i] * Math.Cos(hue[i]) / Math.Cos(Math.PI / 3 - hue[i]));
g = 3 * inten[i] - (r + b);
}
else if (hue[i] >= 2 * Math.PI / 3 && hue[i] < 4 * Math.PI / 3)
{
r = inten[i] * (1 - sat[i]);
g = inten[i] * (1 + sat[i] * Math.Cos(hue[i] - 2 * Math.PI / 3) / Math.Cos(Math.PI - hue[i]));
b = 3 * inten[i] - (r + g);
}
else //if (h >= 4 * Math.PI / 3 && h <= 2 * Math.PI)
{
g = inten[i] * (1 - sat[i]);
b = inten[i] * (1 + sat[i] * Math.Cos(hue[i] - 4 * Math.PI / 3) / Math.Cos(5 * Math.PI / 3 - hue[i]));
r = 3 * inten[i] - (g + b);
}
if (r > 255)
r = 255;
if (g > 255)
g = 255;
if (b > 255)
b = 255;
rgbValues[i * 3 + 2] = (byte)r;
rgbValues[i * 3 + 1] = (byte)g;
rgbValues[i * 3] = (byte)b;
}
System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes * 3);
curBitmap.UnlockBits(bmpData);
myTimer.Stop();
textBox1.Text = myTimer.Duration.ToString("####.##");
Invalidate();
}
}
均衡前后对比,效果非常明显,
后来,在进行边缘检测的时候,我发现基于RGB模型的sobel处理起来,可以把灰度图化-直方图均衡化--中值滤波三个步骤省了,是在是非常不可思议。
现在做到Hough直线检测那块了,但是Hough变换思想有点混乱,所以还没有编程实现~~~