周戀玲
摘 要 QT已經(jīng)在圖像處理方面得到了廣泛應(yīng)用,由于計算機系統(tǒng)數(shù)據(jù)對齊的限制,對不同位深圖像的操作需要不同的方法。本文主要針對QT中的QImage類,對不同位深圖像的像素值獲取方法,以及圖像數(shù)據(jù)類型轉(zhuǎn)化的方法進(jìn)行了論述。
關(guān)鍵詞 QT 位深 數(shù)據(jù)對齊 像素處理
中圖分類號:TP391.41 文獻(xiàn)標(biāo)識碼:A
1 QT中的圖像類
QT是一個支持跨平臺的C++圖形用戶界面應(yīng)用程序開發(fā)框架。在QT中,應(yīng)用于圖像處理方面最為常用的圖像類是QImage,由于它良好的封裝,使得人們可以很容易地編寫C++代碼,對圖像數(shù)據(jù)進(jìn)行處理,而不用關(guān)心底層設(shè)計,所以基于QT的圖像處理應(yīng)用越來越多。由于數(shù)字圖像有多種數(shù)據(jù)格式,在進(jìn)行圖像處理時,能夠正確地對圖像數(shù)據(jù)進(jìn)行操作直接影響到整體的圖像處理結(jié)果。
2 QT中不同位深圖像及其數(shù)據(jù)存儲方式
在數(shù)字圖像的表示中,每個像素用到的數(shù)據(jù)位數(shù)稱為圖像的位深度,簡稱位深。常見的數(shù)字圖像分為以下幾種:32位圖像、24位圖像、8位圖像、1位圖像。對于彩色圖像,其顏色用R、G、B分量來表示,32位的圖像額外增加了一個Alpha通道,用于表示圖像的透明度;8位圖像,則記錄的是256種顏色的索引值。本文主要討論32位、24位、8位圖像的數(shù)據(jù)操作及轉(zhuǎn)換方法。
在QImage類中,32位圖像每個像素用4個字節(jié)表示,格式為0xAARRGGBB,表示為QImage::Format_RGB32;24位圖像每個像素用3個字節(jié)表示,格式為0xBBGGRR,表示為QImage::Format_888;8位圖像每個像素用1個字節(jié)表示,記錄顏色索引值,可以記錄256種顏色,表示為QImage::Format_Indexed8。
圖2.1: 不同位深圖像像素的字節(jié)存儲方式
3不同位深圖像的像素處理
3.1圖像數(shù)據(jù)對齊
圖像的數(shù)據(jù)是以字節(jié)為單位保存的,每一行的字節(jié)數(shù)必須是4的整數(shù)倍,不足的需要在最后進(jìn)行補0。當(dāng)圖像的寬度不是4的整數(shù)倍時,需要使用以下公式進(jìn)行換算:
W=(width*bitcount+31)/32*4 (1)
上述公式中,width是圖像的寬度,bitcount是圖像的位深(取值為32、24、8等),W是在程序中圖像每行的實際字節(jié)數(shù)。
3.2構(gòu)造圖像文件
在已知圖像的長度和寬度時,有時需要自己構(gòu)造圖像數(shù)據(jù),可以使用長度和寬度構(gòu)造一幅空白圖像數(shù)據(jù),代碼如下:
QImage image = QImage(width, height, format);
上式中format根據(jù)圖像的位深可以自行選擇,32、24、8位圖像對應(yīng)的格式為QImage::Format_32, QImage::Format_888, QImage::Format_Indexed8 。
3.3圖像的操作
在對像素進(jìn)行遍歷操作時,將圖像看成二維數(shù)組,獲取到圖像的首地址,然后找到行下標(biāo),再尋找列下標(biāo),即可進(jìn)行操作。例如彩色圖像要獲取第i行,第j列的像素的紅色通道值記為R(i,j),索引圖像獲取索引值gray(i,j)。按照32位圖像每個像素占4個字節(jié),24位圖像每個像素占3個字節(jié),8位圖像每個像素占1個字節(jié)的理解,對于不同位深圖像的操作代碼會寫成如下:
R_32=imagebits_32[i * width * 4 + j * 4 + 2];
R_24=imagebits_24[i * width * 3 + j * 3];
gray_8=imagebits_8[i * width + j];
由于數(shù)據(jù)需要32位對齊,因此對于32位的圖像,上述操作不會有問題,但對于24位和8位的圖像,上述操作就會存在問題,當(dāng)圖像的寬度不是4的整數(shù)倍時,上述操作無法取到正確的像素通道值。
3.3.1通用方法
為了得到正確的R(i,j),采用到公式(1)來重新計算圖像數(shù)據(jù)的實際字節(jié)寬度,計算方法如下:
W_32 = ( width * 32 + 31 )/32 * 4;
W_24 = ( width * 24 + 31 )/32 * 4;
W_8 = ( width * 8 + 31)/32 * 4;
R_32 = imagebits_32[i * W_32 + j * 4 + 2];
R_24 = imagebits_24[i * W_24 + j * 3];
gray_8 = imagebits_8[i * W_8 + j];
3.3.2 QT中對像素值操作的方法
由于QImage類提供了很多接口,能更加簡便地獲取圖像的像素值。
方法一:利用數(shù)據(jù)補齊寬度進(jìn)行計算。
W = image.bytesPerLine( );
R_32 = imagebits_32 [i * W + j * 4 + 2];
R_24 = imagebits_24 [i * W + j * 3];
gray_8 = imagebits_8 [i * W + j]; (下轉(zhuǎn)第281頁)(上接第256頁)
方法二:先獲取圖像數(shù)據(jù)每行的首地址,再獲取具體的像素值。
uchar* imagebits = image.scanLine(i);
R_32 = imagebits_32[ j * 4 + 2];
R_24 = imagebits_24[ j * 3];endprint
gray_8 = imagebits_8[ j ];
通過上述兩種方法來操作圖像像素,不用再考慮數(shù)據(jù)對齊的問題,計算方式更加簡便。
3.4圖像數(shù)據(jù)類型轉(zhuǎn)換方法
在處理大型圖像數(shù)據(jù)時,為了節(jié)省空間,可能將圖像數(shù)據(jù)保存在二維的數(shù)組中,如下:
uchar* data32 = new uchar[ width * height * 4];
uchar* data24 = new uchar[ width * height * 3];
uchar* data8 = new uchar[ width * height];
有時需要將二維數(shù)組的數(shù)據(jù)轉(zhuǎn)化成圖像數(shù)據(jù),以方便顯示。QImage類可以從uchar數(shù)據(jù)類型中構(gòu)造圖像:QImage ( uchar * data, int width, int height, Format format ) 。
由于存在數(shù)據(jù)對齊,從data32構(gòu)造圖像時,不會有任何問題,但當(dāng)width不是4的整數(shù)倍時,上述方法就不能從data24和data8構(gòu)造出正確的圖像。
為了正確地將圖像構(gòu)造出來,首先需要計算出圖像的真實數(shù)據(jù)量(字節(jié)數(shù))。一種方法是根據(jù)QImage.byteCount()函數(shù)來獲取圖像的字節(jié)數(shù);另一種方法則是通過公式(2)計算:
byteCount = height * W; (2)
這里的W就是每行的實際字節(jié)數(shù),通過公式(1)可以進(jìn)行計算。
然后,利用QT的QByteArray類來進(jìn)行中間轉(zhuǎn)化。例如,原始圖像數(shù)據(jù)存放在數(shù)組srcData中,根據(jù)以下步驟進(jìn)行圖像數(shù)據(jù)的轉(zhuǎn)化,可以獲得正確的圖像。
QByteArray imageArray = QByteArray((const char*)srcData, byteCount );
uchar* transData = (unsigned char*) imageByteArray.data( );
QImage desImage = QImage(transData, width, height, QImage::Format_…);
通過上述轉(zhuǎn)換方法,transData中將是補齊數(shù)據(jù)的二維數(shù)組,由此構(gòu)造的圖像不會有任何問題。
4總結(jié)
圖像處理技術(shù)已經(jīng)在越來越多的領(lǐng)域得到應(yīng)用,用于圖像處理的工具很多,QT由于其良好的封裝,在圖像處理編程方面得到了廣泛使用。本文基于QT庫,對不同位深圖像的操作方法進(jìn)行了總結(jié),并闡述了圖像數(shù)據(jù)轉(zhuǎn)化的方法,為使用QT進(jìn)行圖像處理提供參考。
參考文獻(xiàn)
[1] (加)Blanchette,J.& (美)M.Summerfield.C++ GUI Qt4 編程[M].閆鋒欣,曾泉人,張志強譯.第2版.北京:電子工業(yè)出版社,2008.
[2] (美)岡薩雷斯.數(shù)字圖像處理[M].阮秋琦譯.北京:電子工業(yè)出版社,2007.
[3] 蔡志明.精通Qt4編程(第2版)[M].北京:電子工業(yè)出版社,2011.endprint