巫山雨_fz 2022-01-27 01:49 采纳率: 74.1%
浏览 127
已结题

如何快速抠出前景,遍历像素太慢了

for x in range(self.image.shape[0]):
    # 图片的高
    for y in range(self.image.shape[1]):
        # 图片的宽
        point = np.array([y,x], dtype="int")
        point = tuple(np.int0(point))
        if cv2.pointPolygonTest(self.cnt_max2, point, False) <= 0:
        self.image[x,y]=[0,0,0]

遍历图像所有的点,把最大轮廓外面的点(背景)置黑,以达到扣出前景的目的,代码有没有什么毛病,为什么特别慢,要十几二十秒才能出来,还只有640*480,要是几百万像素的,岂不是要运行两三分钟,有木有更快的算法呢

  • 写回答

8条回答 默认 最新

  • ilmss 2022-01-27 10:16
    关注

    利用np.where改进重心法检测
    xy=np.where(blank_bg < 10)
    listx=list(xy)[0] #行
    listy=list(xy)[1] #列
    point_x = np.sum(listy)/len(listy)
    point_y = np.sum(listx)/len(listx)
    使用np的内置函数可以大幅提高程序的运行效率。这里使用np.where来替换掉两个for循环。
    np.where返回的是一个元组,n维数组的输入会返回n维元组。对图像来说,输入为二维数组(像素坐标为二维),因此返回值为2维元组,如下所示:
    (array([509, 509, 509, ..., 766, 766, 766], dtype=int64), array([337, 338, 339, ..., 380, 381, 382], dtype=int64))
    这个2维元组的第一个数表示满足条件的行坐标,第二个数表示满足条件的列坐标。这样就通过np.where替代了两层for循环。之后便可以根据返回的结果对像素进行操作。实测下来,该部分运行时间是0.003秒,运行效率提高了421倍。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(7条)

报告相同问题?

问题事件

  • 系统已结题 2月4日
  • 已采纳回答 1月27日
  • 修改了问题 1月27日
  • 创建了问题 1月27日

悬赏问题

  • ¥15 app:debugCompileClasspath'.
  • ¥20 公众号如何实现点击超链接后自动发送文字
  • ¥15 用php隐藏类名和增加类名
  • ¥15 算法设计与分析课程的提问
  • ¥15 用MATLAB汇总拟合图
  • ¥15 智能除草机器人方案设计
  • ¥15 对接wps协作接口实现消息发送
  • ¥15 SQLite 出现“Database is locked” 如何解决?
  • ¥15 已经加了学校的隶属邮箱了,为什么还是进不去github education?😭
  • ¥15 求会做聚类,TCN的朋友有偿线上指导。以下是目前遇到的问题