如果我有一系列像素,范围从-500到+1000,我如何规范化相同渐变上的所有像素,使它们落在特定范围(比如0到255)之间?
像这样的一些伪代码会将值从一个范围线性地缩放到另一个范围
oldmin=-500 oldmax=1000 oldrange=oldmax-oldmin; newmin=0 newmax=255; newrange=newmax-newmin; foreach(oldvalue) { //where in the old scale is this value (0...1) scale=(oldvalue-oldmin)/oldrange; //place this scale in the new range newvalue=(newrange*scale)+newmin }
你的问题不是很清楚,所以我假设你正在进行某种图像处理,你得到的结果是从-500到1000的值,现在你需要将颜色保存到每个值的文件中需要在0到255之间.
你如何做到这一点真的非常依赖于应用程序,结果的真正含义是什么以及你想要做什么.两个主要选项是:
钳制值 - 0以下的任何值替换为0,255以上的任何值替换为255.例如,如果图像处理是某种实际上不应达到这些值的插值,则需要执行此操作.
线性归一化 - 线性地将您的最小值设置为0,将最大值线性化为255.当然,您首先需要找到最小值和最大值.你做:
v = (origv - min)/(max - min) * 255.0
这样做首先将值映射到[0,1]
然后将它们拉回到[0,255]
.
第三种选择是在这两个选项之间进行混合和匹配.您的应用程序可能要求您将负值视为不需要的值,并将它们钳制为0,将正值钳位到线性映射到[0,255]
.