2019年11月25日开发手记

本文探讨了在图像处理中,如何通过滤波、行列投影和遍历算法检测运动目标并提取其轮廓。作者对比了不同算法的时间复杂度,最终选择了竖直投影+遍历的方法,并讨论了该方法在效率和效果上的平衡。文章还提到了在调试过程中遇到的问题及解决办法,以及在滤波函数中加入特定操作后图像出现的新特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值