Visual C++ 2005圖像編程之預備知識
圖像處理過程中,有很多需要我們掌握或者注意的方方面面。這里我先簡單介紹一些比較基礎的、重要的知識。1、圖像處理系統框架
一個基本的圖像處理系統包含有4個子系統:圖像輸入系統、圖像輸出系統(顯示)、圖像存儲系統、圖像處理與分析系統。
圖 1-1 |
2、圖像的構成
圖像給我們的第一直觀感覺就是一些五顏六色的點,在計算機語言中,這些點被稱為像素。正是這些像素匯集在一起就構成了一副副美麗的圖片。那么如何把這種直觀的認識和我們的計算機程序結合起來呢?如何在計算機中表示這些五顏六色的點?理解了這2個問題對我們后面的圖像處理有很多的幫助。圖像可以是矩陣,在計算機程序語言中,最好的表示方法就是數組,二維數組。把圖像每個像素點保存在數組的一個元素中。這一過程也稱為數字圖像采樣:把二維坐標空間表示的圖像數字化。
3、圖像處理的速度
在圖像處理的過程中,有大量的數學計算和循環。如何處理好這些過程對圖像處理的速度有非常重要的影響。處理函數內部變量的定義也需要注意:比如對常用的變量,可以在函數內部用靜態或者全局變量保存,加快速度。但是,在大型的項目中,過多的靜態、局部變量會占用更多的內存,同時影響程序的啟動速度。所以這需要我們根據實際的情況進行權衡。 數學計算時有浮點和整數,浮點運算非常精確;但是計算速度稍慢,整數運算不會有誤差,計算速度快。所以在圖像處理過程中,盡量使用整數運算,浮點運算會因為計算機的處理器表示方式有一定的誤差。
在遍歷圖像的像素點時,會有大量的循環過程,在循環過程中,盡量減少可能的代碼如變量定義,多用處理器支持更好的加法和移位運算,減少乘法運算。甚至,如果可能對一些常用函數可以采用匯編語言。
4、貼圖的效率
很多初學圖像編程的朋友幾乎都遇到貼圖閃爍的問題。我們最常用的方法就是雙緩沖貼圖。基本的代碼片斷:
//pDC是最后圖像顯示的目標窗口DC,pMemDC是內存中的臨時DC CDC *pMemDC = CreateCompatibleDC(pDC); CBitmap Bitmap; //Width、Height是圖像最后顯示的目標窗口高度和寬度 Bitmap. CreateCompatibleBitmap(pDC, Width, Height); pMemDC->SelectObject(&Bitmap); |
然后我們就可以在pMemDC上進行任何需要的畫圖操作,畫完后再貼到目標窗口DC
pDC->BitBlt(0, 0, Width, Height, pMemDC, 0, 0, SRCCOPY); pMemDC->DeleteDC(); |
在有的時候我們需要進行大量的貼圖,貼很多不同的小的圖片時,需要注意SelectObject函數的調用,頻繁的調用這個函數選入不同的各種畫圖屬性會大大降低程序的速度。
避免一些不必要的重畫,在完成自己的畫圖后,可以禁止系統的畫圖過程來避免閃爍:在WM_ERASEBKGND消息函數里直接返回TRUE,不再繼續調用基類的消息處理函數。需要重畫時進行精確的更新,而不是盲目的將所有的內容都重畫,如調用InvalidateRect來代替過渡的Invalidate調用過程。因為計算Rect的時間比重畫那些不需要重畫的內容所消耗的時間要少得多。
在圖像處理過程中,還有許多方面需要我們特別注意,我會在后面的部分做進一步的討論。
5、顏色空間(Color Space)及轉換
5.1、顏色空間介紹
顏色空間就是把我們表示顏色的各個組件映射到笛卡兒的二維或者三維坐標系中。簡單一點就是我們如何用幾個顏色組合來表示自然界所有的顏色。
(1)、RGB顏色空間
用R(Red)、G(Green)、B(Blue)三種顏色組合可以表示自然界所有的顏色,也稱為加色系統。因為我們把RGB范圍類的值相加可以產生任何的顏色。假設圖像沒有其他顏色都是黑色(RGB=0),然后我們往圖片上加上不同的RGB值顏色,就可以產生不同的色彩,下面的圖1-2表示了RGB系統是如何相加混合顏色的。
圖 1-2 圖1-3 |
(2)、CMY(CMYK)顏色空間
CMY是用RGB的補色來表示色彩的。所謂的補色就是用白色減去RGB后得到的顏色。白色減去綠色是洋紅(Magenta),減去紅色是青色(Cyan),減去藍色是黃色(Yellow)。
上面的圖1-3演示了CMY是如何相減混合顏色的。
CMYK是CMY的擴展,消除了CMY表示法中存在的理論和實際的差別。因為單獨使用CMY無法合成真正的黑色,所以為了避免這個問題,CMYK就直接在CMY的基礎添加了黑色的表示部分。
(2)、HSV顏色空間
色彩有三個屬性:色相、彩度與明度。
1) 色相(Hue)又稱為色調,是指色彩的相貌,或是區別色彩的名稱或色彩的種類,
而色相與色彩明暗無關。
2) 彩度(Chroma)指色彩的強弱,也稱色彩的飽和度(Saturation),色彩純與不純的分別。
3) 明度(Value)是指色彩的明暗程度, 光度的高低, 要看其接近白色或灰色的程度而定,越接近白色明度越高,越接近灰色或黑色,其明度越低。
HSV顏色空間就是用這三個屬性描述不同顏色的。當Saturation為0時,Hue不存在。圖像為灰度圖。明度的Value也可以用亮度表示(Brightness)。Hue為0時顏色是紅色。
(4) HLS顏色空間
HLS的基本意義和HSV相同,顏色的范圍值一樣:Hue(0-360),L(0-1),S(0-1),V(0-1)。
只是在表示相同顏色時值不同了,Hue為0顏色是藍色。增加L的值相當于向Hue添加白色的比例,減少就是增加黑色的比例。
在現實生活中,還有其他很多的顏色空間如YIQ、YUV、YCrCb。我們這里不全部介紹,有興趣的朋友可參考相關的書籍。
5.2 不同顏色空間的轉換
圖像處理中進行圖像調整時,采用不同的顏色空間能更好的幫助我們實現對不同的顏色值進行調整。比如調整色調和飽和度時就把圖像重RGB轉為HSV調整HS的值,然后轉回到RGB系統中。具體的轉換方法在后續的圖像處理庫中,我會提供一個完整的類。
posted on 2008-04-26 14:40 Jarod.cn.LuLuLife 閱讀(148) 評論(0) 編輯 收藏