将图像投射到不同的 class PIL

Casting images to different class PIL

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

让我更深入地解释一下我的 doing/the 问题。我不得不使用 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))

我尝试将结果与图像(我们称之为 'cat'(猫的字面图像))进行比较,该图像未经过 'img' 的铸造过程。我尝试打印出类型以查看不同之处。这是结果:

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

看到这里我在想问题是不是'img'的类型是'PIL.Image.Image'而不是'PIL.PngImagePlugin.PngImageFile'。将 numpyArray 转换为 PIL 时我做错了什么吗?还是别的什么。

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

P.S: 噪音类型是salt&pepper P.P.S:我尝试使用 img.convert('PIL.PngImagePlugin.PngImageFile') 但它输出以下错误:

conversion from RGB to PIL.PngImagePlugin.PngImageFile not supported

这一步有很多事情要做:(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))