如图啊,怎么求出那些左面图上的特征点(红色的点)的位置区域,
并且要求出这些特征点分别是什么类型的,类型的种类在右面。
这个算法怎么设计比较好?
望高手不吝赐教~!谢谢:)

解决方案 »

  1.   

    哦,这样啊
    算法我已经想到,给个大概思路第一步:扫描红点,并记录下红点坐标(按条件扫描,比如红点的大小,长宽比例在多少范围内则记录)第二步:循环红点,每个红点做4个方向的黑线扫描
    (黑线扫描算法要另写),根据4个方向的扫描结果判断出红点的类型。第三步:输出结果。over
      

  2.   

    遍历的算法并不复杂。
    实际上其时间复杂度和你载入图片是一样的 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
        分歧点
      

  3.   

    把我在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;...(依次类推)
    }
      

  4.   

    谢谢楼上各位帮我回答啊,不过还是没有我想要的答案。
    首先那个逐点扫描的情况,那个半径很不容易选择,而且万一图像的某一行是:
    111111111x000011111其中1是黑,0是白,x是当前黑点,
    按理说它是端点,不过如果半径设为8的话,x就被判断为不是端点了,我理解的对吧?然后说LaPizza的方法,怎么说呢,线的宽度不是1,
    而且你说的收缩图像+二值化方法无法把线弄直吧?
      

  5.   

    二值图收缩时,如 255 0
       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 ...就实现了去抖动如果再扩大为原来的尺寸,就完成了空间频率的低通操作