2016-05-02 24 views
2

Ich habe eine Klasse erstellt, von der ich ein Bild übergebe (2D-Array, 1280x720). Es wird angenommen, durchlaufen, für den höchsten Wert suchen:Python IndexError: Außerhalb der Grenzen

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) 

Doch wenn ich es laufen lasse, bekomme ich die Fehlermeldung:

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

Jede Hilfe wäre toll, wie ich Python neu bin.

Danke, Shaun

+1

Sollte es 'image [x, y]' oder 'image [y, x]'? – Selcuk

+0

Warum durchlaufen Sie das gesamte Bild? Haben Sie stattdessen die Vektorisierung in Betracht gezogen? – Pouria

+0

@PouriaHadjibagheri Danke für deinen Kommentar, ich untersuche gerade die Vektorisierung. –

Antwort

1

In Python, wie die meisten Programmiersprachen, starten Indizes bei 0.

Sie können also nur auf Pixel von 0 bis 719 zugreifen.

prüft mit einem Debug-Druck, die len(image) und len(image[0]) in die Tat 1280 und 720. zurückkehren

2

Unabhängig von den Indexfehlern, die Sie Erfahrung sind, die von anderen angesprochen wurde, Iterieren durch Pixel/Voxel ist keine gültige Methode zum Manipulieren von Bildern. Das Problem tritt besonders bei mehrdimensionalen Bildern auf, wo Sie auf die curse of dimensionality stoßen.

Der richtige Weg, dies zu tun, ist die Vektorisierung in Programmiersprachen, die es unterstützen (z. B. Python, Julia, MATLAB). Mit dieser Methode erreichen Sie die Ergebnisse, nach denen Sie suchen, viel effizienter (und tausende Male schneller). Click here, um mehr über die Vektorisierung (auch Array-Programmierung) zu erfahren. In Python kann dies entweder mit Generatoren erreicht werden, die für Bilder nicht geeignet sind, da sie die Ergebnisse erst dann wirklich erzeugen, wenn sie aufgerufen werden; oder mit NumPy Arrays. Hier

ein Beispiel:

Masking Bildmatrizen von Vektorisierung

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() 

Welche zurück:

enter image description here

Natürlich können Sie den Maskierungsprozess setzen (Funktion) in einem Schleife, um dies auf einem Stapel von Bildern zu tun. Sie können die Indizes auch auf 3D-, 4D- (z. B. MRI-) oder 5D- (z. B. CAT-Scan-) Bildern ändern, ohne dass jedes einzelne Pixel oder Voxel iteriert werden muss.

Hoffe, das hilft.

+0

Das ist brilliant, danke! –

+0

Sie sind herzlich willkommen. Es macht das Leben viel einfacher (und schneller) für die Analyse von Bildern. Wenn Sie übrigens eine bereits vorhandene Variable in Vektor umwandeln möchten, können Sie 'numpy.array' verwenden. – Pouria

Verwandte Themen