如果我有一系列像素,范围从-500到+1000,我如何规范化同一渐变上的所有像素,使它们落在特定范围之间,比如0到255?
答案 0 :(得分:27)
像这样的一些伪代码会将值从一个范围线性扩展到另一个范围
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
}
答案 1 :(得分:7)
你的问题不是很清楚,所以我假设你正在进行某种图像处理,你得到的结果是从-500到1000的值,现在你需要将颜色保存到文件中其中每个值都需要在0到255之间。
你如何做到这一点真的非常依赖于应用程序,结果的真正含义是什么以及你想要做什么。两个主要选项是:
线性归一化 - 线性地将您的最小值设置为0,将最大值线性化为255.当然,您首先需要找到最小值和最大值。你这样做:
v = (origv - min)/(max - min) * 255.0
这样做首先将值映射到[0,1]
,然后将它们拉回[0,255]
。
第三种选择是在这两个选项之间进行混合和匹配。您的应用程序可能会要求您将负值视为不需要的值,并将它们钳制为0,将正值钳制为[0,255]
。
答案 2 :(得分:3)
首先让一切都变得积极。如果最小值为-500,则将500添加到所有值。然后最小值为0,最大值为1500。
然后它只是三个规则而你拥有它:
[value in 0,255] = 255*(Pixel/1500)
答案 3 :(得分:1)
一些伪代码可能会有所帮助:
foreach( pixel_value in pixel_values): # between -500 and 1000
position = (pixel_value + 500) / 1500 # gives you a 0 to 1 decimal
new_value = int(postion * 255) # or instead of casting, you could round it off
顺便说一下,这是python代码。
答案 4 :(得分:0)
创建两个变量MinInputValue
和MaxInputValue
。将MinInputValue
初始化为一个非常大的正数(高于您期望看到的最大像素值)和MaxInputValue
到一个非常大的负数(低于您期望看到的最低像素值)
循环覆盖图像中的每个像素。对于每个像素,如果像素值PixelValue
低于MinInputValue
,请将MinInputValue
设置为PixelValue
。如果像素值高于MaxInputValue
,请将MaxInputValue
设置为PixelValue
。
创建一个新变量InputValueRange
,并将其设置为MaxInputValue - MinInputValue
。
完成此操作后,再次循环覆盖图像中的每个像素。对于每个像素PixelValue
,将输出像素值计算为255.0 * (PixelValue - MinInputValue) / InputValueRange
。您可以将此新值指定回原始PixelValue
,也可以在相同大小的输出图像中设置相应的像素。