Gimp Python 插件 gimp.Image 作为 numpy 数组
Gimp Python plugin gimp.Image as numpy array
我正在为 GIMP 开发一个 python 插件,我想获取图层的 RGB 矩阵作为 numpy 数组。要访问 python 插件中的层,我使用下一个代码:
def python_function(img, layer):
layer = img.layers[0]
我想创建 layer
变量,而不是 gimp.Image 变量,一个包含每个像素的 RGB 值的 numpy 数组。我在其他非 Gimp-python 代码中使用的是下一行:frame2 = misc.imread('C:\Users\User\Desktop\image2.png').astype(np.float32)
。如果我打印 frame2
我会得到一个像这样的矩阵,其中包含每个像素的 RGB 值:
[[[ 111. 179. 245.]
[ 111. 179. 245.]
[ 111. 179. 245.]
...,
[ 95. 162. 233.]
[ 95. 162. 233.]
[ 95. 162. 233.]]
[[ 111. 179. 245.]
[ 111. 179. 245.]
[ 111. 179. 245.]
...,
[ 95. 162. 233.]
[ 95. 162. 233.]
[ 95. 162. 233.]]
[[ 111. 179. 245.]
[ 111. 179. 245.]
[ 111. 179. 245.]
...,
[ 95. 162. 233.]
[ 95. 162. 233.]
[ 95. 162. 233.]]
...,
[ 113. 127. 123.]
[ 113. 127. 123.]
[ 113. 127. 123.]]
[[ 98. 112. 108.]
[ 98. 112. 108.]
[ 98. 112. 108.]
...,
[ 113. 127. 123.]
[ 113. 127. 123.]
[ 113. 127. 123.]]]
有什么方法可以将 gimp.Image 类型的变量转换为 numpy 数组,而无需将其保存在文件中并使用 Scipy 重新加载它?
谢谢。
你也看过"pixel regions"。这些被(略微)描述 here。基本上,给定一层:
您可以获得覆盖图层的区域,如下所示:
region=layer.get_pixel_rgn(0, 0, layer.width,layer.height)
您可以通过索引访问像素:
pixel=region[x,y]
this returns 一个 1/3/4 字节的字符串(参见 region.bpp
),例如,白色像素返回为 '\xff\xff\xff
',红色像素返回为 '\xff\x00\x00'
(假设没有 alpha 通道:3bpp)。
也可以访问切片区域,所以左上角的4个像素是:
cornerNW=region[0:2,0:2]
这个 returns 一个 12 字节的字符串(16 个带 alpha 通道)'\xff\x00\x00\xff\x00\x00\xff\x00\x00\xff\x00\x00'
。这在另一个方向起作用,你可以分配到一个区域:
region[0:2,0:2]='\xff'*12 # set to white
直接层<>nparray函数
我在当前实验中使用的一对函数:
# Returns NP array (N,bpp) (single vector ot triplets)
def channelData(layer):
region=layer.get_pixel_rgn(0, 0, layer.width,layer.height)
pixChars=region[:,:] # Take whole layer
bpp=region.bpp
return np.frombuffer(pixChars,dtype=np.uint8).reshape(len(pixChars)/bpp,bpp)
def createResultLayer(image,name,result):
rlBytes=np.uint8(result).tobytes();
rl=gimp.Layer(image,name,image.width,image.height,image.active_layer.type,100,NORMAL_MODE)
region=rl.get_pixel_rgn(0, 0, rl.width,rl.height,True)
region[:,:]=rlBytes
image.add_layer(rl,0)
gimp.displays_flush()
我正在为 GIMP 开发一个 python 插件,我想获取图层的 RGB 矩阵作为 numpy 数组。要访问 python 插件中的层,我使用下一个代码:
def python_function(img, layer):
layer = img.layers[0]
我想创建 layer
变量,而不是 gimp.Image 变量,一个包含每个像素的 RGB 值的 numpy 数组。我在其他非 Gimp-python 代码中使用的是下一行:frame2 = misc.imread('C:\Users\User\Desktop\image2.png').astype(np.float32)
。如果我打印 frame2
我会得到一个像这样的矩阵,其中包含每个像素的 RGB 值:
[[[ 111. 179. 245.]
[ 111. 179. 245.]
[ 111. 179. 245.]
...,
[ 95. 162. 233.]
[ 95. 162. 233.]
[ 95. 162. 233.]]
[[ 111. 179. 245.]
[ 111. 179. 245.]
[ 111. 179. 245.]
...,
[ 95. 162. 233.]
[ 95. 162. 233.]
[ 95. 162. 233.]]
[[ 111. 179. 245.]
[ 111. 179. 245.]
[ 111. 179. 245.]
...,
[ 95. 162. 233.]
[ 95. 162. 233.]
[ 95. 162. 233.]]
...,
[ 113. 127. 123.]
[ 113. 127. 123.]
[ 113. 127. 123.]]
[[ 98. 112. 108.]
[ 98. 112. 108.]
[ 98. 112. 108.]
...,
[ 113. 127. 123.]
[ 113. 127. 123.]
[ 113. 127. 123.]]]
有什么方法可以将 gimp.Image 类型的变量转换为 numpy 数组,而无需将其保存在文件中并使用 Scipy 重新加载它?
谢谢。
你也看过"pixel regions"。这些被(略微)描述 here。基本上,给定一层:
您可以获得覆盖图层的区域,如下所示:
region=layer.get_pixel_rgn(0, 0, layer.width,layer.height)
您可以通过索引访问像素:
pixel=region[x,y]
this returns 一个 1/3/4 字节的字符串(参见 region.bpp
),例如,白色像素返回为 '\xff\xff\xff
',红色像素返回为 '\xff\x00\x00'
(假设没有 alpha 通道:3bpp)。
也可以访问切片区域,所以左上角的4个像素是:
cornerNW=region[0:2,0:2]
这个 returns 一个 12 字节的字符串(16 个带 alpha 通道)'\xff\x00\x00\xff\x00\x00\xff\x00\x00\xff\x00\x00'
。这在另一个方向起作用,你可以分配到一个区域:
region[0:2,0:2]='\xff'*12 # set to white
直接层<>nparray函数
我在当前实验中使用的一对函数:
# Returns NP array (N,bpp) (single vector ot triplets)
def channelData(layer):
region=layer.get_pixel_rgn(0, 0, layer.width,layer.height)
pixChars=region[:,:] # Take whole layer
bpp=region.bpp
return np.frombuffer(pixChars,dtype=np.uint8).reshape(len(pixChars)/bpp,bpp)
def createResultLayer(image,name,result):
rlBytes=np.uint8(result).tobytes();
rl=gimp.Layer(image,name,image.width,image.height,image.active_layer.type,100,NORMAL_MODE)
region=rl.get_pixel_rgn(0, 0, rl.width,rl.height,True)
region[:,:]=rlBytes
image.add_layer(rl,0)
gimp.displays_flush()