本帖最后由 我不是Carl2 于 2024-4-20 14:58 编辑
红外云图渲染
a. 色阶
相信各位风迷对色阶并不陌生,色阶将红外云图的每个像素按照其亮温上色。色阶颜色随亮温的变化可以分为渐变(如WV色阶0度以下的部分)和跳变(如IR-BD OW以下的部分),当然许多色阶两者兼有(如IR-RAMMB),黑白的IR和VIS云图本质上也可以看做使用了一类从黑到白的渐变色阶。
左侧是Patricia10.23 0515z Terra Band31未经投影的IR-Rammb图像,右侧是IR-Rammb,IR-BD,WV,IR-BW的色阶条。
色阶编写需要用到matplotlib.colors.LinearSegmentedColormap类(https://matplotlib.org/stable/ap ... mentedColormap.html),最简单的IR-BW色阶长这样:
- bwdata={'green': [(0, 1, 1),
- (1, 0, 0)],
- 'red': [(0, 1, 1),
- (1, 0, 0)],
- 'blue': [(0, 1, 1),
- (1, 0, 0)]}
复制代码
卫星云图每个像素的颜色可以用RGB值表示,如果想要自己编写色阶,可以拿读取像素RGB值的软件找找感觉。LinearSegmentedColormap的色阶格式也有'green' 'red' 'blue'独立的三组,对应G,R,B的亮度值。IR-BW是黑白色阶,因此三组都是一样的,彩色色阶则会有所不同。
每一行色阶由三个数字组成(称为x, y0, y1),并指定某一亮温节点对应的该颜色(RGB其中之一)亮度。x代表该亮温节点的位置,当色阶渲染范围是-100到50度时,x为0代表-100度,为0.5代表-25度,以此类推。y0, y1代表该颜色亮度,其0~1的范围对应0~255的RGB值。为什么需要用两个数字代表同一个亮温节点上的亮度呢?这是因为每个亮温节点两侧的亮度可以不一样,出现颜色的跳变。y0代表更低亮温那一侧的亮度,y1代表更高亮温那一侧的亮度。在两个亮温节点的间隙中,LinearSegmentedColormap会根据上一行的y1与下一行的y0自动进行渐变,若这两个值相同则无渐变。对于上面的IR-BW色阶来说,就是在-100度 亮度为1 和50度 亮度为0的区间内进行渐变。
下面展示几个更复杂的色阶实例:
- wvdata={'green': [(0, 0/255, 0/255),
- (30/150, 0/255, 0/255),
- (45.5/150, 128/255, 128/255),
- (58.5/150, 255/255, 255/255),
- (65/150, 255/255, 255/255),
- (72.5/150, 255/255, 255/255),
- (86/150, 128/255, 128/255),
- (100/150, 20/255, 255/255),
- (1, 1, 1)],
- 'red': [(0, 128/255, 128/255),
- (30/150, 128/255, 128/255),
- (45.5/150, 255/255, 255/255),
- (58.5/150, 255/255, 255/255),
- (65/150, 128/255, 128/255),
- (72.5/150, 128/255, 128/255),
- (86/150, 0/255, 0/255),
- (100/150, 100/255, 255/255),
- (1, 1, 1)],
- 'blue': [(0, 0/255, 0/255),
- (30/150, 0/255, 0/255),
- (45.5/150, 0/255, 0/255),
- (58.5/150, 128/255, 128/255),
- (65/150, 128/255, 128/255),
- (72.5/150, 255/255, 255/255),
- (86/150, 255/255, 255/255),
- (100/150, 100/255, 255/255),
- (1, 1, 1)]}
复制代码
WV色阶应用于-100~50度的渲染范围,因此x0位置上的N/150就对应-100+N度。WV色阶以渐变为主,因此前几行色阶y0y1是相同的,代表没有颜色的跳变,上一行y1与下一行y0不同,代表在亮温节点之间进行渐变。注意在x0=100/150也就是0度的时候y0y1不同,代表此处出现了从紫色到白色的跳变,这一点可以通过本节第一张图确认。
- bddata = {'blue': [(0.0, 0.0, 0.3333333333333333),
- (0.12666666666666668, 0.3333333333333333, 0.5294117647058824),
- (0.16, 0.5294117647058824, 1.0),
- (0.2, 1.0, 0.0),
- (0.24, 0.0, 0.6274509803921569),
- (0.30666666666666664, 0.6274509803921569, 0.43137254901960786),
- (0.38666666666666666, 0.43137254901960786, 0.23529411764705882),
- (0.46, 0.23529411764705882, 0.792156862745098),
- (0.7266666666666667, 0.42745098039215684, 1.0),
- (0.8533333333333334, 0.0, 0.0), (1.0, 0.0, 0.0)],
- 'green': [(0.0, 0.0, 0.3333333333333333),
- (0.12666666666666668, 0.3333333333333333, 0.5294117647058824),
- (0.16, 0.5294117647058824, 1.0),
- (0.2, 1.0, 0.0),
- (0.24,0.0, 0.6274509803921569),
- (0.30666666666666664, 0.6274509803921569, 0.43137254901960786),
- (0.38666666666666666, 0.43137254901960786, 0.23529411764705882),
- (0.46, 0.23529411764705882, 0.792156862745098),
- (0.7266666666666667, 0.42745098039215684, 1.0),
- (0.8533333333333334, 0.0, 0.0),
- (1.0, 0.0, 0.0)],
- 'red': [(0.0, 0.0,0.3333333333333333),
- (0.12666666666666668, 0.3333333333333333, 0.5294117647058824),
- (0.16, 0.5294117647058824, 1.0),
- (0.2, 1.0, 0.0),
- (0.24, 0.0, 0.6274509803921569),
- (0.30666666666666664, 0.6274509803921569, 0.43137254901960786),
- (0.38666666666666666, 0.43137254901960786, 0.23529411764705882),
- (0.46, 0.23529411764705882, 0.792156862745098),
- (0.7266666666666667, 0.42745098039215684, 1.0),
- (0.8533333333333334, 0.0, 0.0),
- (1.0, 0.0, 0.0)]}
复制代码
BD色阶中有些小数没化为分数,不影响使用,但确实不太美观(
BD色阶同样应用于-100~50度的渲染范围。仔细观察前几行的y0,y1不难发现,同一行的y0,y1不同,代表亮温节点上会出现颜色的跳变,例如CDG在-81跳变到CMG;上一行y1与下一行y0相同,代表亮温节点之间不存在渐变,对应着从-81~-76区间的任意亮温都会被赋予CMG的颜色。 |