2019年11月25日开发手记

对滤波后的图像做行列投影,通过阈值得到运动图像横纵坐标点集。使用水平与竖直投影算法,投影算法的时间复杂度为O(x2),哪怕进行优化也最多可变为O(xlogx),时间上无法接受。再次使用傅里叶变换?还是将目标放在轮廓点整合?

使用竖直投影法的话还不如直接遍历所有点找轮廓,这对后面进行聚类也比较方便。

决定采用竖直投影+遍历,只进行一次投影,在投影过程中将点逐个遍历,高亮点的横纵坐标压入栈,输出横纵坐标的最大值和最小值。

def line_trans(img):
    l = Stack()
    h_1= Stack()
    l.isEmpty()
    h_1.isEmpty()
    #ret, thresh1 = cv2.threshold(img, 25, 255, cv2.THRESH_BINARY)  # 将图片进行二值化(130,255)之间的点均变为255(背景)
    (h, w) = img.shape  # 返回高和宽
    a = [0 for z in range(0, w)]
    # 记录每一列的波峰

    for j in range(0, w):  # 遍历一列
        q_1=0
        for i in range(0, h):  # 遍历一行
            #print(1)
            #print(img[i, j])
            if img[i, j] !=0:  # 如果该点为白点
                print(1)
                if q_1 ==0:
                    i_1=i
                i_2=i
                q_1=1
                a[j] += 1  # 该列的计数器加一计数
        if q_1!=0:
            l.push(j)
            h_1.push(i_1)
            h_1.push(i_2)
      if len(h_1.stack) != 0 and len(l.stack) != 0:
          max=h_1.stack[0]
          min=h_1.stack[0]
          for i in range(len(h_1.stack)):
              if h_1.stack[i]>max:
                  max=h_1.stack[i]
              if h_1.stack[i]<min:
                  min=h_1.stack[i]
          return min,l.stack[0],max,l.stack[len(l.stack)-1]
      else:
          return 0,0,0,0
问题:似乎进不去判断函数,也就是img中所有点都为0,但在调试中img确有非0点。
问题解决:缩进错误
 新算法的效果确实变得更好了,但速度也变得更慢了,为80ms左右。尝试使用python的切片操作,对二维数组进行横向累加,从而达到减少迭代次数的目的。
在滤波函数中加上一句:iimg[index,:][iimg[index, :] > 200] = 0 似乎出现了一个新特点:运动的物体在运动的反方向一侧的边缘会出现高亮。
换而言之,图像出现了方向性,这对后面的分类与识别应该有些特殊的意义。
posted @ 2019-11-25 23:11  巫师笔记  阅读(203)  评论(0编辑  收藏  举报