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:
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.
Sollte es 'image [x, y]' oder 'image [y, x]'? – Selcuk
Warum durchlaufen Sie das gesamte Bild? Haben Sie stattdessen die Vektorisierung in Betracht gezogen? – Pouria
@PouriaHadjibagheri Danke für deinen Kommentar, ich untersuche gerade die Vektorisierung. –