陳蓓蓓,陳嘉玲,鄭萬挺
眩暈癥是一種因?qū)臻g定位障礙而產(chǎn)生的運(yùn)動(dòng)性或位置性錯(cuò)覺,患者常常感覺自身或周圍事物不停旋轉(zhuǎn)、搖擺[1]。眩暈癥的病因多樣,主要為前庭病變,其表現(xiàn)為感覺到陣發(fā)性的外物或本身的旋轉(zhuǎn)、傾倒感、墮落感,多伴有明顯的惡心、嘔吐等植物神經(jīng)癥狀[2]?;颊叱霈F(xiàn)眩暈癥時(shí)伴有異常的眼震,這種眼球震顫運(yùn)動(dòng)可以作為眩暈癥診斷要素[3]。醫(yī)生可以通過眼球運(yùn)動(dòng)軌跡圖來分析病因。
移動(dòng)醫(yī)療平臺將互聯(lián)網(wǎng)和醫(yī)療創(chuàng)造性地結(jié)合在一起,克服部分線下醫(yī)療服務(wù)等待時(shí)間長、即時(shí)性差、交互性差的缺點(diǎn)。診斷技術(shù)和移動(dòng)技術(shù)的結(jié)合,使人們跨越時(shí)間、空間的障礙,享受更優(yōu)質(zhì)的醫(yī)療服務(wù)[4]。
如果將眩暈癥診斷和移動(dòng)醫(yī)療平臺相結(jié)合,為醫(yī)患提供一個(gè)初步診斷的平臺[5],就能提高醫(yī)生診斷效率,快速排查哪些是需要盡快就診的患者,對患者來說也可以減少大量時(shí)間和精力。
移動(dòng)遠(yuǎn)程眩暈癥診斷平臺的設(shè)計(jì)主要包括5 大部分:服務(wù)器、數(shù)據(jù)庫、供用戶操作的平臺網(wǎng)頁、視頻處理程序、自動(dòng)診斷程序,如圖1所示。這5 個(gè)部分,由服務(wù)器上發(fā)布的Web Service實(shí)現(xiàn)連接,互相通信。一方面,Web Service 將患者錄入的注冊信息通信給數(shù)據(jù)庫,進(jìn)行錄入,又通過數(shù)據(jù)庫查詢用戶信息使用戶成功登錄,患者可以查詢自己的診斷結(jié)果,醫(yī)生可以查詢其患者的聯(lián)系方式。另一方面,患者將視頻上傳到服務(wù)器的文件系統(tǒng)上,Web Service 通信Matlab對獲取的視頻進(jìn)行處理,得到瞳孔中心運(yùn)動(dòng)軌跡圖和自動(dòng)診斷的結(jié)果,得到的軌跡圖存放在服務(wù)器上,自動(dòng)診斷的結(jié)果錄入數(shù)據(jù)庫[6]。
圖1 系統(tǒng)的總體設(shè)計(jì)Fig.1 Overall design of the system
網(wǎng)頁端需滿足患者注冊、登錄、錄制視頻、上傳視頻、查詢自動(dòng)診斷的需求,以及醫(yī)生查詢其名下病人瞳孔中心運(yùn)動(dòng)軌跡圖和聯(lián)系方式的需求[7],如圖2所示,患者錄制的視頻通過Web Service 上傳到服務(wù)器文件系統(tǒng)中,Web Service 通信Matlab 程序?qū)⒁曨l進(jìn)行處理,得到軌跡圖和自動(dòng)診斷的結(jié)果,軌跡圖保存在服務(wù)器的文件系統(tǒng)中,以病人id 進(jìn)行命名,自動(dòng)診斷結(jié)果通過Web Service 存入數(shù)據(jù)庫;醫(yī)生查詢軌跡圖,Web Service 將服務(wù)器中對應(yīng)患者的軌跡圖調(diào)出,同時(shí)顯示患者的聯(lián)系方式。
圖2 網(wǎng)頁端流程Fig.2 Flowchart of web page
如圖3所示,經(jīng)Web Service 通信,調(diào)用Matlab 程序?qū)⑸蟼鞯椒?wù)器的視頻先進(jìn)行解碼,讀取其中一部分的幀[8],對得到的圖片進(jìn)行瞳孔中心定位,最后得到一張瞳孔中心軌跡圖,軌跡圖中分別展示了水平方向和垂直方向瞳孔運(yùn)動(dòng)變化,軌跡圖存放在服務(wù)器的文件系統(tǒng)中,以患者的id命名。
圖3 視頻處理流程Fig.3 Flowchart of video processing
本文設(shè)計(jì)的自動(dòng)診斷程序建立在眩暈癥臨床表現(xiàn)——眼震的基礎(chǔ)上。眼震是眼球一種非自主的節(jié)律性運(yùn)動(dòng),根據(jù)震顫方向主要分為3種:水平性、垂直性、旋轉(zhuǎn)性。本文主要研究水平性眼震以及垂直性眼震。眩暈癥的臨床分類主要分為以下兩種,其臨床表現(xiàn)有所差異[9-10],如表1、表2所示。
表1 周圍性眩暈臨床表現(xiàn)Tab.1 Clinical manifestations of peripheral vertigo
表2 中樞性眩暈臨床表現(xiàn)Tab.2 Clinical manifestations of central vertigo
本文設(shè)計(jì)的眩暈癥輔助自動(dòng)診斷主要針對中樞性眩暈,根據(jù)其眩暈室眼球震顫方向不定、幅度大的特點(diǎn)來設(shè)計(jì)程序。通過網(wǎng)頁提供觸發(fā)眩暈癥的圖片,收集病人凝視眩暈癥觸發(fā)圖片后的瞳孔中心軌跡圖,分析水平方向眼震和垂直方向眼震的幅度,因此需要設(shè)定合理的幅度閾值,才能篩選出符合條件的瞳孔運(yùn)動(dòng)軌跡。
按眼球震顫幅度可分為三類:第一類幅度小,幅度在1 mm 以內(nèi);第二類為中等,幅度在1~3 mm 之間;第三類幅度大,幅度在3 mm 以上。根據(jù)中樞性眩暈眼球震顫幅度大這一特點(diǎn),可確定合理閾值。
像素與毫米的轉(zhuǎn)換需要知道DPI(每英寸點(diǎn)數(shù)),根據(jù)公式:象素?cái)?shù)/DPI=英寸數(shù);英寸數(shù)×25.4=毫米數(shù)。已知圖片分辨率的情況下,水平方向和垂直方向眼震幅度轉(zhuǎn)換為像素的公式分別如式(1)和式(2)所示:
遍歷橫坐標(biāo)數(shù)組X與縱坐標(biāo)數(shù)組Y,將每個(gè)數(shù)組的最大值最小值相減得到的差除以2,得到兩個(gè)近似水平和垂直振幅的值Xzf和Yzf,與上面得到的閾值作比較,只要水平方向或垂直方向上的一個(gè)幅值大于其對應(yīng)的閾值,則推斷疑似患有眩暈癥,兩個(gè)方向上的幅值都小于閾值,則推斷為正常人,如圖4所示。
圖4 自動(dòng)診斷流程Fig.4 Flowchart of automatic diagnosis
在SQL serve 2008 中進(jìn)行數(shù)據(jù)庫的設(shè)計(jì),主要設(shè)計(jì)了兩張表來存放醫(yī)生、患者的信息,如表3、表4所示。
數(shù)據(jù)庫中的醫(yī)生信息是預(yù)先錄入的,醫(yī)生只需登錄即可,患者用戶需要先進(jìn)行注冊,再進(jìn)行登錄。數(shù)據(jù)庫還需要將自動(dòng)診斷的結(jié)果錄入,這種網(wǎng)頁端和Matlab程序與數(shù)據(jù)庫的交互都需要Web Service服務(wù),如圖5所示。
本文的移動(dòng)遠(yuǎn)程眩暈癥診斷平臺的設(shè)計(jì)是基于不同平臺不同語言進(jìn)行開發(fā)的,因此使用ASP.NET自帶的Web Service服務(wù)進(jìn)行不同程序間的通信。在Visual Studio 2019 中創(chuàng)建Web Service 服務(wù),VS 會自動(dòng)搭建好Web Service 的框架,如圖6所示。因此只需要在這個(gè)框架中寫需要的函數(shù)即可,例如圖6[WebMethod]中的HelloWorld函數(shù)。
表3 醫(yī)生信息表Tab.3 Information sheet of doctors
表4 病患信息表Tab.4 Information sheet of patients
圖5 數(shù)據(jù)庫流程圖Fig.5 Flowchart of databases
圖6 Web Service框架Fig.6 Web Servive framework
UploadFile 函數(shù):利用這個(gè)方法可以上傳患者拍攝的眼球運(yùn)動(dòng)視頻到服務(wù)器,并將眼球運(yùn)動(dòng)視頻根據(jù)患者id 進(jìn)行命名。先定義一個(gè)視頻儲存的文件路徑,將患者上傳的視頻以其id命名存入該路徑下。
TransToImage 函數(shù):利用這個(gè)方法調(diào)用Matlab程序的TransToIamge 函數(shù),將上傳到服務(wù)器的患者視頻進(jìn)行處理,事先定義一個(gè)圖片文件路徑,得到瞳孔中心運(yùn)動(dòng)軌跡圖并保存在該文件夾下,自動(dòng)診斷的結(jié)果從Matlab 程序中的Diagnose 函數(shù)中得出,通過ExecuteSql函數(shù),賦值給Patient表中的flag。
DownloadImage 函數(shù):利用這個(gè)方法,根據(jù)選中的患者從服務(wù)器的圖片文件夾中調(diào)取與病人id 相對應(yīng)的圖片,醫(yī)生可以訪問其病人的瞳孔中心運(yùn)動(dòng)軌跡圖,進(jìn)行診斷。
ExecuteSql 函數(shù):利用這個(gè)方法可以執(zhí)行sql 語句,對數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行增加,無需返回?cái)?shù)據(jù)。
GetDataTable 函數(shù):利用這個(gè)方法,通過sql 語句對數(shù)據(jù)庫中的數(shù)據(jù)進(jìn)行查詢,將查詢到的數(shù)據(jù)返回,獲得需要的數(shù)據(jù)。
整個(gè)平臺核心的功能在于從上傳的眼球轉(zhuǎn)動(dòng)視頻中提取出瞳孔中心運(yùn)動(dòng)軌跡圖,因此在Matlab 中所設(shè)計(jì)的程序應(yīng)當(dāng)完成視頻解碼、高斯模糊去除圖片噪聲、灰度投影法確定人眼圖像、離散灰度梯度微分法確定二值化閾值、進(jìn)行二值化、Canny 算子邊緣檢測、選取最大輪廓、橢圓曲線擬合得到每張圖片瞳孔中心,最后用For 循環(huán)得到一張完整的瞳孔中心運(yùn)動(dòng)軌跡圖,如圖7所示。
圖7 視頻處理及圖像處理總流程Fig.7 Video processing and image processing
由于處理的圖像是由手機(jī)攝像頭獲取的,難免因?yàn)槭謾C(jī)攝像頭感光元件的曝光導(dǎo)致不良光顆粒影響瞳孔中心的定位,為了淡化毛發(fā)和瞳孔中反光點(diǎn)的影響,本文利用高斯模糊的特點(diǎn)來減小圖像的噪聲,減少圖像中不需要的細(xì)節(jié)。
對圖像進(jìn)行高斯模糊相當(dāng)于加了一個(gè)低通濾波器,它的工作原理是將圖像與正態(tài)分布做卷積,是一種圖像模糊濾波器,它利用正態(tài)分布對圖像中的每個(gè)像素進(jìn)行變換。N維正態(tài)分布的方程如式(3)所示:
其中,r為高斯模糊的半徑,σ為標(biāo)準(zhǔn)偏差。
本文采用的灰度投影法的原理是通過對被檢測的人臉圖像分別進(jìn)行水平和垂直的灰度投影,并得到這兩個(gè)方向上的像素灰度累加曲線圖,根據(jù)曲線圖上的波峰、波谷和人臉圖像的先驗(yàn)知識來確定人眼的位置,具體為從水平灰度投影確定人眼區(qū)域的縱坐標(biāo)范圍,垂直灰度投影確定人眼區(qū)域的橫坐標(biāo)范圍。
垂直灰度投影公式如式(4)所示:
由于本文研究瞳孔中心的定位只需要一只眼睛即可,因此先根據(jù)人臉的對稱性,取人臉的左半邊,對得到的左半邊圖像做垂直灰度投影,從投影曲線中找出背景、頭發(fā)與人臉的邊界。
水平灰度投影公式如式(5)所示:
對已經(jīng)過垂直投影提取感興趣部位的圖像進(jìn)行水平投影,得到水平方向上的像素灰度累加曲線圖,從曲線圖中波峰波谷找到頭發(fā)、額頭、眉毛、眼睛、臉頰之間的界限。
在獲得眼部圖像后,需要精確定位瞳孔,常用的二值化方法不能很好地將瞳孔與圖像的其他部分分離。根據(jù)瞳孔部分像素灰度值與人眼其他部分像素具有非常明顯的跳躍這一特征,離散灰度梯度微分法能從人眼圖像的灰度直方圖中找出這個(gè)跳躍邊界,如圖8所示,將小于這個(gè)閾值的部分填充為黑色,大于或等于這個(gè)閾值的部分為白色。
圖8 人眼圖像灰度直方圖Fig.8 Gray histogram of human eye image
首先,統(tǒng)計(jì)眼部圖像所有像素的灰度值,z表示灰度值,p(z)表示該灰度值上統(tǒng)計(jì)的像素個(gè)數(shù)。對{(z,p(z))}進(jìn)行微分,以s為步長,得到w(z),如式(6)所示:
將w(z)中最小的一項(xiàng)記為w(z′),并記下此時(shí)的z=z′。得到閾值value,如式(7)所示:
將得到的value向上取整,得到最后的閾值。
本文采用的Canny 算子通過滯后閾值能夠有效檢測強(qiáng)邊緣和弱邊緣的連接,滯后閾值包括高閾值和低閾值,其步驟一般包括對圖像去噪,利用一階微分算子來計(jì)算圖像M點(diǎn)處梯度幅值A(chǔ)及其方向a,對圖像中局部像素抑制其非最大梯度點(diǎn),利用雙閾值得到邊界點(diǎn)并連接。
Px(i,j)和Py(i,j)是對M點(diǎn)的x方向和y方向的一階微分偏導(dǎo),如式(8)和式(9)所示:
由此可以得出圖像中各點(diǎn)的梯度幅值A(chǔ)和方向a,如式(10)和式(11)所示:
得到圖像各點(diǎn)的梯度幅值和方向后,抑制非最大梯度點(diǎn),主要步驟包括:以3×3 的模板在8 個(gè)方向上對所有像素按照梯度方向a插值。對于每個(gè)點(diǎn),將鄰域中心元素N(i,j) 與沿梯度方向的第二個(gè)梯度幅值插值的結(jié)果進(jìn)行比較,如果N(i,j)的值小于梯度方向上的兩個(gè)插值結(jié)果,就要將N(i,j)對應(yīng)的邊緣標(biāo)志位賦予0值[11]。
最后,通過設(shè)定雙閾值對經(jīng)過上述處理的圖片進(jìn)行檢測,得到需要的邊緣點(diǎn),將其連接。
經(jīng)Canny 算子邊緣檢測后,由于睫毛、瞳孔中微弱光點(diǎn)的影響,得到的圖像不止包括瞳孔的邊緣,還會有小的不規(guī)則輪廓。因此要從中選擇需要的瞳孔輪廓,瞳孔輪廓在所有輪廓中具有最大周長。本文引用了Matlab 中的Regionprops 函數(shù),即get the properties of region,是Matlab中用來度量圖像區(qū)域?qū)傩缘暮瘮?shù),常用來統(tǒng)計(jì)被標(biāo)記區(qū)域的面積分布,顯示區(qū)域總數(shù)。調(diào)用這個(gè)函數(shù)中的“Perimeter”屬性,這個(gè)屬性表示圖像各個(gè)區(qū)域邊界地區(qū)的周長,即可篩選出需要的瞳孔輪廓。
傳統(tǒng)的Hough 變換法找尋瞳孔中心將圖像中的點(diǎn)代入圓的公式,如式(12)所示,找到最大的圓,圓心即為瞳孔中心:
本文采用橢圓公式根據(jù)已知的圖像點(diǎn)主動(dòng)擬合橢圓,利用橢圓擬合曲線方法得到的結(jié)果更加貼合實(shí)際情況中因眼瞼、睫毛等遮擋致使瞳孔呈現(xiàn)非正圓的形狀。
已知橢圓公式:
從橢圓公式可變形得到橢圓中心橫坐標(biāo)Xc,縱坐標(biāo)Yc,如式(14)、式(15)所示,長軸傾角θ,如式(16)所示,長半軸a、短半軸b,如式(17)、式(18)所示:
原始測得N(N≥5)組數(shù)據(jù)(xi,yi),i=1,2,3,…,N中,根據(jù)橢圓方程通式和最小二乘法原理,求目標(biāo)函數(shù),如式(19)所示:
求目標(biāo)函數(shù)的最小值來確定A、B、C、D、E5 個(gè)參數(shù),令F(A,B,C,D,E)對各個(gè)參數(shù)偏導(dǎo)均為0,得到如下方程組:
求解此線性方程組可解出A、B、C、D、E,代入上述各公式即可解得擬合的橢圓參數(shù),畫出橢圓擬合曲線,得到橢圓中心坐標(biāo),即瞳孔中心坐標(biāo)(Xc,Yc)。
將每一次循環(huán)中得到的(Xc,Yc)都分別存入數(shù)組X和數(shù)組Y中。將得到的瞳孔中心橫坐標(biāo)的數(shù)組X和縱坐標(biāo)的數(shù)組Y分別輸出成圖片,便得到我們需要的瞳孔中心軌跡圖。
平臺的登錄界面,如圖9所示,在角色中選擇醫(yī)生或患者,輸入姓名和密碼[12],還未注冊的患者點(diǎn)擊登錄鍵下的“還未注冊?”進(jìn)行注冊,注冊頁面如圖10所示,輸入信息后,按“添加”完成注冊,按“放棄”清空所輸入的信息,按“返回”回到登錄界面[13]。
如圖11所示,界面左邊是觸發(fā)眩暈的動(dòng)態(tài)旋轉(zhuǎn)圖,右邊是錄制視頻的窗口,點(diǎn)擊“打開攝像頭”,攝像頭打開,但沒有開始錄制,患者調(diào)整好姿勢,如圖12所示,使自己的臉正對攝像頭,盡量保持臉部干凈,減少背景入鏡。點(diǎn)擊“開始錄制”,上方秒表開始計(jì)時(shí),患者大致錄制40 s的視頻即可,點(diǎn)擊“停止”,點(diǎn)擊“保存”,即可上傳視頻,保存成功后,點(diǎn)擊查詢,可以知道初步輔助診斷的情況[14]。
圖9 登錄界面Fig.9 Login interface
圖10 患者注冊界面Fig.10 Patient registration interface
成功保存后,會跳出“保存成功”的提示消息,點(diǎn)擊查詢,會跳出診斷結(jié)果,如診斷結(jié)果為正常的則回復(fù)“正?!?,診斷結(jié)果異常的則回復(fù)“疑似患有眩暈癥”,視頻處理程序異常的會跳出回復(fù)“未知”。
醫(yī)生登陸后,進(jìn)入查詢頁面,如圖13所示,醫(yī)生選擇需要查詢的病人進(jìn)行查詢,以自己的經(jīng)驗(yàn)對瞳孔中心運(yùn)動(dòng)軌跡圖進(jìn)行分析[15],需要進(jìn)行進(jìn)一步檢測的患者,通過其留下的聯(lián)系方式進(jìn)行聯(lián)系。
3.4.1 高斯模糊經(jīng)高斯模糊后的圖片減輕了光照、毛發(fā)對圖片產(chǎn)生的干擾,如圖14、圖15所示。本文肖像圖均獲得知情同意。
圖11 拍攝視頻界面Fig.11 Video shooting interface
圖12 打開攝像頭Fig.12 Turn on the camera
圖13 醫(yī)生查詢界面Fig.13 Doctor query interface
圖14 原圖Fig.14 Original image
圖15 高斯模糊后圖片F(xiàn)ig.15 Image after Gaussian blurring
3.4.2 粗略定位人眼圖像先根據(jù)人臉的對稱性得到半張人臉,再將得到的圖片轉(zhuǎn)化為灰度圖片,進(jìn)行垂直方向的灰度投影,得到曲線圖如圖16所示,根據(jù)這張曲線圖的波谷來確定人臉的邊界,如圖17所示。
圖16 垂直灰度投影曲線Fig.16 Vertical grayscale projection curve
圖17 經(jīng)處理的人臉圖片F(xiàn)ig.17 Processed face image
對得到的圖17進(jìn)行水平方向灰度投影,得到曲線圖,如圖18所示,從這條曲線的波峰波谷中辨別出額頭、眉毛、人眼、臉頰的位置,得到人眼圖像[16],如圖19所示。
圖18 水平灰度投影曲線Fig.18 Horizontal grayscale projection curve
圖19 人眼圖像Fig.19 Human eye image
3.4.3 人眼圖像二值化得到人眼圖像灰度直方圖,如圖20所示。利用離散灰度梯度微分法,取合理步長s得到我們需要的閾值,這里s=5,得到二值化后的圖像,如圖21所示。
圖20 人眼灰度直方圖Fig.20 Gray histogram of human eye image
3.4.4 邊緣檢測利用Canny 算子進(jìn)行邊緣檢測,得到圖22。
圖21 二值化人眼圖像Fig.21 Binarization of human eye image
圖22 邊緣檢測后瞳孔Fig.22 Pupil after edge detection
3.4.5 篩選最大輪廓和橢圓曲線擬合從圖22中篩選出最大周長的邊緣就是瞳孔的邊緣。將邊緣的坐標(biāo)帶入橢圓曲線擬合算法,得到擬合的橢圓及其中心,如圖23、圖24所示。
圖23 篩選出瞳孔邊緣Fig.23 Outlined pupillary edge
圖24 橢圓曲線擬合Fig.24 Fitting of elliptical curves
3.4.6 瞳孔運(yùn)動(dòng)曲線利用循環(huán)得到完整的瞳孔中心運(yùn)動(dòng)軌跡圖[17],如圖25所示。
圖25 瞳孔中心運(yùn)動(dòng)軌跡圖Fig.25 Motion trails of pupil center
該平臺的設(shè)計(jì)主要滿足兩類用戶,一類是患者,對于患者,他們可以進(jìn)行注冊登錄、上傳眼球運(yùn)動(dòng)視頻、查詢自動(dòng)診斷結(jié)果[18]。其中上傳視頻,將視頻轉(zhuǎn)化成瞳孔中心運(yùn)動(dòng)軌跡是關(guān)鍵,診斷也是基于算出瞳孔中心運(yùn)動(dòng)軌跡才能夠?qū)崿F(xiàn)的。為實(shí)現(xiàn)這個(gè)功能,首先需要將視頻分解成幀,取其中一幀進(jìn)行分析[19]。先對得到的圖片進(jìn)行粗略的人眼定位,高斯模糊,減輕光點(diǎn)和毛發(fā)的影響,然后利用人臉的先驗(yàn)知識和灰度投影曲線定位人眼部分,雖然存在精度不夠高的問題,但是應(yīng)用于本算法中,效果良好。再對得到的人眼圖像進(jìn)行瞳孔中心定位,首先取合理閾值進(jìn)行二值化,本文采用了離散灰度梯度微分法,該方法能區(qū)分出瞳孔和人眼其他部位,較其他二值化的方法具有更強(qiáng)的針對性;其次利用Canny算子進(jìn)行邊緣檢測,篩選輪廓,將輪廓的坐標(biāo)帶入橢圓曲線擬合算法,得出瞳孔中心坐標(biāo),利用循環(huán)處理所有幀,得到最后的瞳孔中心運(yùn)動(dòng)軌跡圖[20]。診斷部分分為兩塊,一個(gè)是醫(yī)生通過查詢該病患的瞳孔中心運(yùn)動(dòng)軌跡圖,以自己的醫(yī)學(xué)經(jīng)驗(yàn)進(jìn)行診斷,聯(lián)系患者,另一個(gè)是依靠獲得的瞳孔中心運(yùn)動(dòng)軌跡的各個(gè)點(diǎn)的坐標(biāo),其距離中值的平均值作為眼震幅度,與閾值進(jìn)行判斷,得出初步輔助的自動(dòng)診斷結(jié)果,患者可自己查詢。