python - 如何更快地处理nparrays

标签 python arrays numpy opencv

我将两个图像加载到两个numpy数组中。我想得到它们的区别,并删除小于50的值,并将其其余部分设置为255,以得到最终的黑白图像结果。

def count(base, image):
    x, y, z = base.shape
    sheet = np.zeros(base.shape)
    for i in range(x):
        for j in range(y):
            temp = 0
            for k in range(z):
                if base[i, j, k] > image[i, j, k]:
                    t = base[i, j, k] - image[i, j, k]
                    if t > 50:
                        temp = 255
                else:
                    t = image[i, j, k] - base[i, j, k]
                    if t > 50:
                        temp = 255
            sheet[i, j] = [temp, temp, temp]

    array = sheet[:, :, 0]

此代码执行了我需要的操作。但是如您所见,我为此功能使用了最简单的for循环,并且图像的大小为2000 * 2000,因此处理时间很长。我需要一种以更快的方式重写它的方法。

谢谢

最佳答案

向量化代码看起来很简单,除了一个陷阱:您的数据似乎是无符号的int(从外观上看是uint8),由于它们经常下溢并产生意外结果,因此需要格外注意。例如,明显的np.abs(image-base)>50不能检测大于50的差异,实际上np.abs是对未签名数据的nop。仔细的翻译看起来更像

sheet = np.array([[0,0,0],[255,255,255]], 'u1')[((np.maximum(base, image)-np.minimum(base, image))>50).any(2).view('u1')]

要么
sheet = np.array([[0,0,0],[255,255,255]], 'u1')[(np.abs(np.subtract(image, base, dtype='i2'))>50).any(2).view('u1')]

这个
  • 正确计算子像素的明智差异,
  • 第一个版本模仿您的if / else子句
  • 第二个强制差异值
  • 的签名结果类型'i2'int16
  • 检测到那些大于50的
  • 用至少一个这样的子像素(any(2))标记像素,
  • 将生成的 bool(boolean) 掩码转换为索引(.view('u1'))0和1
  • ,并使用它们来索引到模板数组中。
  • 关于python - 如何更快地处理nparrays,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55216190/

    相关文章:

    python - 查看在 Python 装饰器中从哪一行调用函数

    c++创建一个带有string::size的数组

    python - 将 x=y 线添加到包含箱线图的绘图中

    python - 写类错误

    c++ - MPI_send 和 MPI_Resc - 更新单个数组值

    php - 在php/mysql中搜索数组查询结果

    python - numpy 数组作为结构化数组中的数据类型?

    python - numpy数组散列的最有效属性

    python - numpy 中的对称矩阵?

    java - 任何编程语言中的无理数表示?