从地图中猜测RGB渐变?

5

我有一张地图,比如此图:Gradient 它描述了地图上的单个变量。然而,我无法访问原始数据,并且对图像处理基本一无所知。我使用PIL获取了地图上每个点的像素坐标和RGB值,只需使用pix = im.load()命令并保存每个x,ypix[x,y]即可。

现在我想使用上面的渐变猜测每个点的值。这样的渐变是否有标准公式?对于训练有素的人来说,它看起来很熟悉吗?我已经访问了数学函数数字图书馆以获得一些示例......但我不确定它是使用色调、RGB高度函数还是其他东西(为了让事情变得更容易,我对一些绿色/棕色/红色失明):)

欢迎提供任何关于如何进行下一步操作、使用的库、链接或想法。谢谢!

编辑:

根据回复和martineau的建议,我尝试获取顶部和底部的颜色:

def rgb2hls(colotup):
    '''converts 225 based RGB to 360 based HLS
    `input`: (222,98,32) tuple'''

    dec_rgb = [x/255.0 for x in colotup] # use decimal 0.0 - 1.0 notation for RGB
    hsl_col = colorsys.rgb_to_hls(dec_rgb[0], dec_rgb[1], dec_rgb[2])
    # PIL uses hsl(360,x%,y%) notation and throws errors on float, so I use int
    return (int(hsl_col[0]*360), int(hsl_col[1]*100), int(hsl_col[2]*100))


def pil_hsl_string(hsltup):
    '''returns a string PIL can us as HSL color
    from a tuple (x,y,z) -> "hsl(x,y%,z%)"'''
    return 'hsl(%s,%s%%,%s%%)' % (hsltup[0], hsltup[1], hsltup[2])


BottomRed = (222,98,32) # taken with gimp
TopBlue =  (65, 24, 213) 

hue_red = pil_hsl_string(rgb2hls(BottomRed))
hue_blue = pil_hsl_string(rgb2hls(TopBlue))

然而,它们输出的结果相当不同……这让我担心使用rgb_to_hls函数来提取值。或者我做错了什么?以下是颜色在代码中转换后的情况:enter image description here
4个回答

2
图片中的比例尺看起来像是HSV渐变色,类似于这个问题中提到的内容。如果是这样,你可以使用colorsys.rgb_to_hls()colorsys.rgb_to_hsv()函数从像素中的r、g、b值获取0到1之间的色调颜色值。然后可以相应地进行映射。但是,除非进行OCR,否则我不知道如何确定所表示的值范围,除非它是一些您可以硬编码的一致范围。

2
有趣的问题..
如果你在HSL颜色空间中从250,85%,85%顺时针走到21,85%,85%,你会得到一个非常接近你展示的渐变。显然不同之处在于,你的图片展示了一个相当狭窄的绿色值带。
所以,如果你有这4个神奇数字,那么你可以插值到地图上的任何点。
当然,这些是第一个和最后一个颜色,也是第一个和最后一个比例值。 这是我用H通道的直线渐变得到的图像(使用了gimp)。
编辑:我后来编写了一个程序,抓取每行的像素值,并绘制结果的图表。你可以看到,色调确实不是线性的,你还可以看到S和V通道在大约115(图像顶部115个像素)处明显下降。这确实对应着绿色带。
考虑到曲线的形状,我倾向于认为它们可能是用来模拟某些东西的。但是我没有相关领域的经验来识别曲线的形状。
下面,我添加了HSV和RGB模型变化的图表。 图表左侧表示条的顶部。 X轴标签表示像素。
非常有趣。我收藏了。

非常酷!我不知道这个存在,也不知道你可以在GIMP上读取HSV。它还揭示了顺时针的HSV与渐变并不完全匹配。 - Massagran
1
@Massagran - 是的,相当不错。甚至可以获得一个GIMP插件,可以制作立体图像,但我偏离了主题...我对这个渐变思考了一些,我认为他们使用了两个渐变,而不是单一的渐变。一个从橙色到(刚刚变成)绿色。第二个从(刚刚结束的)绿色到蓝色。我认为你地图上的120对应于连接点。我还认为渐变避开了在我的图像中显示的100到130左右的部分。知道这个工具/设置组合必须有用! - enhzflep
2
RGB图看起来像是Matlab的Jet色图的平滑版本。 - Junuxx
然而,Jet色图并没有显示出这种奇怪的非线性(中间更宽的带状)。我几乎想看看是不是三个余弦函数有点偏离了正常 :) 我会尝试编写代码来复现这个情况。谢谢。 - Massagran
1
@Massagran,enzhflep:这种“奇怪的非线性”可能与人眼的光谱灵敏度有关? - Junuxx
显示剩余4条评论

2
我建议定义一个区域来比较颜色。对这些区域进行FFT变换,每种颜色由一个频率定义。您可以在轮廓尺度上进行相同的操作,然后比较并缩小到一个值。
我发现有些人希望更好地理解它。
参考链接:http://www.imagemagick.org/Usage/fourier/

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接