常君明 冯 頔 陈 庆 陈 欢 李真珍
(江汉大学数学与计算机学院 武汉 430056)
随着科学技术的不断发展,各种图像处理技术层出不穷。图像拾取是指从图像中有目的地选取所需部分,特别是在复杂背景下,对图像中需要部分进行操作,就要将拾取出来的图像分割出来,以便对该图像作进一步的操作处理。图像拾取交互是图形系统的重要功能之一[1]。从原始图像上选取要操作的一部分,即操作区域,而平移、修改、放缩、旋转和删除等操作都是以拾取图形或以拾取图形的某一位置点为基础的。
本文在对传统图像拾取算法的基本原理进行分析的基础之上,提出了一种新的图形拾取算法。算法的核心是寻找图像拾取速度、拾取准确性这两个方面平衡。在Visual C++6.0平台下将其实现。实践表明,本文拾取算法适合交互系统中具有很好的适用性。
鼠标点击图像,便可拾取图像上的种子点[2],拾取点坐标方法如下:
SetCapture();
RECT rect;//左右上下长度LONG类型;
GetClientRect(&rect);//该函数获取窗口客户区的坐标。坐标原点(0,0)在客户区左上角;
ClientToScreen(&rect);//该函数将指定点,或者矩形的用户坐标转换成屏幕坐标。
图像的每个像素点的颜色都是由三个分量组成的,是通过对红(R)、绿(G)、蓝(B)三个颜色分量的变化以及它们相互之间的叠加来得到各式各样的颜色。使用RGB模型为图像中每一个像素的RGB分量分配一个0~255范围内的强度值。每种RGB成分都可使用从0(黑色)到255(白色)的值。当所有三种成分值相等时,产生灰色阴影。当所有成分的值均为255时,结果是纯白色;当该值为0时,结果是纯黑色[3]。
获取图像中像素点颜色值的方法如下:
首先读取图像的r、g、b各分量值;r、g、b分量值相加不等于765,即点不为白色时,每个分量的值是从0~255,三个分量r、g、b全为255时表示的是白色。
程序中当读取图像后,直接计算出种子点r、g、b各个分量值,计算方法如下:
其中q0为图像地址指针;w0为图像行宽。此处需要注意一点,在图像的像素点结构中,各个分量是以b、g、r的顺序排列的,因此计算时也应该以这样的顺序来依次计算分量值。
本文中查找拾取目标图像边缘是基于四连通遍历思想,所谓四连通是指从种子点出发,在上、下、左、右四个方向对图像进行遍历[4~5],如图1所示。常规四连通算法是需要大量栈空间来存储相邻的点。一个改进的方法就是:通过沿扫描线填充水平像素段,来处理四连通相邻点,这样就仅仅只需要将每个水平像素段的起始位置压入栈,不需要将当前位置周围尚未处理的相邻像素都压入栈,从而可以节省大量的栈空间。
图1 四连通示意图
基于四连通图像拾取算法流程如图2所示。首先用鼠标选择种子点,然后从种子点出发,用四连通遍历图像,将符合条件的点一一入栈,判断图像中的点是否符合拾取要求,将边缘点找出,并用给定的属性进行描述,如设置为给定颜色或者其他属性。
图2 基于四连通拾取算法流程图
容差指在选取颜色时所设置的选取范围,容差越大,选取的范围也越大,理论上容差范围可以是0~255之间的任何数值,可根据实际应用的需要来进行选择。容差是0的时候,就只能选择相同的颜色,容差越大那么颜色就可以越广泛。比如:容差是0的时候,如果选择的是纯蓝色,那么只能选中百分之百的蓝色,如果容差是20,那么就可以选中稍微淡蓝还有深蓝,当容差很大的时候,那么就会把所有的颜色都选中了[6~7]。
文中算法设置容差参数,就是为了在图片情况复杂时,能够成功选择想要选择的区域。每张图片的情况都是不一样的,图片中的颜色也都不一定是纯色的,如果不设置容差,那么算法就很难适应各种情况复杂的图片,也就不能成功选取所要选择的区域。
判断容差范围用这个语句就可以:
容差为10系统拾取的效果如图3所示。容差为20时拾取的效果如图4所示。
图3 容差为10时拾取效果
图4 容差为20时拾取效果
图5 脸部拾取效果
图形图像处理需要大量的数据运算,通常比较耗时。因此,交互式图形图像处理选择合适的语言进行算法的描述显得尤为重要。系统设计采用功能强大的可视化应用程序开发工具Visual C++6.0[10]。图5所示为文物脸部拾取效果图。实践表明,系统设计交互简洁、兼容性强、拾取效果好、运行速度快。
[1]岳文理,王坚,戴毅茹.交互式图形系统中图形拾取算法的研究与应用[J].机电产品开发与创新,2008.21(2):3~4
[2]向世明.Visual C++数字图像与图形处理[M].北京:电子工业出版社,2002
[3]何斌,马天予.Visual C++数字处理[M].第二版.北京:人民邮电出版社,2002
[4]孔令德.计算机图形学基础教程:Visual C++版[M].北京:清华大学出版社,2008
[5]和青芳.计算机图形学原理及算法教程:Visual C++版[M].北京:清华大学出版社,2005
[6]徐慧.Visual C++数字图像使用工程案例精选[M].北京:人民邮电出版社,2004
[7]穆晓芳.数字图像处理技术[M].北京:煤炭工业出版社,2009
[8]常新立,徐东平.基于图元的手绘几何图形识别[J].计算机与数字工程,2008,36(12)
[9]刘慧杰,靳海亮.基于VC++的OpenGL三维图形开发设计[J].计算机与数字工程,2010,37(7)
[10]耿迅.VC图像处理—界面设计及总结[J].电脑编程技巧与维护,2006(3):68~72