2017-07-27 39 views
0

我有彩虹配色方案的CFD图像,如下所示(1.Original)
我希望python将此配色方案转换为灰度。然而,转换的灰度(image2)不是我想要的(从黑色到白色的线性渐变)(image3)。
谁能告诉我如何将原始图像(图片1)转换为图片3? enter image description here如何指定如何将彩虹配色方案转换为灰度

+0

您可以转换为灰度,然后缩放,使最小值为0,最大值为1(或255,忘记PIL如何存储它) – perigon

+0

这是一个非平凡的任务,因为您有两个不同的colorscemes原始图像:“彩虹”图像从蓝色变为红色,灰度图像变为黑色,图像中的某些区域呈灰色。看起来你想要黑色字符保持黑色,但是原始图像中的灰色区域会发生什么?另外,因为这个问题似乎是解决某些问题的方法,可能没有人想为您编写完整的代码。你有没有尝试过任何东西?问题更多的是黑色与地图其他部分的分离吗? – ImportanceOfBeingErnest

回答

2

正如评论,这是一个不平凡的任务说,因为你必须在原始图像中两个不同的colorscemes:“彩虹”之一,从蓝色变为红色,并且灰阶一个,即行数字是黑色的,图像中的一些区域是灰色的。

下,你知道,从原始图像已经产生的颜色表的假设,你可以做到以下几点,它使用我在这个答案提供的部分代码:How to decode color mapping in matplotlib's Colormap?
在这里,我认为这是喷气颜色表。

import numpy as np 
import matplotlib.colors 
import matplotlib.pyplot as plt 

image = plt.imread("data/jetcolimage.png") 
print image.shape, image.max() 

r = np.linspace(0,1, 256) 
norm = matplotlib.colors.Normalize(0,1) 
cmap = plt.cm.jet 
mapvals = cmap(norm(r))[:,:3] 

def get_value_from_cm(color): 
    color=matplotlib.colors.to_rgb(color) 
    #if color is already gray scale, dont change it 
    if np.std(color) < 0.1: 
     return np.mean(color) 
    #otherwise return value from colormap 
    distance = np.sum((mapvals - color)**2, axis=1) 
    return r[np.argmin(distance)] 

newim = np.zeros_like(image) 
for i in range(image.shape[0]): 
    for j in range(image.shape[1]): 
     c = image[i,j,:3] 
     newim[i,j] = get_value_from_cm(c) 


fig, (ax,ax2) = plt.subplots(ncols=2) 
ax.imshow(image) 
ax2.imshow(newim, cmap="gray") 

ax.axis("off") 
ax2.axis("off") 
plt.show() 

enter image description here

如可以看到的一个剩下的问题是如何处理它们既不是灰阶,也不是颜色表的一部分的值。这些来自原始图像的抗锯齿,并可能以白色显示。

相关问题