【问题标题】:numpy / linear algebra - fast 16-bit histogramnumpy / 线性代数 - 快速 16 位直方图
【发布时间】:2020-01-29 17:27:28
【问题描述】:

如果我有一个由 uint16s 组成的图像并且想要计算每个位的直方图,即包含强度值的0..65535 的向量“x”和一个向量 y,它是样本的数量有那个值,有没有矢量化的 numpy / 线性 algreba 方法来计算这个?

【问题讨论】:

  • 想知道自己创建直方图是否可以矢量化:stackoverflow.com/questions/12985949/…
  • 为什么不能使用numpy.histogram()numpy.unique(return_counts=True)
  • 后者做我想要的。 np.hist 对于大图像可能会非常慢。
  • 请问大图的高度和宽度(以像素为单位)是多少?
  • 2560x2160,每通道 16 位 x 4 通道。

标签: numpy histogram linear-algebra


【解决方案1】:

我使用 Numpy 以显而易见的方式做到了这一点,并在我的 Mac 上使用您的图像尺寸,它需要 300 毫秒。然后我用 OpenCV 做了同样的事情,它在 9 毫秒时快了 33 倍!

#!/usr/bin/env python3

import cv2
import numpy as np

# Dimensions - height, width
h, w = 2160, 2560

# Known image, channel0=1, channel1=3, channel2=5, channel3=65535
R =  np.zeros((h,w,4), dtype=np.uint16)
R[...,0] = 1
R[...,1] = 3
R[...,2] = 5
R[...,3] = 65535

def npHistogram(R):
    """Generate histogram using Numpy"""
    H, _ = np.histogram(R,65536)
    return H

def OpenCVHistogram(R):
    """Generate histogram using OpenCV"""
    H = cv2.calcHist([R.ravel()], [0], None, [65536], [0,65536]) 
    return H

A = npHistogram(R)
B = OpenCVHistogram(R)

#%timeit npHistogram(R)
#%timeit OpenCVHistogram(R)

结果

使用 IPython,我得到了这些时间

%timeit npHistogram(R)
300 ms ± 11.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit OpenCVHistogram(R)
9.02 ms ± 226 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

关键字:Python、直方图、慢速、Numpy、np.histogram、加速、OpenCV、图像处理。

【讨论】:

    【解决方案2】:

    好的,如果 OpenCV 对您来说太大了,无法获得 9 毫秒的处理时间而不是 300 毫秒,那么 Numba 怎么样?这在 10 毫秒内运行。

    #!/usr/bin/env python3
    
    import numpy as np
    from numba import jit
    
    # Dimensions - height, width
    h, w = 2160, 2560
    
    # Known image, channel0=1, channel1=3, channel2=5, channel3=65535
    R =  np.zeros((h,w,4), dtype=np.uint16)
    R[...,0] = 1
    R[...,1] = 3
    R[...,2] = 5
    R[...,3] = 65535
    
    @jit(nopython=True, nogil=True)
    def NumbaHistogram(pixels):
        """Histogram of uint16 image"""
        H = np.zeros(65536, dtype=np.int32)
        for i in range(len(pixels)):
            H[pixels[i]] += 1
        return H
    
    #%timeit q = NumbaHistogram(R.ravel()) 
    

    结果

    %timeit NumbaHistogram(R.ravel())                                                                                                                  
    10.4 ms ± 54.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
    

    【讨论】:

    • Numba 可以说更糟。对 OpenCV 的阻力在于,正确安装和链接它可能会让人头疼。如果不使用 Conda 作为您的 Python 发行版,Numba 几乎是不可能的,这既不好也不坏。
    • 嗯,有些人不高兴? 这解释了为什么我喜欢 macOS,OpenCV 和 Numba 都是单行安装,没有 Conda。我想制作 Cython 版本也没有意义。
    • 我也使用 Mac,但我也有 Windows 和 Linux 用户 ;)
    猜你喜欢
    • 2014-08-22
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 2014-12-07
    • 2019-01-20
    • 2016-01-09
    相关资源
    最近更新 更多