Python光學(xué)仿真實現(xiàn)波長與顏色之間對應(yīng)關(guān)系示例解析
光的顏色
與其說顏色是光的一種屬性,不如說是人眼對可見光頻率范圍內(nèi)的一種感應(yīng),是人眼的一種屬性。而人眼對光頻的感應(yīng)包括三個方面,即明度、色調(diào)和飽和度。
其中,
- 明度與光強有關(guān)
- 色調(diào)反應(yīng)的是光的頻率信息
- 飽和度表示圖像上的顏色與光譜色的接近程度
當(dāng)不考慮色調(diào)、飽和度為0的時候,只考慮明度,則色彩感消失,就是所謂的黑白圖像,或者更嚴格地說是灰度圖像。
色調(diào)與飽和度雖然反應(yīng)色光的頻率信息,但表現(xiàn)的是人眼對光的反饋特性,與光的頻率是不同的物理量。其與光的頻率之間的對應(yīng)關(guān)系也是由人眼的感光細胞決定的。由于自然界中并不存在嚴格的單色光,人的色覺其實是人眼的兩種感光細胞所產(chǎn)生的色覺的混合。
也就是說,幾種基準頻率的光按照不同的飽和度互相混合,人眼將會感受到顏色的變化,也可以說是產(chǎn)生新的顏色。實驗表明,任意三種不能互相轉(zhuǎn)換的顏色可以通過互相混合完成對光譜色的一一對應(yīng)。這樣的三種光叫做三原色,一般選取紅綠藍作為三原色。
由于三者已經(jīng)歸一化,所以只要知道其中兩個值就能夠確定色品,以 r 為橫坐標(biāo) g 為縱坐標(biāo),就能夠表示出所有可能的色品。這種圖大家并不陌生,在手機發(fā)布會上最常見,這里我們畫出一個類似的圖樣
def CIE_RGB(): rgb = np.zeros([1000,1000,3]) r = np.arange(0,1,0.001) r,g = np.meshgrid(r,r) rgb[:,:,0] = r rgb[:,:,1] = g rgb[:,:,2] = 1-r-g over = rgb[:,:,2]<0 rgb[over,:]=[1,1,1] #將色品轉(zhuǎn)化成RGB maxVal = np.max(rgb,2) for i in [0,1,2]: rgb[:,:,i] /= maxVal #rgb[rgb<0]=0 ax = plt.gca() ax.imshow(rgb) ax.invert_yaxis() #plt顯示圖片時y軸從上到下,所以反置 # 坐標(biāo)映射 plt.xticks(range(0,1001,200),['0','0.2','0.4','0.6','0.8','1']) plt.yticks(range(0,1001,200),['0','0.2','0.4','0.6','0.8','1']) plt.show()
然而根據(jù)實驗測得,RGB系統(tǒng)的刺激值存在負值,也就是說上圖中其實并沒有將所有的顏色納入其中,所以CIE又推薦了XYZ色度學(xué)系統(tǒng),其本質(zhì)上是對RGB系統(tǒng)的線性變換,最終讓該系統(tǒng)所對應(yīng)的刺激值為正數(shù)。其公式為
python實現(xiàn)為
#dWave為波長;maxPix為最大值;gamma為調(diào)教參數(shù) def getRGB(dWave,maxPix=1,gamma=1): waveArea = [380,440,490,510,580,645,780] minusWave = [0,440,440,510,510,645,780] deltWave = [1,60,50,20,70,65,35] for p in range(len(waveArea)): if dWave<waveArea[p]: break pVar = abs(minusWave[p]-dWave)/deltWave[p] rgbs = [[0,0,0],[pVar,0,1],[0,pVar,1],[0,1,pVar], [pVar,1,0],[1,pVar,0],[1,0,0],[0,0,0]] #在光譜邊緣處顏色變暗 if (dWave>=380) & (dWave<420): alpha = 0.3+0.7*(dWave-380)/(420-380) elif (dWave>=420) & (dWave<701): alpha = 1.0 elif (dWave>=701) & (dWave<780): alpha = 0.3+0.7*(780-dWave)/(780-700) else: alpha = 0 #非可見區(qū) return [maxPix*(c*alpha)**gamma for c in rgbs[p]]
繪制光譜
def drawSpec(): pic = np.zeros([100,360,3]) rgb = [getRGB(d) for d in range(400,760)] pic = pic+rgb plt.imshow(pic) plt.yticks([]) #隱藏y坐標(biāo)軸 plt.xticks(range(0,360,50),['400','450','500','550','600','650','700','750']) plt.show()
以上就是Python光學(xué)仿真實現(xiàn)波長與顏色之間對應(yīng)關(guān)系示例解析的詳細內(nèi)容,更多關(guān)于Python光學(xué)仿真波長與顏色對應(yīng)關(guān)系的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
如何解決import torchvision報錯問題 DLL:找不到模塊
這篇文章主要介紹了如何解決import torchvision報錯問題 DLL:找不到模塊,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01Python Socket TCP雙端聊天功能實現(xiàn)過程詳解
這篇文章主要介紹了Python Socket TCP雙端聊天功能實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-06-06Python實現(xiàn)根據(jù)Excel生成Model和數(shù)據(jù)導(dǎo)入腳本
最近遇到一個需求,有幾十個Excel,每個的字段都不一樣,然后都差不多是第一行是表頭,后面幾千上萬的數(shù)據(jù),需要把這些Excel中的數(shù)據(jù)全都加入某個已經(jīng)上線的Django項目。所以我造了個自動生成?Model和導(dǎo)入腳本的輪子,希望對大家有所幫助2022-11-11