廖學成,宋燕燕
(南京傳媒學院,江蘇 南京 211172)
計算機領域,經過處理的數字圖像可以被運用在不同的行業當中,例如,在影視處理領域中,可以通過對數字圖像進行處理從而得到驚艷的特效;在醫療影像領域中,圖像處理常常被用來識別病灶;在衛星遙感領域中,圖像處理經常被用來切割各種衛星遙感地圖,從而提取出有價值的信息等。
傳統的神經網絡由神經元和計算關系組成,不同的神經元之間有著極為復雜的計算關系,這些不同計算關系都有一個權重,并在進行模型訓練的過程中不斷地調整這些權重[1]。如圖1所示為傳統意義上的神經網絡,每層節點都和上一層節點相連接,構成全連接網絡,其缺點為參數眾多、冗余度大、難以訓練。

圖1 神經網絡
假設輸入一張像素為100×100的圖像,全連接層的每個神經元都有將近10 000個權重參數,極易產生過擬合[2]。為了解決這一問題,通常在該神經網絡上添加卷積運算,構成卷積神經網絡[3]。
卷積運算公式為

(1)
其中,t為全局時間變量。卷積函數不僅可以是連續的曲線[4],還可以是離散的形式。因此公式(1)可以改寫為:
(2)
卷積神經網絡由輸入層、卷積層、激活函數、池化層、全連接層組成[5],如圖2所示。

圖2 卷積神經網絡
傅里葉描述子的作用是用來對特定物體創造一個特征圖像的,即只截取符合特征值的圖像[6]。從線性代數的角度思考,傅里葉描述子其實就是用一個高維的向量去描述一個物體。其計算公式為
z(t)=x(t)+μy(t)
(3)
其中,u為復數表示法;函數z為一個經過處理只有輪廓圖的圖像,并且將所得圖像通過復變函數表達。
一般來講,在實驗的過程中,理想的輪廓提取和實際的輪廓提取總會產生一定的差距。為了很好地解決這些差距,通常會定義一個損失函數來度量模型預測的輪廓與實際輪廓之間的差距[7]。本文通過計算點到輪廓的距離來定義損失函數。
假設在讀取的手勢圖像中有2點P1(x1,y1)和P2(x2,y2),為了計算這2點的歐幾里得空間中的直線距離,其計算公式如下:
(4)
其中,d為歐式距離;(x1,y1)和(x2,y2)分別為2個點的坐標。公式(4)中的平方根運算表示計算2個點在坐標軸上的距離差的平方和的平方根。
公式(4)可以推廣到更高維度的歐幾里得空間中,其中每個點可以有更多的坐標值。在三維空間中,公式會進一步擴展為:
(5)
首先獲取實時手勢圖像,然后進行圖像預處理,包括圖像增強、圖像銳化等提高圖像清晰度[8]。接著計算手勢特征值提取輪廓,采用 YCrCb 顏色空間中的Cr分量并結合閾值分割算法進行二值化,輸出切割圖像。最終確定當前手勢,獲取手勢信息。基于 OpenCV 的手勢識別流程如圖3所示。

圖3 手勢識別流程
從攝像頭或視頻中獲取手部圖像幀,將圖像轉換為灰度圖像進而調整對比度。轉換的實現過程是使用OpenCV中的“cv2.cvtColor()”函數,并將轉換方式設置為“cv2.COLOR_BGR2GRAY( )”函數。其具體實現代碼如下:
image=cv2.imread('image.jpg')
gray_image=cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
上述代碼中,“cv2.cvtColor()”函數將彩色圖像轉換為灰度圖像。第一個參數是輸入圖像,第二個參數是轉換的方式,使用cv2.COLOR_BGR2GRAY指定轉換為灰度圖像。轉換后的灰度圖像將存儲在新的變量“gray_image”中。
這里需要注意的是,灰度圖像只有一個顏色通道,而彩色圖像有3個顏色通道。因此使用灰度圖像存儲可以大大節省內存和計算資源。
特征圖像的創建過程如下:
(1)創建一個空白圖像,將描述子的每個元素作為像素值填充到圖像中對應的位置。
(2)調整圖像的大小和尺度,從而適應特定的應用場景。
(3)使用諸如調色板、平滑濾波器、邊緣檢測等圖像處理技術,從而突出顯示特征。
(4)將特征圖像與原始曲線圖像進行疊加顯示。
如下代碼為創建特征圖像的核心算法:
def create_feature_image(descriptors):
feature_image=np.zeros((100, 100), dtype=np.uint8)
fori,descriptorin enumerate(descriptors):
x=int(descriptor[0]*50)++50
y=int(descriptor[1]*50)++50
feature_image[y,x]=255
feature_image=cv2.applyColorMap(feature_image,cv2.COLORMAP_JET)
returnfeature_image
descriptors=np.array([[1.2,0.8],[-0.5,0.2],[0.9,-0.7]])
feature_image=create_feature_image
構建好描述子之后,可以進行各種手勢特征提取,這些特征包括手指數量、手指的位置和彎曲度、手的方向、手掌的位置等。
膚色檢測流程如圖4所示。

圖4 膚色預測流程
首先需要進行合適的顏色空間轉換[9]。常見的顏色空間轉換是將圖像從RGB空間轉換到YUV、HSV或Lab。將圖像從RGB空間轉換到YUV空間的實現代碼為:yuv_image=cv2.cvtColor(image, cv2.COLOR_BGR2YUV),將圖像從RGB空間轉換到HSV空間的實現代碼為:hsv_image=cv2.cvtColor(image, cv2.COLOR_BGR2HSV),將圖像從RGB空間轉換到Lab空間的實現代碼為:lab_image=cv2.cvtColor(image, cv2.COLOR_BGR2Lab)。“cv2.cvtColor()”函數用于執行顏色空間轉換。第一個參數是輸入圖像,第二個參數是轉換方式,可以通過使用預定義的常量(如cv2.COLOR_BGR2YUV、cv2.COLOR_BGR2HSV、cv2.COLOR_BGR2Lab)來指定所需的轉換。不過,使用YCrCb顏色空間可以最大化地對RGB圖像進行顯示,其從RGB空間到YCrCb空間的轉換公式如下:
(6)
對于手部輪廓的提取,使用的是簡單的自適應閾值方法,在OpenCV中的表示代碼為:ret,threshold=cv2.threshold(gray_image, thresh, maxval, threshold_type),其中“gray_image”代表輸入的灰度圖像;“thresh”代表閾值,用于將像素分為目標和背景;“maxval”代表像素大于閾值時,所設置的像素值;“threshold_type”代表閾值分割的類型,例如“cv2.THRESH_BINARY”表示二值化閾值分割。
對于上述算法在手勢輪廓提取的應用實驗結果如圖5所示。

圖5 手勢輪廓
進行膚色檢測和分割處理后的實驗結果如圖6所示。

圖6 原始圖像及分割后的圖像
基于提取的手勢特征進行機器學習模型訓練,在文中使用的模型為KNN。訓練完成后識別的結果如圖7所示。

圖7 手勢識別
隨著人機交互技術的日益發展,手勢識別算法愈來愈成熟。本文主要是對手勢的識別先導思想如神經網絡、卷積神經網絡等進行分析,并通過圖像預處理、特征值提取、膚色預測等步驟實現人體手勢識別。后續對于本課題還有很大的改進空間;例如是否可以從二維的角度進而升級從三維的角度進行處理,從而把本課題實現的二維模型建成三維模型,這樣不僅可以獲得更多的特征值,還可以極大地提高識別的成功率。