我有一个 600x600 RGB 像素的图像,我想创建一个新图像,其中 RGB 通道从原始图像转换而来,如下所示:
(R, G, B) -> (R-1.4*B, G, B)
。我使用绝对值来仅强制执行正 RGB 值。这是我的代码来完成此操作,但会遇到段错误:
`
r, g, b = original.split() #split image into (r, g, b) channels
r = abs(np.array(r)-1.4*np.array(b)) #apply transformation
r = Image.fromarray(r) #revert r to PIL Image object
result = Image.merge('RGB', (r, g, b)) #merge channels to create new image
result.show()
`
运行代码输出:
zsh: segmentation fault /Users/arjunchandra/miniconda3/envs/bbox_env/bin/python
当我注释掉对 Image.merge 的调用时,段错误消失了 - 我不确定为什么会这样。如果有人对为什么会发生段错误以及如何解决它或检查内存有任何建议,请告诉我,或者您是否可以建议其他方法来进行转换?
这个方法为转换图像的其他方法提供了一些想法,但对于矩阵方法,我不确定如何使用(R-1.4B)的绝对值,并且我怀疑将图像转换为numpy数组并更改每个手动像素 RGB 会很高效,因为我有很多图像需要进行此转换。
红色通道的值超出了 PIL 对象的范围 (0-255)。您需要修剪这些值以使其保持在范围内:
r = Image.fromarray(r.clip(0, 255))