我创建了一个传递图像的类(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的新手。
谢谢, 肖恩
答案 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()
返回:
当然,您可以将屏蔽过程(函数)放在一个循环中,以便在一批图像上执行此操作。您可以修改索引并在3D,4D(例如MRI)或5D(例如CAT扫描)图像上进行修改,而无需迭代每个单独的像素或体素。
希望这会有所帮助。
答案 1 :(得分:1)
在python中,与大多数编程语言一样,索引从0
开始。
因此,您只能访问0
到719
的像素。
使用调试打印检查len(image)
和len(image[0])
确实返回1280和720.