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