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