我正在使用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))
我尝试将结果与未通过“ img”进行转换的图像(我们称其为“猫”(从字面上看是猫的图像))进行比较。我尝试打印出类型,以了解不同之处。结果如下:
cat = <class 'PIL.PngImagePlugin.PngImageFile'>
img = <class 'PIL.Image.Image'>
看到这一点,我想知道问题是否在于“ img”的类型为“ PIL.Image.Image”而不是“ PIL.PngImagePlugin.PngImageFile”。将numpyArray强制转换为PIL时,我做错了吗?或者是别的什么。
任何帮助是极大的赞赏! (我尝试尽可能具体)
附言:噪声的类型是盐和胡椒
P.P.S:我尝试使用
img.convert('PIL.PngImagePlugin.PngImageFile')
,但输出以下错误:不支持从RGB到PIL.PngImagePlugin.PngImageFile的转换
最佳答案
此步骤中有很多事情要做:(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))