【发布时间】:2017-05-31 18:53:07
【问题描述】:
如果我有一系列像素,范围从 -500 到 +1000,我将如何对同一渐变上的所有像素进行归一化,以使它们落在特定范围(例如 0 到 255)之间?
【问题讨论】:
标签: math image-processing
如果我有一系列像素,范围从 -500 到 +1000,我将如何对同一渐变上的所有像素进行归一化,以使它们落在特定范围(例如 0 到 255)之间?
【问题讨论】:
标签: math image-processing
像这样的一些伪代码会将值从一个范围线性缩放到另一个范围
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,将最大值设为 255。当然,您首先需要找到最小值和最大值。你这样做:
v = (origv - min)/(max - min) * 255.0
它的作用是首先将值映射到[0,1],然后将它们拉伸回[0,255]。
第三个选项是混合和匹配这两个选项。您的应用程序可能会要求您将负值视为不需要的值并将它们限制为 0,并将正值线性映射到 [0,255]。
【讨论】:
首先让一切都变得积极。如果最小值为 -500,则将 500 添加到所有值。那么最小值为 0,最大值为 1500。
那么它只是一个三规则,你有它:
[value in 0,255] = 255*(Pixel/1500)
【讨论】:
一些伪代码可能会有所帮助:
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代码。
【讨论】:
创建两个变量,MinInputValue 和 MaxInputValue。将MinInputValue 初始化为一个非常大的正数(高于您期望看到的最大像素值),并将MaxInputValue 初始化为一个非常大的负数(低于您期望看到的最低像素值)。
遍历图像中的每个像素。对于每个像素,如果像素值PixelValue小于MinInputValue,则将MinInputValue设置为PixelValue。如果像素值大于MaxInputValue,则将MaxInputValue设置为PixelValue。
创建一个新变量InputValueRange,并将其设置为MaxInputValue - MinInputValue。
完成后,再次遍历图像中的每个像素。对于每个像素PixelValue,将输出像素值计算为255.0 * (PixelValue - MinInputValue) / InputValueRange。您可以将这个新值赋回原来的PixelValue,也可以在相同大小的输出图像中设置相应的像素。
【讨论】: