圖像處理過程中,有很多需要我們掌握或者注意的方方面面。這里我先簡單介紹一些比較基礎(chǔ)的、重要的知識。
1、圖像處理系統(tǒng)框架
一個基本的圖像處理系統(tǒng)包含有4個子系統(tǒng):圖像輸入系統(tǒng)、圖像輸出系統(tǒng)(顯示)、圖像存儲系統(tǒng)、圖像處理與分析系統(tǒng)。

圖 1-1
|
2、圖像的構(gòu)成
圖像給我們的第一直觀感覺就是一些五顏六色的點,在計算機語言中,這些點被稱為像素。正是這些像素匯集在一起就構(gòu)成了一副副美麗的圖片。那么如何把這種直觀的認識和我們的計算機程序結(jié)合起來呢?如何在計算機中表示這些五顏六色的點?理解了這2個問題對我們后面的圖像處理有很多的幫助。圖像可以是矩陣,在計算機程序語言中,最好的表示方法就是數(shù)組,二維數(shù)組。把圖像每個像素點保存在數(shù)組的一個元素中。這一過程也稱為數(shù)字圖像采樣:把二維坐標空間表示的圖像數(shù)字化。
3、圖像處理的速度
在
圖像處理的過程中,有大量的數(shù)學(xué)計算和循環(huán)。如何處理好這些過程對圖像處理的速度有非常重要的影響。處理函數(shù)內(nèi)部變量的定義也需要注意:比如對常用的變量,可以在函數(shù)內(nèi)部用靜態(tài)或者全局變量保存,加快速度。但是,在大型的項目中,過多的靜態(tài)、局部變量會占用更多的內(nèi)存,同時影響程序的啟動速度。所以這需要我們根據(jù)實際的情況進行權(quán)衡。 數(shù)學(xué)計算時有浮點和整數(shù),浮點運算非常精確;但是計算速度稍慢,整數(shù)運算不會有誤差,計算速度快。所以在圖像處理過程中,盡量使用整數(shù)運算,浮點運算會因為計算機的處理器表示方式有一定的誤差。
在遍歷圖像的像素點時,會有大量的循環(huán)過程,在循環(huán)過程中,盡量減少可能的代碼如變量定義,多用處理器支持更好的加法和移位運算,減少乘法運算。甚至,如果可能對一些常用函數(shù)可以采用匯編語言。
4、貼圖的效率
很多初學(xué)圖像編程的朋友幾乎都遇到貼圖閃爍的問題。我們最常用的方法就是雙緩沖貼圖。基本的代碼片斷:
//pDC是最后圖像顯示的目標窗口DC,pMemDC是內(nèi)存中的臨時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函數(shù)的調(diào)用,頻繁的調(diào)用這個函數(shù)選入不同的各種畫圖屬性會大大降低程序的速度。
避免一些不必要的重畫,在完成自己的畫圖后,可以禁止系統(tǒng)的畫圖過程來避免閃爍:在WM_ERASEBKGND消息函數(shù)里直接返回TRUE,不再繼續(xù)調(diào)用基類的消息處理函數(shù)。需要重畫時進行精確的更新,而不是盲目的將所有的內(nèi)容都重畫,如調(diào)用InvalidateRect來代替過渡的Invalidate調(diào)用過程。因為計算Rect的時間比重畫那些不需要重畫的內(nèi)容所消耗的時間要少得多。
在
圖像處理過程中,還有許多方面需要我們特別注意,我會在后面的部分做進一步的討論。
5、顏色空間(Color Space)及轉(zhuǎn)換
5.1、顏色空間介紹
顏色空間就是把我們表示顏色的各個組件映射到笛卡兒的二維或者三維坐標系中。簡單一點就是我們?nèi)绾斡脦讉€顏色組合來表示自然界所有的顏色。
(1)、RGB顏色空間
用R(Red)、G(Green)、B(Blue)三種顏色組合可以表示自然界所有的顏色,也稱為加色系統(tǒng)。因為我們把RGB范圍類的值相加可以產(chǎn)生任何的顏色。假設(shè)圖像沒有其他顏色都是黑色(RGB=0),然后我們往圖片上加上不同的RGB值顏色,就可以產(chǎn)生不同的色彩,下面的圖1-2表示了RGB系統(tǒng)是如何相加混合顏色的。

圖 1-2 圖1-3
|
(2)、CMY(CMYK)顏色空間
CMY是用RGB的補色來表示色彩的。所謂的補色就是用白色減去RGB后得到的顏色。白色減去綠色是洋紅(Magenta),減去紅色是青色(Cyan),減去藍色是黃色(Yellow)。
上面的圖1-3演示了CMY是如何相減混合顏色的。
CMYK是CMY的擴展,消除了CMY表示法中存在的理論和實際的差別。因為單獨使用CMY無法合成真正的黑色,所以為了避免這個問題,CMYK就直接在CMY的基礎(chǔ)添加了黑色的表示部分。
(2)、HSV顏色空間
色彩有三個屬性:色相、彩度與明度。
1) 色相(Hue)又稱為色調(diào),是指色彩的相貌,或是區(qū)別色彩的名稱或色彩的種類,
而色相與色彩明暗無關(guān)。
2) 彩度(Chroma)指色彩的強弱,也稱色彩的飽和度(Saturation),色彩純與不純的分別。
3) 明度(Value)是指色彩的明暗程度, 光度的高低, 要看其接近白色或灰色的程度而定,越接近白色明度越高,越接近灰色或黑色,其明度越低。
HSV顏色空間就是用這三個屬性描述不同顏色的。當(dāng)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的值相當(dāng)于向Hue添加白色的比例,減少就是增加黑色的比例。
在現(xiàn)實生活中,還有其他很多的顏色空間如YIQ、YUV、YCrCb。我們這里不全部介紹,有興趣的朋友可參考相關(guān)的書籍。
5.2 不同顏色空間的轉(zhuǎn)換
圖像處理中進行圖像調(diào)整時,采用不同的顏色空間能更好的幫助我們實現(xiàn)對不同的顏色值進行調(diào)整。比如調(diào)整色調(diào)和飽和度時就把圖像重RGB轉(zhuǎn)為HSV調(diào)整HS的值,然后轉(zhuǎn)回到RGB系統(tǒng)中。具體的轉(zhuǎn)換方法在后續(xù)的圖像處理庫中,我會提供一個完整的類。