image-processing - 如何使用“point-lambda”函数反转和规范化 PIL 图像
问题描述
我试图使用该point
函数将 a 反转和归一化为PIL image
1;但是,我没有得到想要的结果!我试过的是这个(不知道有什么问题?)
data = data.point(lambda p: 1 if p < 127 else 0 ) # threshold, invert and normalize to 1
例如,当尝试
print(np.array(data).max())
打印True
。
但是,将其转换PIL Image
为numpy
数组然后将其反转是有效的,如下所示:
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
函数完成这种转换,那将有很大的帮助。
解决方案
您混淆了"normalisation"和"thresholding"。
使用"thresholding",您可以使所有高于或等于阈值的值等于某个高数,并使所有低于该阈值的值都等于某个低数。每个像素唯一可能的结果是高数或低数 - 两者之间没有任何关系。在典型的 8 位图像上,阈值为 127,所有像素最终都将是 0 或 255。
使用“标准化”,您可以将图像中的所有值限制在某个新的上限和某个新的下限之间 - 或. 所以结果是一堆大于下限且低于上限的新像素,但在两者之间均匀插值。在典型图像上,您可能会将所有值标准化到 0-255 范围内,并且每个像素最终可能会得到该范围内的任何值。
推荐阅读
- python - 如何根据连续性拆分时间序列索引
- latex - 手动乳胶部分 IEEE 标准
- python - 使用美丽的汤打印反应文本
- azure - 如何通过控制台应用程序更新 Azure Devops 上的文件
- javascript - 如何清除 document.write()
- arrays - 如何在numpy的4D数组中更改通道内的顺序
- javascript - “this”引用如何绑定箭头符号?
- amazon-web-services - Boto3 使用现有资源创建堆栈
- java - 从 Java 代码构造 Kotlin 类的实例
- delphi - 如何在 Delphi 的 Listview 中添加分隔符?