将图像投射到不同的类PIL

时间:2018-06-15 18:18:54

标签: python numpy python-imaging-library imagefilter

我正在使用PIL并尝试在图像上使用中值滤波器以对其进行去噪。但是当我尝试时,结果是黑色图像。我认为问题的原因是图像属于PIL.Image.Image'类。

让我更深入地解释一下我正在做什么/这个问题。我不得不使用numpy执行一些图像处理。为了做到这一点,我首先必须将PIL图像转换为numpyArray。我用以下代码完成了这个:

img = np.array(image)

执行所需的转换后,我使用以下代码将图像转换回PIL:

def numpy_to_pil(image):
    minv = np.amin(image)
    maxv = np.amax(image)
    img = Image.fromarray((255 * (image - minv) / (maxv - minv)).astype(np.uint8))
    return img

当我尝试过滤' img'如上所述,使用中值滤波器,结果是黑色图像。这就是我如何使用PIL的过滤功能:

img.filter(ImageFilter.MedianFilter(3))

我尝试将结果与图像进行比较(让我们称之为“猫”(字面意思是猫的形象)),这些图像并没有通过“#39” ; IMG'被接通了。我尝试打印出类型,看看有什么不同。这是结果:

cat =  <class 'PIL.PngImagePlugin.PngImageFile'>
img =  <class 'PIL.Image.Image'>

看到这个,我想知道问题是否是&#39; img&#39;属于&#39; PIL.Image.Image&#39;而不是&#39; PIL.PngImagePlugin.PngImageFile&#39;。我是否做错了什么时候将numpyArray转换成PIL?或者是别的什么。

非常感谢任何帮助! (我尝试尽可能具体)

P.S:噪音的类型是盐和胡椒 P.P.S:我尝试使用img.convert('PIL.PngImagePlugin.PngImageFile')但输出了以下错误:

  

不支持从RGB转换为PIL.PngImagePlugin.PngImageFile

1 个答案:

答案 0 :(得分:1)

这一步有很多事情要做:(255 * (image - minv) / (maxv - minv)).astype(np.uint8)

图像的数据类型为uint8,因此当您首先乘以255时,您将超过8位整数的最大值。您可以将数据类型更改为int64或者中断步骤,并且之前会为您投射数据类型。

如果你将这些步骤分解并最后乘以255,则由于8位整数溢出而不再显示黑屏:

minv = np.amin(image)
maxv = np.amax(image)
image = image - minv
image = image / (maxv - minv)
image = image * 255
img = Image.fromarray(image.astype(np.uint8))