5

我有一张像这样比例的地图:(数字只是一个例子)

坡度它描述了地图上的单个变量。但是,我无权访问原始数据,并且对图像处理几乎一无所知。我所做的是使用 PIL 获取地图上每个点的像素坐标和 RGB 值。只需使用pix = im.load()和保存pix[x,y]每个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 函数来提取值。还是我做错了什么?下面是 color 用代码转换成的内容: 在此处输入图像描述

4

4 回答 4

2

图像中的比例在我看来就像一个 HSV 渐变,就像这个问题中提到的一样。如果是这样,您可以使用colorsys.rgb_to_hls()orcolorsys.rgb_to_hsv()函数从像素中的 r,g,b 值获取 0 到 1 之间的色调颜色值。然后可以相应地映射。

但是,除了进行 OCR 之外,我不知道如何确定所表示的值的范围,除非它是一些可以硬编码的一致范围。

于 2012-10-27T17:55:47.257 回答
2

有趣的问题..

如果你在 HSL 颜色空间中从 250,85%,85% --> 21,85%,85% 顺时针走动,你会得到一个非常接近你所显示的渐变。明显的区别是您的图像显示出相当窄的绿色值带。

因此,如果您有 4 个幻数,那么您可以插值到地图中的任何点。

这些当然是第一个和最后一个颜色,也是第一个和最后一个比例值。这是我在 H 通道上使用直线渐变得到的图像(使用 gimp)。 在此处输入图像描述

编辑:我已经启动了一个程序来获取每一行的像素值,并绘制结果。您可以看到,色调确实不是线性的,您还可以看到 S 和 V 通道在 115 左右(距图像顶部 115 像素)有明显下降,这确实与绿色波段相对应。

鉴于曲线的形状,我倾向于认为它们可能是为了建模某些东西。但是没有相关领域的经验来识别曲线的形状。

下面,我添加了 HSV 和 RGB 模型变化的图表。图表的左侧代表条形的顶部。X 轴标签代表像素

很有趣,我想。已收藏。

在此处输入图像描述

在此处输入图像描述

于 2012-10-27T20:28:05.373 回答
2

我建议定义一个要比较颜色的区域。对区域进行 FFT。每种颜色都由频率定义。你在countour规模上做同样的事情。然后比较并缩小一个值。

我发现有些人喜欢更好地理解它。

http://www.imagemagick.org/Usage/fourier/

于 2012-10-31T15:18:31.083 回答
1

您可以通过改变具有固定饱和度和亮度的色调来获得类似的效果。

http://en.wikipedia.org/wiki/HSL_and_HSV

于 2012-10-27T15:41:50.883 回答