2017-03-21 2 views
0

Ein bisschen Bildverarbeitung in Python und ich versuche, den Wert eines 50x50 Quadrat von numpy Array zu ändern und jedes Quadrat würde alle 200 Pixel ändern. So weit habe ich das:Ändern von Pixelwerten in einem 50x50 Quadrat 2d Numpy Array

image_data[0::200,0::200] = 999 

Dies pflanzt ein extrem helles Pixel alle 200 Leerzeichen. Ich kann jedoch nicht herausfinden, wie man die umgebenden Pixel verändern kann. Ich habe versucht, etwas Ähnliches wie folgt aus:

image_data[0::200+1,0::200] = 999 
image_data[0::200-1,0::200] = 999 
image_data[0::200+2,0::200] = 999 
image_data[0::200-2,0::200] = 999 

Aber diese breitet sich die Pixel aus über Iterationen. Ich bin mit Python etwas eingerostet und die Lösung ist wahrscheinlich trivial, aber ich schätze jede Hilfe, die ich bekommen kann.

Antwort

1

Sie können es so machen:

import numpy as np 
image_data=np.zeros([1017,1017]) 
places=np.arange(-25,26) 
centers=np.array([[200*i]*len(places) for i in range(1,len(image_data)//200+1)]) 
index_list=np.concatenate(centers+places) 
index_list=index_list[index_list<len(image_data)] 
image_data[np.ix_(index_list,index_list)]=999 

Die Linie image_data=np.zeros([1000,1000]) initialisiert nur die Matrix für das obige Beispiel, können Sie Ihre Matrix stattdessen verwenden können. index_list ist eine Liste aller relevanten Zeilen- und Spaltenindizes.

image_data[np.ix_(index_list,index_list)]=999 weist dem relevanten Teil der Matrix 999 zu. Beachten Sie, dass ich places=np.arange(-25,26) gesetzt habe, weil es so aussieht, als ob Sie 50-mal-50-Quadrat inklusive wollten (also Zeilen 175-225 einschließlich Endpunkten usw.). Wenn das nicht der Fall ist, können Sie einfach 26 zu 25 ändern oder es beliebig einstellen.

Auch dieser Code ist für quadratische Matrix image_data. Wenn es rechteckig ist, dann sollten Sie Zeilen und Spalten Indizes definieren getrennt, wie folgt aus:

import numpy as np 
image_data=np.zeros([1017,2017]) 
places=np.arange(-25,26) 
centers_rows=np.array([[200*i]*len(places) for i in range(1,len(image_data)//200+1)]) 
centers_columns=np.array([[200*i]*len(places) for i in range(1,len(image_data[0])//200+1)]) 
row_index=np.concatenate(centers_rows+places) 
col_index=np.concatenate(centers_columns+places) 
row_index=row_index[row_index<len(image_data)] 
col_index=col_index[col_index<len(image_data[0])] 
image_data[np.ix_(row_index,col_index)]=999 
+0

Danke für die Antwort. Wie würdest du das angehen, wenn du es benötigst, sagen wir, dass 50 Pixel jedes 200. geänderte Pixel umgeben. Wie etwa 175-225 in beiden Zeilen und Spalten bei 999 Helligkeit – cvirus96

+0

habe ich den Code aktualisiert, um den Fall zu decken, in dem image_data ebenfalls rechteckig ist. –

+0

Wenn ich die Helligkeit jedes quadratischen Kernels basierend auf einer Gaußschen Funktion anpassen wollte, gibt es dafür eine schnelle Lösung? Wenn ich an Stelle von 999 ein Gaussian anschließe, erzeugt es einen in der Mitte des Bildes, nicht in der Mitte jedes Quadrats. – cvirus96

0

Ich schlage vor, einen einfachen Ansatz arr.flatten() und np.reshape()

In [140]: a = np.zeros((1000, 1000)) 

# C style flattening for row level operation 
In [141]: af = a.flatten() 
In [142]: af.shape 
Out[142]: (1000000,) 

# get every 200th element 
In [145]: idxs = [ idx for idx, el in enumerate(af) if idx % 200 == 0] 

# generate required indices 
In [146]: indices = [ range(el-25, el+25) for el in idxs[1:]] 

# update new values to the above indices 
In [147]: af[indices] = 999 

# now, again reshape to original shape 
In [148]: a_modified = af.reshape((1000, 1000)) 


# Fortran style flattening for column level operation 
In [149]: amf = a_modified.flatten('F') 

# get every 200th element 
In [150]: idxs = [idx for idx, el in enumerate(amf) if idx % 200 == 0] 

# generate required indices 
In [151]: indices = [ range(el-25, el+25) for el in idxs[1:]] 

# update new values to the above indices 
In [152]: amf[indices] = 999 

# now, again reshape to original shape 
In [153]: a_final = amf.reshape((1000, 1000)) 

nun unabhängig von der Form des Bildes (quadratisch, rechteckig) würde dieser Ansatz funktionieren.