图像处理 – 识别刻度
需求:
1.从图片文件夹中挑选出清晰度最高的一张图片,删除剩余;
2.算法识别最左端的刻度线,以中间直线为基准,从左向右扫描检测区域,
识别每一条刻度的边缘,一直扫描到不再有灰度的变化为止,根据刻度
线条的个数得到刻度值,如:测到三根刻度线,两根线之间为 0.5mm,与
10 作差,取绝对值,|10-(3-1)*0.5)|=9mm。
3.保存处理的图片,并把测量结果显示到图片上。
思路:
- 使用方差进行清晰度比较;
- 二值化生成0,1组成txt 文件,可以通过数字图像轮廓计算获得测量值;
第一步:(计算文件夹中所用图片方差):
/// <summary>
/// 计算图片清晰度
/// </summary>
/// <param name="bmp">目标图片</param>
/// <returns>返回方差值</returns>
public static int CalculateDefinition(Bitmap bmp)
{
//灰度值
List<byte> list = new List<byte>();
//平均值
int average = 0;
for (int i = 0; i < bmp.Width; i++)
{
for (int j = 0; j < bmp.Height; j++)
{
//获取该点的像素的RGB的颜色
Color color = bmp.GetPixel(i, j);
byte gray = (byte)(0.299f * color.R + 0.587f * color.G + 0.114f * color.B);
list.Add(gray);
average += gray;
Color newColor = Color.FromArgb(gray, gray, gray);
}
}
//获取平均值
average = average / (bmp.Width * bmp.Height);
//计算方差
int sum = 0;
for (int k = 0; k < list.Count; k++)
{
sum += (list[k] - average) * (list[k] - average);
}
sum = sum / (bmp.Width * bmp.Height);
return sum;
}
第二步(选中的图片进行二值化)
/// <summary>
/// 二值化图像
/// </su