提升色觉障碍用户的视频观看体验——播放器色觉辅助功能开发
本文包含以下內(nèi)容
1.簡單介紹人眼彩色視覺的基本原理
2.介紹如何利用算法模擬色覺障礙用戶所看到的畫面
3.基于色覺障礙模擬算法,介紹幾種色覺障礙輔助方法,這些方法可以幫助色覺障礙用戶更好地分辨本來難以分清的顏色
4.介紹如何在Android播放器中集成色覺障礙輔助功能以及我們提供的示例庫
所謂色覺輔助功能,就是幫助色盲、色弱人群更好的觀看視頻。比如下面的畫面,是紅綠兩隊(duì)在進(jìn)行足球比賽
那么一位患有紅綠色盲的用戶看到的畫面可能是下面這樣的
可以看到,由于患有紅綠色盲,這位用戶將難以區(qū)分出比賽中的紅綠兩隊(duì),這勢必會(huì)影響用戶的觀看體驗(yàn)。所謂色覺輔助功能,就是幫助這樣的特殊用戶更好地觀看視頻,經(jīng)過色覺輔助優(yōu)化,我們可以做到讓紅綠色盲看到的畫面變成下面的樣子
可以看到,此時(shí)患有紅綠色盲的用戶也可以很好地分辨出比賽中的兩支隊(duì)伍了。需要注意的是,因?yàn)樯づc色弱的根本成因是生物染色體層面上的,所以不管我們?nèi)绾巫鰞?yōu)化,都不可能讓一名紅色盲用戶重新看到紅色,而只能在最大程度上幫助他恢復(fù)出他所看不到的畫面信息。
色覺障礙輔助功能并不是我們最先提出與實(shí)現(xiàn)的。從Android L開始,在原生Android系統(tǒng)的“無障礙”選項(xiàng)中就提供了色彩校正的功能,可以讓設(shè)備更適合色盲用戶使用,不過國內(nèi)手機(jī)ROM一般都沒有開放這個(gè)功能;三星則推出了SeeColors應(yīng)用,它可以測試出用戶的色弱類型和等級,基于測試結(jié)果調(diào)整三星電視機(jī)的色彩設(shè)置,讓色盲人士也能體驗(yàn)到豐富的色彩;騰訊視頻也在安卓端全面上線了色彩輔助功能,幫助色盲用戶在不破壞觀看體驗(yàn)的同時(shí),保持場景自然色彩、提升場景分辨能力并提高觀看舒適度;一些游戲,如《戰(zhàn)地1》,也提供了色盲模式供玩家選擇。
在本系列文章中,我們將結(jié)合理論,算法與實(shí)踐,介紹如何從Android視頻播放器的角度,開發(fā)色覺輔助功能,最終實(shí)現(xiàn)多達(dá)十個(gè)檔次的色弱與色盲輔助優(yōu)化。希望能夠拋磚引玉,為更多有興趣開發(fā)此功能的團(tuán)隊(duì)提供一個(gè)思路,也希望能夠多多交流,指出我們可能存在的錯(cuò)誤與不足。
一、從人眼彩色視覺說起
我們知道,不同波長的可見光具有不同的顏色,如下圖所示,短波長的光呈現(xiàn)為藍(lán)色,長波長的光則呈現(xiàn)出紅色。
對應(yīng)到人眼中,有3種視錐細(xì)胞,它們具有不同的光譜敏感度(Spectral sensitivity),造就了人眼的三色視覺(Trichromacy)。一般來說,這三種視錐細(xì)胞按照它們的光譜敏感度峰值波長的順序,分別被稱為:短(S)、中(M)、和長 (L)的視錐細(xì)胞類型。S、M和L類別視錐細(xì)胞對單色光譜刺激的歸一化響應(yīng)光譜如下圖所示
大致可以看出,L細(xì)胞對紅色光更敏感,M細(xì)胞對綠色光更敏感,S細(xì)胞則對藍(lán)色光更敏感。更具體地,這三種細(xì)胞的響應(yīng)波長范圍和峰值響應(yīng)范圍如下表所示
而色盲與色弱的成因就與這三種視錐細(xì)胞的缺失或功能缺陷有關(guān)。比如,L視錐細(xì)胞的缺失就會(huì)導(dǎo)致紅色盲,而M視錐細(xì)胞功能的缺陷就會(huì)導(dǎo)致綠色弱。前面我們看到,L錐細(xì)胞和M錐細(xì)胞的敏感波段有所重疊,所以紅色盲,綠色盲的癥狀相似,一般統(tǒng)稱為紅綠色盲。
據(jù)統(tǒng)計(jì),全球約6%人口為色弱,約2%人口色盲,極少數(shù)為單色視覺(全色盲)。紅綠色盲人口占全球男性人口約8%,女性人口約0.5%(因?yàn)榧t綠色盲是X染色體隱性遺傳病)。藍(lán)色盲患者則非常少見,一般認(rèn)為是后天所得。
石原氏色盲檢測圖是常用于判斷是否患有色盲與色弱的工具,考過駕照的朋友應(yīng)該都不陌生,比如下圖,從左到右,從上到下依次是數(shù)字8,29,5,3,15,74,26,42。
而紅色盲患者看到的畫面可能是下面這樣的,可以看到,很多數(shù)字都看不清了,或者會(huì)看成別的數(shù)字
綠色盲患者看到的畫面則可能是下面這樣的,一樣有很多數(shù)字看不清或看錯(cuò),但是與紅色盲患者看到的又有所不同。
再舉一個(gè)有意思的例子,炒股的朋友都很熟悉的K線圖,如下
那么一名紅綠色盲患者所看到的K線圖則可能是下面這樣的,體驗(yàn)可以說是非常不好了。
二、算法模擬色覺障礙用戶所看到的畫面
研究色覺輔助算法的第一步是嘗試用算法模擬色覺障礙用戶所看到的畫面。
色盲與色弱模擬的總體流程如下圖所示
圖中涉及到兩個(gè)色彩空間,一個(gè)是我們熟悉的RGB色彩空間,一個(gè)是LMS色彩空間。
本文中會(huì)涉及到的各種色彩空間
RGB色彩空間:將紅綠藍(lán)三個(gè)通道作為笛卡爾坐標(biāo)系中的x,y,z軸,所得到的對顏色的空間描述。
XYZ色彩空間:X,Y,Z是假想出的三原色,自然界中并不存在,而只是由RGB經(jīng)過線性變換后得到的。因?yàn)榛赗GB模型繪制的色度圖存在著負(fù)區(qū)間,這使得計(jì)算和轉(zhuǎn)換都不方便,XYZ空間就是為了讓所有計(jì)算和轉(zhuǎn)換都在正數(shù)區(qū)間而設(shè)計(jì)的。
LMS色彩空間:根據(jù)三種視錐細(xì)胞的刺激比例來描述各種顏色。
YUV/YCbCr色彩空間:做多媒體的朋友應(yīng)該都很熟悉了,Y代表亮度,UV代表色度。
Lab色彩空間:Lab色彩空間是基于XYZ色彩空間得出的,比XYZ空間更接近人眼的感知,其中L為亮度;a的正數(shù)代表紅色,負(fù)端代表綠色;b的正數(shù)代表黃色,負(fù)端代表藍(lán)色。
RGB空間和LMS空間的相互轉(zhuǎn)換都有現(xiàn)成的公式,即圖中的U及其逆矩陣都是已知的。前面提到色盲與色弱的生理成因都與LMS三種細(xì)胞的缺失或缺陷有關(guān),相應(yīng)的,色盲與色弱模擬的關(guān)鍵就在于找出正常LMS空間到異常L’M’S’空間之間的轉(zhuǎn)換矩陣T。
色盲模擬
這里參考以下兩篇經(jīng)典論文介紹色盲模擬的基本思路
已知正常視覺人群能看到的顏色在LMS三維空間中,因?yàn)樯さ某梢蚴悄骋环N視錐細(xì)胞的缺失,所以色盲人群能看到的顏色應(yīng)該在LMS三維空間中的一個(gè)二維平面上,具體到紅綠藍(lán)三種色盲,就是分別把RGB空間的顏色沿著L、M、S三個(gè)方向投射在不同的平面上,那么問題的關(guān)鍵是如何找到這個(gè)二維平面。
以紅綠色盲的模擬為例,有下圖
圖中大的立方體是LMS色彩空間,小的立方體可以看做是RGB顏色在LMS色彩空間中的表示。
圖中有三條直線(三個(gè)向量),它們的意義是:OE代表的是灰度顏色,即使是色盲人群也可以正常分辨,所以它一定在色盲人群所能看到的顏色面上;圖中475nm這條線對應(yīng)的是偏藍(lán)色的光,實(shí)驗(yàn)發(fā)現(xiàn)紅綠色盲患者可以正確的分辨這一顏色,所以這條線一定在紅綠色盲人群所能觀察到的顏色平面上;圖中575nm這條線對應(yīng)的是偏黃色的光,實(shí)驗(yàn)發(fā)現(xiàn)紅綠色盲患者也可以正確的分辨這一顏色,所以這條線也一定在紅綠色盲所能觀察到的顏色平面上。
兩條相交直線可以確定一個(gè)平面。現(xiàn)在我們得到了三條相交直線,即紅綠色盲人群觀察到的顏色集中在兩個(gè)顏色平面上,分別是圖中的深灰色平面和淺灰色平面。
那么對于某一顏色Q,紅色盲看到的顏色相當(dāng)于Q點(diǎn)沿L方向投射到對應(yīng)的平面上,即圖中Q’p點(diǎn)。綠色盲看到的顏色相當(dāng)于Q點(diǎn)沿M方向投射到對應(yīng)的平面上,即圖中Q’d點(diǎn)。求Q和Q’之間的關(guān)系,也就得到了我們需要的T矩陣。
來回憶一點(diǎn)數(shù)學(xué)基礎(chǔ)知識(shí)
1.向量的點(diǎn)乘:V1(x1,y1)?V2(x2,y2)=x1?x2+y1?y2V1(x1,y1)·V2(x2,y2)=x1·x2+y1·y2 ,結(jié)果得到一個(gè)標(biāo)量
2.向量的叉乘:
a(x1,y1,z1)×b(x2,y2,z2)=(y1?z2?y2?z1)i?(x1?z2?x2?z1)j+(x1?y2?x2?y1)ka(x1,y1,z1)×b(x2,y2,z2)=(y1·z2?y2·z1)i?(x1·z2?x2·z1)j+(x1·y2?x2·y1)k
結(jié)果得到一個(gè)向量,這個(gè)向量與原來兩個(gè)向量都垂直
3.如果是兩向量點(diǎn)乘為0,則兩向量垂直; 如果是兩向量叉乘為0,則兩向量平行
先來考慮深灰色平面,設(shè)前面圖中提到的OE直線對應(yīng)的向量為E,475nm可見光對應(yīng)的向量為A,OQ’p直線對應(yīng)的向量為Q’,則E×AE×A得到的是深灰色平面的法向量,它與Q’垂直,即
(E×A)?Q′=0(E×A)·Q′=0
即
a?L(Q′)+b?M(Q′)+c?S(Q′)=0a·L(Q′)+b·M(Q′)+c·S(Q′)=0
其中
a=M(E)?S(A)?S(E)?M(A)a=M(E)·S(A)?S(E)·M(A)
b=S(E)?L(A)?L(E)?S(A)b=S(E)·L(A)?L(E)·S(A)
c=L(E)?M(A)?M(E)?L(A)c=L(E)·M(A)?M(E)·L(A)
以紅色盲模擬為例,對于已知的Q和未知的Q’p點(diǎn),有M(Q)=M(Q′)M(Q)=M(Q′)和S(Q)=S(Q′)S(Q)=S(Q′)
則
L(Q′)=?[b?M(Q)+c?S(Q)]/aL(Q′)=?[b·M(Q)+c·S(Q)]/a
因?yàn)镋和A都是已知量,所以上面a,b,c都是已知量。由此就得到了Q和Q’之間的關(guān)系。
但是事情還是有點(diǎn)復(fù)雜,尤其是要考慮兩個(gè)平面,能不能更簡單一點(diǎn)呢?
回看上面的圖,可以發(fā)現(xiàn)深灰色和淺灰色的兩個(gè)平面的夾角很小,那么可以近似化簡為一個(gè)平面。同時(shí),475nm的單色光與藍(lán)色光很接近,也可以直接近似為RGB空間中坐標(biāo)(0, 0, 255)的藍(lán)色光。此外,OE直線對應(yīng)的灰度顏色可以直接近似為原點(diǎn)到RGB空間中坐標(biāo)(255, 255, 255)的白色點(diǎn)所連接的直線。于是上面的圖變成了下面這個(gè)樣子,是不是簡潔多了。
此時(shí),紅綠色盲所能看到的顏色面就是圖中的KBWY平面,說白了就是把小立方體從對角切開所得到的R=G的顏色面。藍(lán)色盲模擬的思路相同。
現(xiàn)在我們可以開始計(jì)算從LMS到L’M’S’轉(zhuǎn)換的T矩陣了:
對于紅色盲模擬,T=
對于綠色盲模擬,T=
對于藍(lán)色盲模擬,T=
結(jié)合RGB空間與LMS空間之間的轉(zhuǎn)換矩陣,最后得到從RGB到R’G’B’之間的色盲模擬轉(zhuǎn)換矩陣如下
對于紅色盲模擬,T’=
對于綠色盲模擬,T’=
對于藍(lán)色盲模擬,T’=
觀察上面的三個(gè)矩陣,會(huì)發(fā)現(xiàn):對于紅色盲模擬,相當(dāng)于把RGB空間的顏色沿著L軸投射到R=G的顏色面;對于綠色盲模擬,相當(dāng)于把RGB空間的顏色沿著M軸投射到R=G的顏色面;對于藍(lán)色盲模擬,相當(dāng)于把RGB空間的顏色沿著S軸投射到B=G的顏色面。
至此,我們就完成了色盲模擬的工作。
色弱模擬
在色弱模擬方面沒有太多公認(rèn)的經(jīng)典論文,國內(nèi)有高校論文提出可以直接基于色盲模擬矩陣加權(quán)計(jì)算得出色弱模擬矩陣,從數(shù)學(xué)上講說得通,但是缺少人眼視覺認(rèn)知的理論基礎(chǔ)。在這里我們參考下面論文的理論介紹如何做色弱模擬
Machado G M, Oliveira M M, Fernandes L A F. A physiologically-based model for simulation of color vision deficiency[J]. IEEE Transactions on Visualization and Computer Graphics, 2009, 15(6): 1291-1298.
前面我們提到色弱的成因是視錐細(xì)胞功能的缺陷,那么這里的缺陷具體是什么?回看前面那張S、M和L類別視錐細(xì)胞對單色光譜刺激的歸一化響應(yīng)光譜圖,我們可以定義視錐細(xì)胞功能缺陷為:視錐細(xì)胞對單色光譜刺激峰值響應(yīng)的偏移。比如下圖是紅色弱人群的視錐細(xì)胞響應(yīng)光譜圖,可以看到L視錐細(xì)胞的響應(yīng)曲線發(fā)生了偏移,和M細(xì)胞的響應(yīng)曲線發(fā)生重疊,這就導(dǎo)致紅色弱人群難以區(qū)分紅色和綠色,偏移程度的不同即代表色弱嚴(yán)重程度的不同,如果偏移量到達(dá)了20nm,基本就和色盲的效果一樣了。
若正常視覺的三條響應(yīng)曲線可以表示為L(λ)L(λ),M(λ)M(λ),S(λ)S(λ),λ為波長,則紅色弱的響應(yīng)曲線可以表示為
Lp(λ)=L(λ+Δλ)Lp(λ)=L(λ+Δλ)
Mp(λ)=M(λ)Mp(λ)=M(λ)
Sp(λ)=S(λ)Sp(λ)=S(λ)
其中ΔλΔλ為偏移量。所以我們的關(guān)鍵在于求出各種ΔλΔλ下的Lp(λ)Lp(λ),就得到了不同檔次的色弱模擬方法,在0-20nm之間均勻取十檔,就得到了十檔色弱模擬方法。
先考慮極端情況,也就是Δλ=20Δλ=20的情況,此時(shí)Lprotanope(λ)Lprotanope(λ)和M(λ)M(λ)基本重合,直覺上應(yīng)該有Lprotanope(λ)=M(λ)Lprotanope(λ)=M(λ),但是我們仔細(xì)觀察上面的圖,會(huì)發(fā)現(xiàn)L錐細(xì)胞和M錐細(xì)胞的響應(yīng)曲線并非完全重合,起碼L錐細(xì)胞的曲線要“胖”一些,考慮到這一點(diǎn),我們要對M錐細(xì)胞的響應(yīng)曲線做一下拉伸才能得到此時(shí)的Lprotanope(λ)Lprotanope(λ),如下
AreaL=∫L(λ)dλAreaL=∫L(λ)dλ
AreaM=∫M(λ)dλAreaM=∫M(λ)dλ
Lprotanope(λ)=AreaLAreaMM(λ)Lprotanope(λ)=AreaLAreaMM(λ)
有了在極端色盲情況下的結(jié)果,那么各種檔次色弱情況下的Lp(λ)也很好得出了,直接用最簡單的線性加權(quán),如下
Lp(λ)=αL(λ)+(1?α)AreaLAreaMM(λ)Lp(λ)=αL(λ)+(1?α)AreaLAreaMM(λ)
其中
α=20?Δλ20α=20?Δλ20
我們認(rèn)為,到這一步,就和色盲模擬中的一樣,得到了LMS到L’M’S’的轉(zhuǎn)換方法,采用和色盲模擬一樣的思路即可得到RGB到R’G’B’的轉(zhuǎn)換,完成色弱模擬的工作。不過在參考論文中,基于人眼視覺認(rèn)知的理論基礎(chǔ),以及實(shí)驗(yàn)數(shù)據(jù),還做了一些額外的工作。首先是對上面的式子做了一點(diǎn)微調(diào),加入一個(gè)常系數(shù)0.96,此時(shí)的Lp(λ)Lp(λ)為
Lp(λ)=αL(λ)+(1?α)0.96AreaLAreaMM(λ)Lp(λ)=αL(λ)+(1?α)0.96AreaLAreaMM(λ)
其次參考論文中還考慮了顏色認(rèn)知理論中的“階段學(xué)說”,加入了一個(gè)從LMS空間到IPT空間的轉(zhuǎn)換步驟,最終得出的結(jié)果更加精確。鑒于此,我們也直接采用了參考論文所給出的矩陣結(jié)果。
階段學(xué)說認(rèn)為顏色視覺認(rèn)知過程可以分為兩個(gè)階段:第一階段為視網(wǎng)膜階段或者稱為感光階段,具有顏色疊加的性質(zhì),顏色視覺符合三色學(xué)說的規(guī)律,也就是我們前面一直說的LMS空間的事兒;第二階段為視神經(jīng)傳輸階段,具有對立色的性質(zhì),所謂對立色的理論依據(jù)是顏色感覺總是以紅-綠、黃-藍(lán)、黑-白成對出現(xiàn)的視覺現(xiàn)象,同時(shí)形成了 Intensity-Protan-Tritan (IPT)顏色空間,I對應(yīng)黑白,P對應(yīng)紅綠,T對應(yīng)黃藍(lán)。從LMS到IPT的轉(zhuǎn)換矩陣是已知的。
驗(yàn)證模擬的結(jié)果
在上面我們分別介紹了色盲和色弱的模擬方法,那么如何驗(yàn)證模擬算法的準(zhǔn)確性呢?如果使用石原氏色盲檢測圖來驗(yàn)證的話,無法得到定量的結(jié)果,而且也未必有足夠的資源來找到各種患有不同程度色弱或色盲的被試來進(jìn)行主觀評價(jià)實(shí)驗(yàn)。
在這里,我們使用一款名為“Color Blind Check”的APP作為驗(yàn)證工具,該APP的測試界面如下圖所示,被試需要從眾多小方塊中找出顏色不同的3x3方塊區(qū)域。
在測試結(jié)束后,它可以顯示如下的打分頁面,圖中Severity代表色盲或色弱的嚴(yán)重程度,分?jǐn)?shù)越高越嚴(yán)重,PDT Score代表偏向紅,綠,藍(lán)三種色覺障礙類型中的哪一種以及偏向的程度,比如圖中的0-0-3就代表輕微偏向藍(lán)色覺障礙。
我們邀請了幾位色覺障礙用戶試用了該APP,通過與他們的交流和測試結(jié)果來看,該APP的打分結(jié)果可靠性很高。從應(yīng)用商店的評價(jià)以及開發(fā)者網(wǎng)站的介紹來看也能佐證這一點(diǎn)。
為了驗(yàn)證前面提出的色盲色弱模擬矩陣的準(zhǔn)確性,我們需要先將這些矩陣應(yīng)用到Android SurfaceFlinger中,修改顯示顏色,并且在該環(huán)境下利用驗(yàn)證APP進(jìn)行測試,觀察測試結(jié)果。
前面提到,從Android L開始,原生系統(tǒng)就支持色盲輔助功能,對應(yīng)的代碼實(shí)現(xiàn)在
/frameworks/native/services/surfaceflinger/Effects/Daltonizer.cpp
閱讀代碼即可發(fā)現(xiàn)其中包含了色盲模擬和色盲輔助的邏輯,其中色盲模擬所采用的算法和我們前面介紹的一致,而色盲輔助的部分我們在下一小節(jié)中再展開詳細(xì)介紹。
把我們的色盲色弱模擬矩陣加進(jìn)去之后如何生效呢?對應(yīng)的代碼實(shí)現(xiàn)在
/frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
也就是說,我們可以通過下面的命令讓色盲模擬矩陣生效,擴(kuò)展一下也可以很容易的讓我們的色弱矩陣生效。
通過adb shell service call SurfaceFlinger 1014 i32 1進(jìn)入紅色盲模擬模式 通過adb shell service call SurfaceFlinger 1014 i32 2進(jìn)入綠色盲模擬模式 通過adb shell service call SurfaceFlinger 1014 i32 3進(jìn)入藍(lán)色盲模擬模式篇幅所限,這里貼上我們的部分驗(yàn)證結(jié)果。色弱級別取十級,對應(yīng)level9 ~ level1,level9為嚴(yán)重色弱,level1為輕度色弱。結(jié)果如下表:
| 紅色盲 | 100 | 10-0-0 |
| 紅色弱level9 | 88 | 8-0-0 |
| 紅色弱level8 | 63 | 10-0-0 |
| 紅色弱level7 | 48 | 10-0-0 |
| 紅色弱level6 | 38 | 3-0-0 |
| 紅色弱level5 | 22 | 3-0-0 |
| 紅色弱level4 | 10 | 3-2-2 |
| 紅色弱level3 | 6 | 3-0-3 |
| 綠色盲 | 100 | 0-10-0 |
| 綠色弱level9 | 84 | 0-6-0 |
| 綠色弱level8 | 58 | 0-10-0 |
| 綠色弱level7 | 42 | 0-10-0 |
| 綠色弱level6 | 29 | 1-6-0 |
| 綠色弱level5 | 18 | 0-18-0 |
| 綠色弱level4 | 9 | 0-6-0 |
| 藍(lán)色盲 | 100 | 0-0-10 |
從測試結(jié)果可以看到,我們采用的色盲與色弱模擬算法可以與人眼視覺達(dá)到較高的一致性,同時(shí)還可以看到,色弱等級低到level3左右時(shí),色弱的癥狀就很輕微了。
三、色覺障礙輔助算法
色覺障礙輔助的基本思路如下圖所示
拿到一張RGB原圖后,利用前面計(jì)算出的色盲色弱模擬矩陣,可以計(jì)算出色覺障礙用戶所看到畫面R’G’B’,兩者相減得到的就是色覺障礙用戶所看不到的顏色,記為Error Picture, 簡稱為EP。
利用Transform矩陣對EP進(jìn)行顏色轉(zhuǎn)換,將色覺障礙用戶看不到的信息映射到他們能看到的色域(顏色通道)中去,得到修正后的EP,記為Spreaded Error Picture,簡稱為SEP。
最后將SEP疊加到RGB原圖上面去,得到優(yōu)化后的畫面。當(dāng)色覺障礙用戶觀看這樣的畫面時(shí),就可以分辨出他們本來無法看到的顏色信息了。
需要明確的一點(diǎn)是:如前所述,色覺障礙是生理原因?qū)е碌?#xff0c;所以我們不可能讓一個(gè)紅色盲患者重新看到紅色。我們能做的優(yōu)化是:恢復(fù)出色覺障礙用戶看不到的圖像信息。比如分辨球賽中的兩隊(duì)隊(duì)員,股票k線圖的漲跌等。
現(xiàn)在的關(guān)鍵問題在于如何求Transform矩陣。方法有很多。
色覺障礙輔助方法一
直接在RGB空間中操作,把色覺障礙用戶感知不到的顏色全都轉(zhuǎn)換為其他的顏色
以紅色盲為例,得到Error Picture后,乘上如下的Transform矩陣
相當(dāng)于把70%的紅色分別分散到綠色和藍(lán)色通道中。
色覺障礙輔助方法二
在Lab色彩空間中操作,Lab中的L代表亮度通道,a代表紅綠通道,b代表藍(lán)黃通道,可以看到a通道正好對應(yīng)的是紅綠色覺障礙用戶所難以分辨的顏色,而b通道對應(yīng)的是藍(lán)色覺障礙用戶所難以分辨的顏色。
還是以紅色盲為例,得到Error Picture后,先轉(zhuǎn)換為Lab色彩空間,然后乘上如下的Transform矩陣
相當(dāng)于把50%的紅綠通道色分散到亮度通道中,把100%的紅綠通道色分散到藍(lán)黃通道中。但是需要注意的是,RGB到Lab空間的轉(zhuǎn)換計(jì)算非常復(fù)雜,運(yùn)算量很高。
色覺障礙輔助方法三
在YUV色彩空間中操作,YUV中的Y代表亮度通道,U近似藍(lán)綠通道,V近似紅綠通道。可以看到V通道對應(yīng)的是紅綠色覺障礙用戶所難以分辨的顏色,而U通道近似對應(yīng)的是藍(lán)色覺障礙用戶所難以分辨的顏色。
以紅色盲為例,得到error picture后,先轉(zhuǎn)換為YUV色彩空間,再乘上如下的Transform矩陣
相當(dāng)于把70%的紅綠通道色分散到亮度通道中,把70%的紅綠通道色分散到藍(lán)綠通道中。相比于RGB到Lab空間的轉(zhuǎn)換,RGB到Y(jié)UV空間的轉(zhuǎn)換就簡單的多了。
色覺障礙輔助方法四
在LMS色彩空間中操作,因?yàn)長MS就是基于人眼視錐細(xì)胞類型所建立的色彩空間,所以當(dāng)然可以在LMS空間中操作了。
以紅色盲為例,得到error picture后,先轉(zhuǎn)換為LMS色彩空間,再乘上如下的Transform矩陣
相當(dāng)于把70%的L通道色分散到M通道中,把70%的L通道色分散到S通道中。Android原生就是采用這種方法的。
上面四個(gè)方法無所謂誰對誰錯(cuò),并且Transform矩陣的參數(shù)可以根據(jù)測試結(jié)果進(jìn)行微調(diào),甚至可以在色盲輔助時(shí)使用一種方法,在色弱輔助時(shí)使用另一種方法,這里我們從實(shí)際效果和運(yùn)行性能的角度來進(jìn)行選擇:
對紅色盲,選擇在RGB空間中進(jìn)行校正,對紅色弱,選擇在YUV空間中進(jìn)行校正;
對綠色盲和level5以上的綠色弱,選擇在YUV空間中進(jìn)行校正,對level5以下的綠色弱,選擇在RGB空間中進(jìn)行校正;
對藍(lán)色盲和藍(lán)色弱,選擇在LMS空間中進(jìn)行校正。
下面以在YUV空間中校正紅色盲為例,介紹一下如何求出最終的色覺障礙輔助矩陣:
已知RGB 空間到Y(jié)UV空間的轉(zhuǎn)換矩陣為X;
YUV空間到RGB空間的轉(zhuǎn)換矩陣為X’;
前面求出的紅色盲模擬矩陣為T’;
那么,假設(shè)現(xiàn)有一張RGB顏色空間的圖片,我們只要利用如下的顏色轉(zhuǎn)換矩陣,就可以將它轉(zhuǎn)換為專為紅色盲優(yōu)化后的圖片:
CorrectR=X′?(X+Transform?(X–X?T′))CorrectR=X′·(X+Transform·(X–X·T′))
對于其他幾種方法,也是類似的思路。在文章的最后,我們將貼出我們計(jì)算出來的所有矩陣。
驗(yàn)證色覺障礙輔助結(jié)果
和之前的驗(yàn)證一樣,我們一方面通過色盲檢測圖獲得定性結(jié)果,一方面利用檢測APP獲得定量結(jié)果。需要注意的是,這里我們要在色覺輔助的基礎(chǔ)上再加上色覺障礙模擬,從而得到優(yōu)化后色覺障礙用戶所看到的結(jié)果。
下面的圖是經(jīng)過優(yōu)化后紅色盲所看到的色盲檢測圖
下圖是經(jīng)過優(yōu)化后綠色盲所看到的色盲檢測圖
相比于文章開頭的色盲檢測圖,圓圈中的數(shù)字已經(jīng)變得清晰可見了。
再來看球賽的例子,下面是優(yōu)化后紅綠色盲所看到的圖
相比于文章開頭的示例圖,現(xiàn)在色覺障礙用戶可以更好地分辨兩隊(duì)球員了。
最后來看股票k線圖的例子,下面是優(yōu)化后紅綠色盲所看到的圖,效果也是顯而易見的
下面來看一下測試結(jié)果,篇幅所限,這里貼上我們的部分驗(yàn)證結(jié)果。還是一樣,色弱級別取十級,對應(yīng)level9 ~ level1,level9為嚴(yán)重色弱,level1為輕度色弱。結(jié)果如下表:
| 紅色盲 | 100 | 35 |
| 紅色弱level9 | 88 | 34 |
| 紅色弱level8 | 63 | 26 |
| 紅色弱level7 | 48 | 23 |
| 紅色弱level6 | 38 | 20 |
| 紅色弱level5 | 22 | 9 |
| 綠色盲 | 100 | 59 |
| 綠色弱level9 | 84 | 53 |
| 綠色弱level8 | 58 | 34 |
| 綠色弱level7 | 42 | 30 |
| 綠色弱level6 | 29 | 21 |
| 綠色弱level5 | 18 | 3 |
| 藍(lán)色盲 | 100 | 36 |
從測試結(jié)果可以看到,使用我們的色覺障礙輔助算法可以為色覺障礙用戶帶來更好的視頻觀看體驗(yàn)。
將色覺輔助功能集成到Android播放器中
可以看到,我們采用的色覺障礙輔助算法最后得到的其實(shí)就是幾個(gè)矩陣,非常適合用OpenGL的fragment shader來實(shí)現(xiàn),所以用MediaPlayer\MediaCodec + GLSurfaceView的方案是一個(gè)不錯(cuò)的選擇。簡單來說我們要做的就是一個(gè)播放器后處理模塊。
對OpenGL和GLSurfaceView相關(guān)知識(shí)比較陌生的朋友可以先了解一些入門知識(shí),受篇幅限制這里就不展開介紹了,直接貼出我們基于GPUImage等編寫的示例庫,地址如下,其中也包含了我們所計(jì)算出的所有色覺輔助矩陣。歡迎試用交流討論。
https://github.com/letvmedia/SpoRenderer
文/ Gray
總結(jié)
以上是生活随笔為你收集整理的提升色觉障碍用户的视频观看体验——播放器色觉辅助功能开发的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 人工智能、机器学习及深度学习视频教程大合
- 下一篇: 多目标优化算法:MOFPA、MOFA、M