更改50x50平方2d numpy数组中的像素值

时间:2017-03-21 03:27:06

标签: python arrays numpy image-processing

在python中进行一些图像处理,我试图改变50x50平方的numpy数组的值,每个方块每200像素会改变一次。到目前为止,这就是我所拥有的:

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

每200个空间植入一个非常明亮的像素。但是,我无法弄清楚如何让它周围的像素发生变化。我尝试过类似的东西:

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

但是这会将像素分散在迭代中。我对python有点生疏,解决方案可能很简单,但我感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

你可以这样做:

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

线image_data=np.zeros([1000,1000])只是初始化上面示例的矩阵,您可以使用矩阵代替。 index_list是所有相关行和列索引的列表。

image_data[np.ix_(index_list,index_list)]=999将999分配给矩阵的相关部分。 请注意,我设置了places=np.arange(-25,26),因为您似乎想要50 x 50平方包含(即175-225行,包括端点等)。如果不是这种情况,您可以将26更改为25,或者以您喜欢的方式设置它。

此外,此代码用于方阵image_data。如果它是矩形的,那么你应该分别定义行和列索引,如:

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

答案 1 :(得分:0)

我建议使用arr.flatten()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))

现在,无论图像的形状如何(正方形,矩形),这种方法都可行。