2017-07-27 75 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

如可以看到的一個剩下的問題是如何處理它們既不是灰階,也不是顏色表的一部分的值。這些來自原始圖像的抗鋸齒,並可能以白色顯示。

相關問題