2 基于Visual C++ 2008 的编程框架
2.1 编程框架的作用
从广义上来讲,将图像描述为一种通用的数据结构,并封装图像处理的外围功能,如图像的读取、显示和存储,从而使使用者能够关注于图像内容处理的本身。从狭义上来讲,数字图像处理编程框架的推出,是针对C/C++语言在数字图像处理中的优劣势,目标是能够做到扬长补短,可以使用C/C++语言相对轻松的完成数字图像处理功能。
2.2 编程框架的构建和经典的图像处理流程
编程框架提供了一个很好的数字图像处理环境,这个框架的构建流程并不复杂,大致分为三个步骤:
①建立一个新的多文档应用程序
②添加数字图像处理编程框架
③添加图像读取、显示和存储功能
一个经典的图像处理流程是首先获取图像的像素尺寸(高度和宽度),然后逐行(从上至下)逐列(从左至右)的遍历图像数据的每一个像素进行处理。代码如下:
long image_height = color.Get_height();
long image_width = color.Get_width();
for( int row = 0; row < image_height; row ++ )
for( int column = 0; column < image_width; column ++ )
{
// [ 具体处理代码 ]
}
2.3 编程框架的优势
使用动态一位数组表示图像,主要存在两个困难:一是相对于动态二文数组而言,像素定位不方便;二是由数组越界造成的内存泄露。对于行号为row列号为column的像素定位,动态二文数组可以表示为image[row][column],动态一位数组则表示为image[row*width+column],其中width为图像image的宽度。关于语句image[row*width+column],编程中width极易写错或者漏写,不但容易造成内存泄露,而且会消耗程序员的额外精力。原则上,对于一个像素的定位只需要行号和列号的信息,而不需要图像宽度等信息。至于数组越界引起的内存泄露,这是所有动态数组的通病,而不仅仅局限于动态一位数组。
2.4 编程框架中的具体类实现
图2.1 编程框架的类实现
3 晶片图像的预处理
由于本次课题的工作是进行晶片内部的缺陷检测,因此无需考虑边缘的缺陷,比如缺角等。所以主要致力于晶片内部的污点、划痕、裂缝等,最后给出具体数据。
3.1 24位真彩色位图转为8位灰度图
由于原始图片是G格式,不便于处理,经过转换格式后变为BMP格式,是24位真彩色位图。真彩色位图虽然能反应更多的信息,数据完整,但是占据的存储空间也大得多,处理起来更加复杂、耗时。并且现有的图像处理算法大都是基于灰度图的,因此彩色图像的灰度化是图像处理的前提。
关于24位真彩色位图转换成灰度图,常用的有两种方法:
(1)首先创建好256色灰度图调色板,然后根据人眼的视觉特征把真彩色位图中每个像素的RGB三分量提取出来,按照如下公式[12]:
Y=0.299R+0.587G+0.114B
转换,其中Y即为转换之后的单个像素灰度值,R为单点像素的红色分量,G为绿色分量,B为蓝色分量,这个公式通常都被称为心理学灰度公式,因为科学家发现使用上述公式进行转换时所得到的灰度图最接近人眼对灰度图的感觉。
(2)很复杂但效果较好的八叉树颜色量化算法[13],这种颜色量化算法实现起来难度较大,除了专门的图像处理软件之外,一般很少使用,这里不便采用。
在经过实验和测试后,发现已有的这些图片经过第一种方法转化后的灰度图,对应像素的灰度与原图中像素的绿色分量基本相同,甚至绿色分量中包含了更多的信息。因此,使用绿色分量值作为灰度值,即Y=G。 VC++晶片内部缺陷处理+文献综述(4):http://www.youerw.com/jisuanji/lunwen_3066.html