Python IndexError:超出范围

时间:2016-05-02 10:38:24

标签: python python-2.7 numpy

我创建了一个传递图像的类(2D数组,1280x720)。它假设要迭代,寻找最高值:

import bumpy as np

class myCv:
    def maxIntLoc(self,image):
        intensity = image[0,0]  #columns, rows
        coordinates = (0,0)
        for y in xrange(0,len(image)):
            for x in xrange(0,len(image[0])):
                if np.all(image[x,y] > intensity):
                    intensity = image[x,y]
                    coordinates = (x,y)
        return (intensity,coordinates)

然而,当我运行它时,我收到错误:

if np.all(image[x,y] > intensity):
IndexError: index 720 is out of bounds for axis 0 with size 720

任何帮助都会很棒,因为我是Python的新手。

谢谢, 肖恩

2 个答案:

答案 0 :(得分:2)

无论您遇到的索引错误(其他人已经解决过),迭代像素/体素都不是处理图像的有效方法。在面向curse of dimensionality的多维图像中,问题变得尤为明显。

正确的方法是在支持它的编程语言中使用矢量化(例如Python,Julia,MATLAB)。通过这种方法,您将获得更有效地查找的结果(并且速度提高数千倍)。 Click here了解有关矢量化的更多信息(也称为数组编程)。在Python中,这可以使用生成器来实现,这些生成器不适用于图像,因为它们在被调用之前不会真正产生结果;或使用NumPy数组。

以下是一个例子:

通过矢量化掩蔽图像矩阵

from numpy.random import randint
from matplotlib.pyplot import figure, imshow, title, grid, show

def mask_img(img, thresh, replacement):
    # Copy of the image for masking. Use of |.copy()| is essential to 
    # prevent memory mapping.
    masked = initial_image.copy()

    # Replacement is the value to replace anything that 
    # (in this case) is bellow the threshold. 
    masked[initial_image<thresh] = replacement  # Mask using vectorisation methods.

    return masked

# Initial image to be masked (arbitrary example here).
# In this example, we assign a 100 x 100 matrix of random integers 
# between 1 and 256 as our sample image. 
initial_image = randint(0, 256, [100, 100])  
threshold = 150  # Threshold

# Masking process.
masked_image = mask_img(initial_image, threshold, 0)

# Plots.
fig = figure(figsize=[16,9])

fig.add_subplot(121)
imshow(initial_image, interpolation='None', cmap='gray')
title('Initial image')
grid('off')

fig.add_subplot(122)
imshow(masked_image, interpolation='None', cmap='gray')
title('Masked image')
grid('off')

show()

返回:

enter image description here

当然,您可以将屏蔽过程(函数)放在一个循环中,以便在一批图像上执行此操作。您可以修改索引并在3D,4D(例如MRI)或5D(例如CAT扫描)图像上进行修改,而无需迭代每个单独的像素或体素。

希望这会有所帮助。

答案 1 :(得分:1)

在python中,与大多数编程语言一样,索引从0开始。

因此,您只能访问0719的像素。

使用调试打印检查len(image)len(image[0])确实返回1280和720.