numpy/线性代数-快速16位直方图

numpy/线性代数-快速16位直方图,numpy,histogram,linear-algebra,Numpy,Histogram,Linear Algebra,如果我有一张由uint16s组成的图像,并想计算每一位的直方图,即一个包含强度值的向量“x”和一个向量y,即具有该值的样本数,是否有一种向量化的numpy/线性algreba方法来计算这个值?我用numpy做了一个显而易见的方法,在我的Mac电脑上使用你的图像尺寸,需要300毫秒。然后我用OpenCV做了同样的事情,它以9毫秒的速度快了33倍 #!/usr/bin/env python3 import cv2 import numpy as np # Dimensions - height,

如果我有一张由uint16s组成的图像,并想计算每一位的直方图,即一个包含强度值的向量“x”和一个向量
y
,即具有该值的样本数,是否有一种向量化的numpy/线性algreba方法来计算这个值?

我用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)
结果

%timeit NumbaHistogram(R.ravel())                                                                                                                  
10.4 ms ± 54.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
使用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、图像处理。

好的,如果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)

不知道自己创建直方图是否可以矢量化:为什么不能使用
numpy.histogram()
numpy.unique(return\u counts=True)
?后者可以满足我的要求
np.hist
对于大图像来说速度非常慢。请问大图像的高度和宽度(以像素为单位)是多少?2560x2160,每通道16位x 4个通道。Numba可能更差。OpenCV的阻力在于,正确安装和链接OpenCV可能是一个巨大的麻烦。如果不使用Conda作为python发行版,Numba几乎是不可能的,这既不好也不坏。嗯,有些人不满意我也使用Mac,但我也有Windows和Linux用户;)