对滤波后的图像做行列投影, 通过阈值得到运动图像横纵坐标点集. 使用水平与竖直投影算法, 投影算法的时间复杂度为 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 似乎出现了一个新特点: 运动的物体在运动的反方向一侧的边缘会出现高亮.
换而言之, 图像出现了方向性, 这对后面的分类与识别应该有些特殊的意义.
来源: https://www.cnblogs.com/lvfengkun/p/11931826.html