如何快速裁剪NumPy二维数组图像?现有索引方式耗时超预期
更快的NumPy图像裁剪方案
首先要明确:NumPy的切片操作默认返回的是原数组的视图(view),而非复制整个子数组,正常情况下应该几乎不耗时。你遇到的裁剪耗时过长的问题,大概率和数组的内存连续性有关,或者后续操作触发了不必要的复制。
核心解决方案
检查并修复数组连续性
如果你的数组是经过转置、多次切片等操作得到的,可能会变成非连续存储的数组。非连续数组的切片操作会被迫触发复制,导致耗时增加。可以先检查数组的连续性:import numpy as np print(img.flags.contiguous) # 输出True表示连续,False表示非连续如果是非连续数组,先将其转为连续存储:
img = np.ascontiguousarray(img)之后再执行切片操作
crop_image = img[:, crop_val:-crop_val],此时切片返回的是视图,几乎瞬时完成。直接在霍夫变换中使用ROI
既然裁剪的目的是给霍夫变换缩小处理范围,完全可以跳过单独的裁剪赋值步骤,直接将ROI区域传入霍夫变换函数。这样既省掉了中间变量的存储开销,也避免了可能的复制操作:import cv2 # 直接传入切片后的ROI给霍夫变换 circles = cv2.HoughCircles( img[:, crop_val:-crop_val], cv2.HOUGH_GRADIENT, dp=1, minDist=20, param1=50, param2=30, minRadius=0, maxRadius=0 )验证切片是否为视图
可以通过crop_image.base is img来判断切片是否是原数组的视图。如果返回True,说明没有复制数据,裁剪操作本身几乎不耗时——此时你感受到的“耗时”可能来自后续的霍夫变换,而非裁剪步骤。
关于两种切片耗时差异的说明
img[:,crop_val:-crop_val]比img[:,crop_val:]慢的原因,是前者需要计算结束索引并定位到非数组末尾的位置,而非末尾的切片在内存访问上的连续性稍差,但这个差异在连续数组上应该极小。如果差异明显,同样是数组非连续导致的复制开销差异。
内容的提问来源于stack exchange,提问作者kgenbio
相关产品推荐
相关产品推荐

