曹鵬,張翰文,張志常,常世杰
(1.中國醫科大學智能醫學學院計算機教研室,遼寧沈陽 110122;2.中國醫科大學智能醫學學院生物醫學工程系,遼寧沈陽 110122)
隨著生活水平不斷提高,人們的健康意識不斷增強,對于身體指標的各項檢查隨之增加。心電圖(Electrocardiogram,ECG)是利用心電圖機從體表記錄心臟每一心動周期所產生的電活動變化圖形的技術,廣泛應用于記錄人體心臟的電活動以及幫助診斷心臟類疾病[1]。由于傳統紙質心電圖不利于保存與傳輸,所以將如心電圖像之類的紙質病歷及檢查報告電子化成為近年來的研究熱點[2]。
利用手機拍攝心電圖像可快速實現紙質圖像電子化,但在拍攝過程中會產生圖像畸變,對圖像準確性產生影響。同時心電圖像結構復雜,與傳統圖像校準存在區別[3]。
智能手機日益普及,移動端App被廣泛使用。小程序作為移動端App具有多平臺兼容、易推廣和成本低等優點,成為主流移動端App 之一[4]。本設計利用小程序搭建心電圖像智能校準平臺,通過移動端小程序拍攝心電圖像實現上傳、服務端利用OpenCV 算法對拍攝心電圖像進行校準處理,還原原始數據,最終將校正后結果存儲并返回移動端,達到利用移動端App智能還原原始心電數據并存儲的目的。
用戶登錄系統后,上傳拍攝的紙質心電圖像,由于在拍攝過程中,角度、光線等因素可能使圖像產生傾斜、扭曲等畸變,對后續醫療信息的準確性和診斷產生影響,心電圖像智能存儲系統可以自動完成拍攝心電圖像的預處理,輪廓檢測,多邊形擬合以及圖像校準,最終返回還原的心電圖像,以備后續存儲、傳輸與診斷。
由于醫學圖像數據具有較強的隱私性,故系統設計時利用鑒權及對象存儲等方式保護用戶數據隱私及系統安全性[5]。
系統設計主要分為移動客戶端和服務器端兩部分。移動客戶端利用微信小程序實現,采用微信開發者工具進行開發。客戶端實現用戶對拍攝紙質心電圖像的上傳功能,隨后將心電圖像上傳到至對象存儲中。服務端使用ubuntu操作系統,采用云托管實現。服務器端通過權限訪問對象存儲桶,下載相應心電圖像對象,在服務端對心電圖像進行預處理,輪廓檢測,多邊形擬合以及圖像校準,最終將處理后的校準圖像上傳至對象存儲中,最終客戶端獲取相應心電校準圖像。

圖1 微信小程序+微信云托管搭建系統
本系統設計中使用對象存儲操作心電圖像,以及通過云托管搭建服務器端,是本系統設計的主要核心點和創新點,下面對這兩種技術給予說明。
1)對象存儲
本設計通過對象存儲實現心電圖像的上傳與下載,對象存儲(Cloud Object Storage,COS) 是騰訊云提供的一種存儲海量文件的分布式存儲服務,用戶可通過網絡隨時存儲和查看數據。騰訊云COS 使所有用戶都能使用具備高擴展性、低成本、可靠和安全的數據存儲服務。
COS通過控制臺、API、SDK和工具等多樣化方式簡單、快速地接入,實現了海量數據存儲和管理。通過COS 可以進行任意格式文件的上傳、下載和管理。同時遍布全國范圍的CDN/EdgeOne 節點可以對文件下載進行加速。利用騰訊云COS 可更好地對存儲圖像實現并發存儲和傳輸,同時也能更好地保證數據的安全性和隱私性[6]。
在實際操作中,文件對象被存儲在對象存儲的存儲桶中,存儲桶(Bucket)是對象的載體,可理解為存放對象的“容器”,且該“容器”無容量上限。對象以扁平化結構存放在存儲桶中,無文件夾和目錄的概念,用戶可選擇將對象存放到單個或多個存儲桶中。對象存儲主要功能如表1所示。

表1 對象存儲主要功能
2)云托管
本設計的服務器端采用微信云托管實現。微信云托管是微信團隊提供的以云原生為基礎的,免運維、高可用服務上云解決方案[7]。云托管支持目前絕大多數語言以及框架項目,本設計服務端采用Flask框架部署,利用Python和OpenCV實現圖像處理功能。
同時,微信云托管還集成持續交付部署,DevOps自動化,安全鑒權等眾多能力,微信云托管與微信生態深度融合,具有免鑒權,云調用,消息推送等眾多優勢特性,并且在安全、可靠性方面有專業保障。
微信云托管使用目前主流的容器平臺Docker 以及容器編排技術Kubernetes(K8S)[8]。當使用微信生態下客戶端(小程序、公眾號),向部署在微信云托管上的后端服務發送請求時,會自動經過微信接入層(內網),并附帶微信校驗的權威用戶信息。
非微信生態下的客戶端(普通Web 網頁、App),向部署在微信云托管上的后端服務發送請求時,會經過微信云托管公網網關層(所有用戶共用,由微信云托管團隊維護),并根據域名轉發到對應的用戶服務。微信云托管提供默認公網域名,也可以接入自己備案好的自定義域名。

圖2 微信云托管架構
本設計中客戶端為移動端微信小程序,開發語言主要為JS 語言。小程序端主要功能為將拍攝心電圖像上傳至對象存儲的存儲桶,同步顯示上傳原始拍攝圖像,并在服務端處理圖像后顯示校準后圖像。
首先實現將拍攝心電圖片上傳至緩存,并返回臨時路徑,微信小程序開發API 中wx.chooseMedia 接口用于實現拍攝或從手機相冊中選擇圖片或視頻進行上傳,具體實現如下:
第二步利用上傳圖片的臨時路徑將圖片存儲至對象存儲的存儲桶,微信小程序云開發API 中wx.cloud.uploadFile 用于將文件上傳至云開發存儲或者對象存儲中,具體實現代碼如下:
最后在移動客戶端界面利用image組件和setData()方法同步顯示上傳的心電拍攝圖像。
本設計中服務端利用云托管搭建基于Python 的Flask框架,開發語言主要為Dockerfile腳本指令和Python。
首先利用Dockerfile 部署云托管服務器,服務器端使用ubuntu 系統。本設計中服務器端需實現心電圖像的預處理,輪廓檢測,多邊形擬合以及圖像校準等功能,故在服務器端安裝Python 環境及OpenCV 等圖像處理相關庫,Dockerfile文件主要腳本指令如下:
在requirements 文件中指定所需庫及相應版本,主要包括Flask 環境、Python 環境、OpenCV 庫以及對象存儲所需庫,主要指令如下:
第二步,在云托管服務器端實現對象存儲中文件的訪問,通過COS 默認域名訪問時,SDK 會以{bucketappid}.cos.{region}.myqcloud.com 的域名形式訪問COS。訪問對象存儲需先生成CosS3Client實例,然后循環上傳或下載對象,生成CosS3Client實例主要代碼如下:
生成CosS3Client 實例后對指定存儲桶中的文件對象進行上傳及下載操作,利用client.get_object 方法下載存儲桶中的對象文件,主要代碼如下:
bucket_MP=config.COS_BUCKET_MP #指定訪問存儲桶
#通過存儲桶+路徑獲得圖片文件到服務器端
利用client.upload_file方法上傳對象文件,根據文件大小自動選擇簡單上傳或分塊上傳,分塊上傳具備斷點續傳功能,主要代碼如下:
最后在服務器端利用OpenCV對獲得的心電拍攝圖像依次進行預處理[9],輪廓檢測[10],多邊形擬合以及圖像校準,流程圖如圖3所示。

圖3 服務端處理心電圖像流程圖
至此,完整地實現了心電圖像智能存儲系統的小程序部分和服務器端,通過訪問測試,可以較好地實現心電拍攝圖像的校準及存儲,運行示意結果如圖4所示。

圖4 心電圖像智能校正系統運行示意圖
本系統設計實現了心電圖像智能校準系統,可對用戶上傳的拍攝心電圖像進行圖像校準操作,還原初始心電圖像數據,為后續的傳輸、存儲及診斷提供輔助,有較強實用價值。系統采用對象存儲技術,增強了心電圖像網絡中上傳下載速度以及安全性,同時對保護用戶隱私有積極作用。