Numpy计算大型多光谱图像的corrcoef

时间:2013-12-01 00:39:26

标签: python numpy covariance

我正在尝试计算一个像素与整个图像的相关系数。 我有以下代码可以使用

#load picture from serialized data 21 channels, ~500 x ~900 px
pic=pickle.load(open('hyper.p','rb'))

#prepare result table
result=zeros((pic.shape[1],pic.shape[2]))

#one pixel(10,10) from the image, all the channels
pixel=pic[:,10,10]

#for all pixels
for x in xrange(pic.shape[1]):
    for y in xrange(pic.shape[2]):
            #calculate correlation coeficient between one pixel and current pixel
        miniciurek = corrcoef(pixel,pic[:,x,y])
        result[x,y] = miniciurek[1,0]

imshow(result)
colorbar()
show()

以上代码有效,但需要很长时间才能完成, 我听说有一种更好的计算方法,一种可以立即进行批量计算的方法,所以我提出了这样一个解决方案:

#flattern the (21,~500,~900) matrix into a (21,500*900) matrix
orka = pic.reshape((pic.shape[0],pic.shape[1]*pic.shape[2],))

#create a matrix full of pixels same as the chosen one
pur = zeros((pic.shape[0],pic.shape[1]*pic.shape[2]))
for a in xrange(pic.shape[0]):
    pur[a,:].fill(krzywa1[a])

#at this point I have two (21,~300000) matrixes
tempResult = corrcoef(pur ,orka ,0)

我陷入困境,因为corrcoef试图分配一个(600k,600k)矩阵,但失败了。我需要的值是在这个巨大矩阵的一个对角线上。

  1. 使用corrcoef时有什么方法可以避免产生这么多数据吗?将图像分成1000个像素批次并将它们送到corrcoef需要更长时间才能使用单个像素!

  2. python / numpy是否有任何批量执行例程可以加快速度?

1 个答案:

答案 0 :(得分:0)

我不确定如何使用corrcoef功能加快速度。但是,如果您知道corrcoeff函数只是计算Pearson's correlation coefficient,那么编写自己的代码也很容易。这是一个完成你想要的功能:

import numpy as np

def correlation(pixel, image):
    c, m, n = image.shape
    image = image.reshape(c, m * n)

    pixel_mean = pixel.mean()
    pixel_std = pixel.std()
    means = image.mean(0)
    stds = image.std(0)

    # calculate the covariance between `pixel` and each image pixel
    covs = np.dot(pixel - pixel_mean, image - means) / float(c)

    # calculate Pearson's correlation coefficient
    corr = covs / (pixel_std * stds)
    return corr.reshape(m, n)

# generate a random image to test
c = 21
m = 500
n = 900
image = np.random.randn(c, m, n)
corr = correlation(image[:,10,10], image)

# check an arbitrary point to make sure it works
assert np.allclose(corr[302, 411], 
                   np.corrcoef(image[:,10,10], image[:,302,411])[0,1])

这计算图像中一个像素和每个其他像素之间的相关系数。虽然如果你的最终目标是计算图像中每个像素和每个其他像素之间的相关性,你将耗尽内存(你需要大约1.5太字节来存储所有系数,对于给定的图像尺寸500 x 900 )。