如何规范化图像?

时间:2009-03-29 18:23:51

标签: math image-processing

如果我有一系列像素,范围从-500到+1000,我如何规范化同一渐变上的所有像素,使它们落在特定范围之间,比如0到255?

5 个答案:

答案 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替换为0以外的任何值以及255替换为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)

创建两个变量MinInputValueMaxInputValue。将MinInputValue初始化为一个非常大的正数(高于您期望看到的最大像素值)和MaxInputValue到一个非常大的负数(低于您期望看到的最低像素值)

循环覆盖图像中的每个像素。对于每个像素,如果像素值PixelValue低于MinInputValue,请将MinInputValue设置为PixelValue。如果像素值高于MaxInputValue,请将MaxInputValue设置为PixelValue

创建一个新变量InputValueRange,并将其设置为MaxInputValue - MinInputValue

完成此操作后,再次循环覆盖图像中的每个像素。对于每个像素PixelValue,将输出像素值计算为255.0 * (PixelValue - MinInputValue) / InputValueRange。您可以将此新值指定回原始PixelValue,也可以在相同大小的输出图像中设置相应的像素。