python - 如何使用 Numpy 在 Python 中加速 OpenCV 图像的循环?
问题描述
目标是通过使用numpy
.
在下面的代码中,我将带有imread
(colors: BGR) 的图像读入src
(一个 numpy 数组),并为每种颜色定义阈值(分别为 BGR)。然后我src
逐像素循环(有两个for
嵌套循环),在每次迭代中我测试当前像素是否满足阈值(每个值的三个条件:蓝色、绿色和红色),在肯定的情况下(像素满足条件)我将其坐标保存在列表中(行号:i
,列号:j
)。
import cv2
src = cv2.imread('path_to_the_image') # A numpy array with shape: (width, height, 3) ["3" for BGR]
cond = [10, 20, 30] # A threshold for each color: Blue, Green and Red respectively
indexes = [] # To save pixel's coordinates which satisfies all three conditions
for i in range(0, src.shape[0]): # Loop over lines (width)
for j in range(0, src.shape[1]): # Loop over columns (height)
if src[i, j, 0] >= cond[0] and src[i, j, 1] >= cond[1] and src[i, j, 2] >= cond[2]:
indexes.append((i, j))
那么,我想知道如何使用numpy
内置函数重写此代码以受益于它的速度?
解决方案
你可以这样做:
a = np.array([[[1,2,3], [10,20,30]],
[[40,50,60], [10, 30, 20]]
])
[*zip(*np.where((a > (10,20,30)).all(-1)))]
输出:
[(1, 0)]
注意:np.where((a > (10,20,30)).all(-1))
单独会给你[array([1]), array([0])]
在某些情况下可能会更好。
推荐阅读
- pandas - 在 Pandas 中生成二项式排列
- cpython - 为什么 PySequence_GetItem 返回一个新的引用?
- testing - 选项不适用于跑步者
- mongodb - 通过 docker-composer 将 --wiredTigerCacheSizeGB 存储到 mongod.conf
- typo3 - 在 Extbase/Fluid 中访问 TYPO3 插件版本号
- file - 更改文件名 [Ionic 4]
- docker - 在 docker-compose 中设置 CPU 使用率
- laravel - 他们是否删除了 Laravel 6.0 中的 make:auth 命令?
- java - 错误:DexGuard Gradle 插件:不支持 Android Gradle 插件版本。(3.5.0),支持的版本包括 [2.3.0:3.4.*]
- php - 如何将 facebook-php-sdk 正确安装到 joomla 项目中?