我正在使用图片,我正在处理我写过的课程Pixel(x, y)
的对象列表。我经常要执行这样的操作 -
std_dev = np.array(map(lambda x: x.std_dev, pixels))
# numpy processing on std_dev ---> new_property
for i, p in enumerate(pixels):
p.new_property = new_property[i]
"移动"最有效的方法是什么? Python对象和numpy
之间的数据?我想保留Pixel
类,因为我需要它来对图像的某些部分进行更精细的处理。
更新#1
是的,pixels
是Pixel
个对象的列表。我想在图像的标准偏差图上应用高斯平滑。图像中的每个图像像素都具有与之关联的标准偏差值。我对上述问题的一般解决方案更感兴趣,而不是我的高斯卷积的具体情况。
答案 0 :(得分:0)
您可以让所有像素知道他们的索引,并将ndarrays的相同词典作为property-> values map共享。然后使用字典键访问Pixel的属性和Pixel的索引以访问该属性数组中的位置。这样你的像素变成了指向这些数组的指针。但是,您必须将字典保留在中心位置。为方便起见,我会创建一个主人或工厂类 像这样:
class Pixel(object):
def __init__(self, x, y, properties):
# _properties has to be assigned first!
self._properties = properties
self._x = x
self._y = y
def __getattribute__(self, attr):
try:
return super().__getattribute__(attr)
except AttributeError:
return self._properties[attr][self._x, self._y]
def __setattr__(self, attr, value):
if attr != '_properties' and attr in self._properties:
self._properties[attr][self._x, self._y] = value
else:
super().__setattr__(attr, value)
class Pixelmaster(object):
def __init__(self, width, height):
self.properties = dict()
self.pixels = np.array([[Pixel(x, y, self.properties) for y in range(height)] for x in range(width)])
def setProperty(self, prop, value):
if value.shape != self.pixels.shape:
raise ValueError('Value has wrong shape %s, should have %s!' % (value.shape, self.pixels.shape))
self.properties[prop] = value
return value
def newProperty(self, prop, dtype=float):
return self.setProperty(prop, np.empty_like(self.pixels, dtype=dtype))
def getProperty(self, prop):
return self.properties[prop]
有了这个,你可以做类似的事情:
master = Pixelmaster(100,100)
# get pixel at position 0, 0
p = master.pixels[0, 0]
# create a new property
master.setProperty('std',np.random.rand(100,100))
print(p.std)
# reassign the pixel's value
p.std = 5
# value is updated at the master...
print(master.properties['std'][0,0])
# ...as well as the pixel itself
print(p.std)
输出:
0.6587814533631399
5.0
5.0
我想你知道从哪里开始。