亚洲免费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

        美女脱了内裤露出奶头的视频| 国产丰满乱子伦无码专| 亚洲黄色大片在线观看| 中文字幕人妻饥渴浪妇| 无码人妻久久一区二区三区app | av免费一区在线播放| 免费人成视网站在线剧情| 狠狠色狠狠色综合| 国产av天堂成人网| 成人黄网站免费永久在线观看| 精品女同一区二区三区免费战| 亚洲热妇无码av在线播放| 狠干狠爱无码区| 国产小视频一区二区三区| 国产一区二区三区亚洲avv| 亚洲成在人网站av天堂| 无码一级视频在线| 久久久一本精品久久久一本| 欧美精品无码一区二区三区 | 亚洲视频一区二区三区免费 | japanesehd中国产在线看| 在线永久免费观看黄网站| 加勒比黑人在线| 精品麻豆一区二区三区乱码| 国产三级精品三级| 污污污污污污污网站污| 国内色精品视频在线网址| 精品国产一区二区三区av天堂| 亚洲av无码xxx麻豆艾秋| 中文字幕永久免费观看| 口爆吞精美臀国产在线| 无码小电影在线观看网站免费| 国产乱沈阳女人高潮乱叫老| 国产青青草视频在线播放| 免费人成视频网站网址| 天堂а√在线中文在线新版| 免费国产h视频在线观看86| 日韩av一区二区三区高清| 亚洲熟妇久久国产精品| 中文字幕无码专区一VA亚洲V专| 丰满人妻被公侵犯的视频|