有人吗?有人吗?帮我看个算法题~~~~~~~ 如图啊,怎么求出那些左面图上的特征点(红色的点)的位置区域,并且要求出这些特征点分别是什么类型的,类型的种类在右面。这个算法怎么设计比较好?望高手不吝赐教~!谢谢:) 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 哦,这样啊算法我已经想到,给个大概思路第一步:扫描红点,并记录下红点坐标(按条件扫描,比如红点的大小,长宽比例在多少范围内则记录)第二步:循环红点,每个红点做4个方向的黑线扫描(黑线扫描算法要另写),根据4个方向的扫描结果判断出红点的类型。第三步:输出结果。over 遍历的算法并不复杂。实际上其时间复杂度和你载入图片是一样的 O(n)大约就是 2*n*t(1) 的复杂度以一点i的为观察对象,用值sta[i]记录其周围有无邻接点的情况, 在左右上下位置有邻接点时,分别记1 2 4 8, 即二进制0001b 0010b 0100b 1000b,先从左向右,从上向下扫描图,左邻接点存在则 sta[i] += 1右存在: sta[i] += 2……再从上向下,从左向右扫描, 上存在:sta[i] += 4下存在: sta[i] += 8结束后根据sta[i]的值可判断其点的性质if sta[i] = 1111b i <- 十字路elseif 0001b or 0010b or 0100b or 1000b i <- 端点else 分歧点 把我在17楼没说清楚的地方说一下:我的算法思想是逐点扫描(读入),对每一点并不做周围的扫描。在读入点的同时,判断点的性质. 对点i,当第i+LINELENGTH个点被读入时,就可以判断该点的性质.所以,对于特别大的图,不用载入整幅图,可以一边读图一边判断.设:i 点为黑,记val[i]=1; 为白,记0 (二值图,当然也可以用BOOL型)#define LINELENGTH 一行的宽度ImageFileRead(被处理图){val[i] = (二值化)(getchar(被处理图));if val[i-1]=1 and val[i]=1 sta[i] += 1; sta[i-1] += 2;if val[i-LINELENGTH]= 1 and val[i]=1 sta[i] += 4; sta[i-1] += 8;...(依次类推)} 谢谢楼上各位帮我回答啊,不过还是没有我想要的答案。首先那个逐点扫描的情况,那个半径很不容易选择,而且万一图像的某一行是:111111111x000011111其中1是黑,0是白,x是当前黑点,按理说它是端点,不过如果半径设为8的话,x就被判断为不是端点了,我理解的对吧?然后说LaPizza的方法,怎么说呢,线的宽度不是1,而且你说的收缩图像+二值化方法无法把线弄直吧? 二值图收缩时,如 255 0 0 255 四点 收缩到一点时,是一个128的点255 0255 255四点 收缩到一点时,是 floor(2/3 " 255) 的点产生的是灰度图需重新二值化.由于上面收缩的原因类似255 255 255 0 0 0 00 0 0 255 255 255 255的抖动的2行会变成128 128 128 128 128 128 128 一行重新二值化为255 255 255 ...就实现了去抖动如果再扩大为原来的尺寸,就完成了空间频率的低通操作 用线程创建的窗口问题 问个ADO控件类的问题 键盘钩子的过程处理函数,那个参数代表WM_KEYDOWN和WM_KEYUP动作呢? 选项卡TablCtrl的标签怎么自己来画? c语言中如何使用VC中定义的c++回调函数? 怎样通过移动鼠标来改变CEdit的值? CRect的简单问题 很菜的问题? DLL调用DLL,Set释放时出错 寻找vc新手,大家共同切磋,一起进步! 为什么无法得到资源管理器的地址栏的句柄啊 向服务器发送数据(200分)折腾我很久了!
算法我已经想到,给个大概思路第一步:扫描红点,并记录下红点坐标(按条件扫描,比如红点的大小,长宽比例在多少范围内则记录)第二步:循环红点,每个红点做4个方向的黑线扫描
(黑线扫描算法要另写),根据4个方向的扫描结果判断出红点的类型。第三步:输出结果。over
实际上其时间复杂度和你载入图片是一样的 O(n)
大约就是 2*n*t(1) 的复杂度以一点i的为观察对象,用值sta[i]记录其周围有无邻接点的情况, 在左右上下位置有邻接点时,分别记1 2 4 8, 即二进制0001b 0010b 0100b 1000b,
先从左向右,从上向下扫描图,左邻接点存在则 sta[i] += 1
右存在: sta[i] += 2
……再从上向下,从左向右扫描, 上存在:sta[i] += 4
下存在: sta[i] += 8结束后根据sta[i]的值可判断其点的性质if sta[i] = 1111b
i <- 十字路
elseif 0001b or 0010b or 0100b or 1000b
i <- 端点
else
分歧点
所以,对于特别大的图,不用载入整幅图,可以一边读图一边判断.设:
i 点为黑,记val[i]=1; 为白,记0 (二值图,当然也可以用BOOL型)#define LINELENGTH 一行的宽度
ImageFileRead(被处理图)
{
val[i] = (二值化)(getchar(被处理图));if val[i-1]=1 and val[i]=1
sta[i] += 1; sta[i-1] += 2;if val[i-LINELENGTH]= 1 and val[i]=1
sta[i] += 4; sta[i-1] += 8;...(依次类推)
}
首先那个逐点扫描的情况,那个半径很不容易选择,而且万一图像的某一行是:
111111111x000011111其中1是黑,0是白,x是当前黑点,
按理说它是端点,不过如果半径设为8的话,x就被判断为不是端点了,我理解的对吧?然后说LaPizza的方法,怎么说呢,线的宽度不是1,
而且你说的收缩图像+二值化方法无法把线弄直吧?
0 255 四点 收缩到一点时,是一个128的点255 0
255 255四点 收缩到一点时,是 floor(2/3 " 255) 的点产生的是灰度图需重新二值化.由于上面收缩的原因
类似
255 255 255 0 0 0 0
0 0 0 255 255 255 255
的抖动的2行会变成
128 128 128 128 128 128 128
一行
重新二值化为
255 255 255 ...就实现了去抖动如果再扩大为原来的尺寸,就完成了空间频率的低通操作