代码之家  ›  专栏  ›  技术社区  ›  Nick Bolton

如何规范化图像?

  •  9
  • Nick Bolton  · 技术社区  · 16 年前

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

    5 回复  |  直到 8 年前
        1
  •  27
  •   Paul Dixon    16 年前

    像这样的一些伪代码可以将值从一个范围线性地缩放到另一个范围

    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
    }
    
        2
  •  7
  •   Metagrapher    10 年前

    你的问题不太清楚,所以我假设你正在做某种图像处理,得到的结果是-500到1000之间的值,现在你需要将颜色保存到一个文件中,每个值都需要在0到255之间。

    如何做到这一点在应用程序中是非常依赖的,结果的真正含义是什么,以及您想要做什么。两个主要选项是:

    • 对值进行钳制-0以下的值用0替换,255以上的值用255替换。例如,如果您的图像处理是一种真正不应该达到这些值的插值,那么您将希望执行此操作。
    • 线性归一化-线性的最小值可以是0,最大值可以是255。当然,你首先需要找到最小值和最大值。你这样做:

      v = (origv - min)/(max - min) * 255.0
      

    它首先将值映射到 [0,1] 然后把它们拉回 [0,255] .

    第三种选择是在这两种选择之间进行混合和匹配。应用程序可能要求您将负值视为不需要的值,并将其钳制为0,将正值线性映射到 〔0255〕 .

        3
  •  3
  •   fmsf    11 年前

    首先要让一切都是积极的。如果最小值为-500,则在所有值中添加500。那么最小值为0,最大值为1500。

    那么这只是一个三条规则,你可以这样做:

    [value in 0,255] = 255*(Pixel/1500)
    
        4
  •  1
  •   Jeru Luke    8 年前

    一些伪代码可能有助于:

    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代码。

        5
  •  0
  •   Spire    16 年前

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

    循环图像中的每个像素。对于每个像素,如果像素值 PixelValue 低于 最小值 ,集合 最小值 像素值 . 如果像素值高于 最大值 ,集合 最大值 像素值 .

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

    完成后,再次循环图像中的每个像素。对于每个像素 像素值 ,计算输出像素值为 255.0 * (PixelValue - MinInputValue) / InputValueRange . 您可以将此新值重新分配给原始值 像素值 或者可以在相同大小的输出图像中设置相应的像素。