首页 > 解决方案 > 如何使用“point-lambda”函数反转和规范化 PIL 图像

问题描述

我试图使用该point函数将 a 反转和归一化为PIL image1;但是,我没有得到想要的结果!我试过的是这个(不知道有什么问题?)

data = data.point(lambda p: 1 if p < 127  else 0 ) # threshold, invert and normalize to 1

例如,当尝试

print(np.array(data).max())

打印True

但是,将其转换PIL Imagenumpy数组然后将其反转是有效的,如下所示:

data = np.array(data.getdata(),
                np.uint8).reshape(data.size[1], data.size[0], 1)        
        maxG = data.max() # correcting the values of folder e, they do not match the other folders
        data = ( (maxG - data)/maxG ).astype('uint8') 
        tsfm = transforms.ToPILImage() #import torchvision.transforms as transforms
        data = tsfm(data)   

我在单词识别实验中尝试了这两种方法,只有第二种方法对我有用。可悲的是,使用该point函数导致了不正确的结果。不知道有什么区别?

注意。第二种方法非常慢,所以如果可以使用该point函数完成这种转换,那将有很大的帮助。

标签: image-processingpython-imaging-library

解决方案


您混淆了"normalisation""thresholding"

使用"thresholding",您可以使所有高于或等于阈值的值等于某个高数,并使所有低于该阈值的值都等于某个低数。每个像素唯一可能的结果是高数或低数 - 两者之间没有任何关系。在典型的 8 位图像上,阈值为 127,所有像素最终都将是 0 或 255。

使用“标准化”,您可以将图像中的所有值限制在某个新的上限和某个新的下限之间 - 或. 所以结果是一堆大于下限且低于上限的新像素,但在两者之间均匀插值。在典型图像上,您可能会将所有值标准化到 0-255 范围内,并且每个像素最终可能会得到该范围内的任何值。


推荐阅读