亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于QT的不同位深圖像像素處理方法

        2017-11-22 14:37:54周戀玲
        科教導(dǎo)刊·電子版 2017年28期

        周戀玲

        摘 要 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

        不打码在线观看一区二区三区视频| 免费看黑人男阳茎进女阳道视频| 亚洲粉嫩视频在线观看| 日本午夜理论片在线观看| 亚洲av无码乱码在线观看裸奔| 少妇内射高潮福利炮| 亚洲欧美日韩精品高清| 午夜视频在线观看日本| 成年丰满熟妇午夜免费视频| 熟女熟妇伦av网站| 中文字幕无码人妻丝袜| 国产在线精彩自拍视频| 精品国产一区二区三区三| 天天色影网| 久久综合亚洲色社区| 日韩精品视频中文字幕播放| 欧美巨鞭大战丰满少妇| 国产精品久久久| 日日爽日日操| 久久亚洲精品一区二区三区| 欧美 日韩 人妻 高清 中文| 国产69精品久久久久9999| 久热re在线视频精品免费| 亚洲av专区一区二区| 四虎成人精品国产永久免费无码| 醉酒后少妇被疯狂内射视频| 成人精品免费av不卡在线观看| av在线不卡一区二区| 亚洲国产成人久久三区| 福利片福利一区二区三区| 中文字幕国内一区二区| 日韩有码中文字幕在线观看| 国产真人性做爰久久网站| 99在线视频精品费观看视| 日本在线观看三级视频| 少妇人妻中文字幕hd| 欧美黑人又粗又大久久久| 亚洲人av毛片一区二区| 娇小女人被黑人插免费视频| 中文字幕日本特黄aa毛片| 无码中文字幕av免费放|