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