常君明 馮 頔 陳 慶 陳 歡 李真珍
(江漢大學數學與計算機學院 武漢 430056)
隨著科學技術的不斷發展,各種圖像處理技術層出不窮。圖像拾取是指從圖像中有目的地選取所需部分,特別是在復雜背景下,對圖像中需要部分進行操作,就要將拾取出來的圖像分割出來,以便對該圖像作進一步的操作處理。圖像拾取交互是圖形系統的重要功能之一[1]。從原始圖像上選取要操作的一部分,即操作區域,而平移、修改、放縮、旋轉和刪除等操作都是以拾取圖形或以拾取圖形的某一位置點為基礎的。
本文在對傳統圖像拾取算法的基本原理進行分析的基礎之上,提出了一種新的圖形拾取算法。算法的核心是尋找圖像拾取速度、拾取準確性這兩個方面平衡。在Visual C++6.0平臺下將其實現。實踐表明,本文拾取算法適合交互系統中具有很好的適用性。
鼠標點擊圖像,便可拾取圖像上的種子點[2],拾取點坐標方法如下:
SetCapture();
RECT rect;//左右上下長度LONG類型;
GetClientRect(&rect);//該函數獲取窗口客戶區的坐標。坐標原點(0,0)在客戶區左上角;
ClientToScreen(&rect);//該函數將指定點,或者矩形的用戶坐標轉換成屏幕坐標。
圖像的每個像素點的顏色都是由三個分量組成的,是通過對紅(R)、綠(G)、藍(B)三個顏色分量的變化以及它們相互之間的疊加來得到各式各樣的顏色。使用RGB模型為圖像中每一個像素的RGB分量分配一個0~255范圍內的強度值。每種RGB成分都可使用從0(黑色)到255(白色)的值。當所有三種成分值相等時,產生灰色陰影。當所有成分的值均為255時,結果是純白色;當該值為0時,結果是純黑色[3]。
獲取圖像中像素點顏色值的方法如下:

首先讀取圖像的r、g、b各分量值;r、g、b分量值相加不等于765,即點不為白色時,每個分量的值是從0~255,三個分量r、g、b全為255時表示的是白色。
程序中當讀取圖像后,直接計算出種子點r、g、b各個分量值,計算方法如下:

其中q0為圖像地址指針;w0為圖像行寬。此處需要注意一點,在圖像的像素點結構中,各個分量是以b、g、r的順序排列的,因此計算時也應該以這樣的順序來依次計算分量值。
本文中查找拾取目標圖像邊緣是基于四連通遍歷思想,所謂四連通是指從種子點出發,在上、下、左、右四個方向對圖像進行遍歷[4~5],如圖1所示。常規四連通算法是需要大量棧空間來存儲相鄰的點。一個改進的方法就是:通過沿掃描線填充水平像素段,來處理四連通相鄰點,這樣就僅僅只需要將每個水平像素段的起始位置壓入棧,不需要將當前位置周圍尚未處理的相鄰像素都壓入棧,從而可以節省大量的棧空間。

圖1 四連通示意圖
基于四連通圖像拾取算法流程如圖2所示。首先用鼠標選擇種子點,然后從種子點出發,用四連通遍歷圖像,將符合條件的點一一入棧,判斷圖像中的點是否符合拾取要求,將邊緣點找出,并用給定的屬性進行描述,如設置為給定顏色或者其他屬性。

圖2 基于四連通拾取算法流程圖
容差指在選取顏色時所設置的選取范圍,容差越大,選取的范圍也越大,理論上容差范圍可以是0~255之間的任何數值,可根據實際應用的需要來進行選擇。容差是0的時候,就只能選擇相同的顏色,容差越大那么顏色就可以越廣泛。比如:容差是0的時候,如果選擇的是純藍色,那么只能選中百分之百的藍色,如果容差是20,那么就可以選中稍微淡藍還有深藍,當容差很大的時候,那么就會把所有的顏色都選中了[6~7]。
文中算法設置容差參數,就是為了在圖片情況復雜時,能夠成功選擇想要選擇的區域。每張圖片的情況都是不一樣的,圖片中的顏色也都不一定是純色的,如果不設置容差,那么算法就很難適應各種情況復雜的圖片,也就不能成功選取所要選擇的區域。
判斷容差范圍用這個語句就可以:

容差為10系統拾取的效果如圖3所示。容差為20時拾取的效果如圖4所示。

圖3 容差為10時拾取效果

圖4 容差為20時拾取效果

圖5 臉部拾取效果
圖形圖像處理需要大量的數據運算,通常比較耗時。因此,交互式圖形圖像處理選擇合適的語言進行算法的描述顯得尤為重要。系統設計采用功能強大的可視化應用程序開發工具Visual C++6.0[10]。圖5所示為文物臉部拾取效果圖。實踐表明,系統設計交互簡潔、兼容性強、拾取效果好、運行速度快。
[1]岳文理,王堅,戴毅茹.交互式圖形系統中圖形拾取算法的研究與應用[J].機電產品開發與創新,2008.21(2):3~4
[2]向世明.Visual C++數字圖像與圖形處理[M].北京:電子工業出版社,2002
[3]何斌,馬天予.Visual C++數字處理[M].第二版.北京:人民郵電出版社,2002
[4]孔令德.計算機圖形學基礎教程:Visual C++版[M].北京:清華大學出版社,2008
[5]和青芳.計算機圖形學原理及算法教程:Visual C++版[M].北京:清華大學出版社,2005
[6]徐慧.Visual C++數字圖像使用工程案例精選[M].北京:人民郵電出版社,2004
[7]穆曉芳.數字圖像處理技術[M].北京:煤炭工業出版社,2009
[8]常新立,徐東平.基于圖元的手繪幾何圖形識別[J].計算機與數字工程,2008,36(12)
[9]劉慧杰,靳海亮.基于VC++的OpenGL三維圖形開發設計[J].計算機與數字工程,2010,37(7)
[10]耿迅.VC圖像處理—界面設計及總結[J].電腦編程技巧與維護,2006(3):68~72