这是我入门机器视觉的系列学习经验之开篇,本来想着依靠opencv快速实现一些功能,但是想了一下既然是学数学的,还是应该自己多算算,写一些自己理解的东西才好。
入门篇很简单,就只是实现了转化成灰度图以及模糊(去噪点),模糊功能写得很简单。文章基于C#实现。
首先新建一个winform程序,添加一个picturebox和一个botton按钮,在解决资源管理器里面新建一个类,本文我取名为Greyand3_3.cs,
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Drawing; namespace roberts { class Greyand3_3 { //转化成灰度图且3*3平均模糊 public Image GreyMethod(Image testimage) { Bitmap newGreyImage; newGreyImage = new Bitmap(testimage); Color pixelColor; ; double T; ; //转换成灰度图 ; i < newGreyImage.Width; i++) { ; g < newGreyImage.Height; g++) { pixelColor = newGreyImage.GetPixel(i, g); newUnitColor = (pixelColor.R + pixelColor.G + pixelColor.B) / ; Color newColor = Color.FromArgb(newUnitColor, newUnitColor, newUnitColor); newGreyImage.SetPixel(i, g, newColor); } } //3*3去除噪点 ; m < newGreyImage.Width - ; m++) { ; n < newGreyImage.Height - ; n++) { ; x < 3; x++) { ; y < 3; y++) { pixelColor = newGreyImage.GetPixel(m + x, n + y); AverageColor = pixelColor.R + AverageColor; } } AverageColor = Math.Round(AverageColor / ); int XYA = Convert.ToInt32(AverageColor); || XYA < ) { XYA = ; } newGreyImage.SetPixel(m, n, Color.FromArgb(XYA, XYA, XYA)); } } return newGreyImage; } } }
引用system.Drawing,处理图像需要使用该命名空间的Bitmap。首先转换成灰度图按照公式:newcolor = (R + G + B) /3 即可。
实现过程使用两个for循环完成(x方向和y方向),Color 用来存储颜色,Getpixel表示获取当前像素的颜色,Setpixel表示修改当前像素的颜色。
3*3模糊
由于噪点通常会出现亮度突增的情况,因此对其取九宫格平均值可以降低其亮度,只要在循环里计算求值&赋值就好了。使用math.round的使用总是出错,应该是对黑色区域取整的时候取大了,因此对于大于255的值一律赋值为255.
写得十分简单,实现本来也容易,这个方法的效果并不好,后面使用Gauss的时候会好一点,但是在笔记本上跑得真的蛮慢的。
效果如下: