信号与系统matlab大作业项目报告
项目名称
函数图像中的样本点提取与坐标识别
设计思路
首先需要能够识别出坐标轴,确定图像的范围;然后识别出要分析的采样点;最后使用线性插值的方法把图像像素位置变换为坐标。
项目实现
图像输入
matlab内置了对多种图片格式的支持,包括jpg,png,bmp,tif,gif,eps等主流图片格式。这个不是项目的重点。
坐标轴识别
坐标轴是比较规则的直线,而且长度较长,因此使用图形学中比较常用Hough算法进行直线检测。Hough算法的原理很简单,使用了一个坐标映射,把直线从笛卡尔坐标系变换到极坐标系,过一个点的所有直线被映射为一条正弦曲线,而一条直线被映射为一个点。应用这种对偶性,可以把采样点在一条直线上出现的频率映射为极坐标系像素点的强度。强度越高,说明出现在这条直线上的样本点越多,亦即所要识别的直线。
matlab提供了工具箱来支持Hough算法。先把RGB图像转换为黑白二值图像,图像去反,使黑色区域变为白色成为我们关心的样本数据。依次调用hough,houghpeaks,houghlines来获得图像的Hough变换结果,提取图像峰值然后反映射到原始图像中。通过设置合适的阈值和精度,能够很好的识别图像的坐标轴。
结果图如下(绿框标识):
样本点采集
综合考虑算法的复杂性、精确性和易用性,使用了两种方法进行样本点的采集。一种方法由用户依次点击每一个要识别的点,使用ginput可以让用户自己确定要获得哪些数据,这种方法用户自主性强,数据采集更精确,但是用户操作要求较高,不适合大规模数据。第二种方法采用简单的模式识别技术,用户点选一条曲线,系统获取用户点击位置11*11范围内的颜色,过滤掉白色得到用户需要选择的曲线色彩,然后用着个颜色过滤原始图片,提取出这条曲线。然后用一个11*11的窗口扫描图像,统计某一点邻域内该颜色的频度,最后获得频度矩阵的极大值作为曲线上的数据标记符号。
计算矩阵极大值的方法如下:先获取每一列的最大值,得到一个一维向量。然后顺次遍历这个向量每个元素,如果数值在一直增加后开始下降,即把它作为几个极大值;为了避免微小扰动,采取了两个剪枝处理,一是极大值与全局最大值之间的差距要在阈值范围内,二是极大值与上一极大值距离要达到一定阈值。
结果如下(红点标识):
坐标映射
以上步骤获得了样本点在图像上的像素位置,接下来要做的是把像素坐标映射为实际坐标。这个过程比较简单,只需要使用一个线性插值就可以。
界面设计
使用matlab提供的gui工具设计界面,用户直观性强,操作更方便。
使用指南
启动程序
打开图片
输入坐标轴范围
选择识别一条曲线,单击要操作的曲线
运行结果
也可以手动选择要处理的样本点
运行结果
实验测试结果
项目总结
项目不是太复杂,属于基本的matlab应用。通过这一个项目,对matlab语言有了更深入的理解,对matlab以矩阵为基本数据模型的操作技巧更加熟练。没有用到非常复杂的算法,目前仅仅是通过遍历图片各像素的方法识别样本数据,在图像处理速度上还有待提高。由于时间有限,很多功能没有添加进来,比如对算法阈值的用户自定义,图像的降噪,这些都有待进一步完善。
参考资料
http://en.wikipedia.org/wiki/Hough_transform
http://www.mathworks.com/help/toolbox/images/ref/hough.html
测试数据: