999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

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

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

周戀玲

摘 要 QT已經(jīng)在圖像處理方面得到了廣泛應(yīng)用,由于計(jì)算機(jī)系統(tǒng)數(shù)據(jù)對(duì)齊的限制,對(duì)不同位深圖像的操作需要不同的方法。本文主要針對(duì)QT中的QImage類,對(duì)不同位深圖像的像素值獲取方法,以及圖像數(shù)據(jù)類型轉(zhuǎn)化的方法進(jìn)行了論述。

關(guān)鍵詞 QT 位深 數(shù)據(jù)對(duì)齊 像素處理

中圖分類號(hào):TP391.41 文獻(xiàn)標(biāo)識(shí)碼:A

1 QT中的圖像類

QT是一個(gè)支持跨平臺(tái)的C++圖形用戶界面應(yīng)用程序開(kāi)發(fā)框架。在QT中,應(yīng)用于圖像處理方面最為常用的圖像類是QImage,由于它良好的封裝,使得人們可以很容易地編寫(xiě)C++代碼,對(duì)圖像數(shù)據(jù)進(jìn)行處理,而不用關(guān)心底層設(shè)計(jì),所以基于QT的圖像處理應(yīng)用越來(lái)越多。由于數(shù)字圖像有多種數(shù)據(jù)格式,在進(jìn)行圖像處理時(shí),能夠正確地對(duì)圖像數(shù)據(jù)進(jìn)行操作直接影響到整體的圖像處理結(jié)果。

2 QT中不同位深圖像及其數(shù)據(jù)存儲(chǔ)方式

在數(shù)字圖像的表示中,每個(gè)像素用到的數(shù)據(jù)位數(shù)稱為圖像的位深度,簡(jiǎn)稱位深。常見(jiàn)的數(shù)字圖像分為以下幾種:32位圖像、24位圖像、8位圖像、1位圖像。對(duì)于彩色圖像,其顏色用R、G、B分量來(lái)表示,32位的圖像額外增加了一個(gè)Alpha通道,用于表示圖像的透明度;8位圖像,則記錄的是256種顏色的索引值。本文主要討論32位、24位、8位圖像的數(shù)據(jù)操作及轉(zhuǎn)換方法。

在QImage類中,32位圖像每個(gè)像素用4個(gè)字節(jié)表示,格式為0xAARRGGBB,表示為QImage::Format_RGB32;24位圖像每個(gè)像素用3個(gè)字節(jié)表示,格式為0xBBGGRR,表示為QImage::Format_888;8位圖像每個(gè)像素用1個(gè)字節(jié)表示,記錄顏色索引值,可以記錄256種顏色,表示為QImage::Format_Indexed8。

圖2.1: 不同位深圖像像素的字節(jié)存儲(chǔ)方式

3不同位深圖像的像素處理

3.1圖像數(shù)據(jù)對(duì)齊

圖像的數(shù)據(jù)是以字節(jié)為單位保存的,每一行的字節(jié)數(shù)必須是4的整數(shù)倍,不足的需要在最后進(jìn)行補(bǔ)0。當(dāng)圖像的寬度不是4的整數(shù)倍時(shí),需要使用以下公式進(jìn)行換算:

W=(width*bitcount+31)/32*4 (1)

上述公式中,width是圖像的寬度,bitcount是圖像的位深(取值為32、24、8等),W是在程序中圖像每行的實(shí)際字節(jié)數(shù)。

3.2構(gòu)造圖像文件

在已知圖像的長(zhǎng)度和寬度時(shí),有時(shí)需要自己構(gòu)造圖像數(shù)據(jù),可以使用長(zhǎng)度和寬度構(gòu)造一幅空白圖像數(shù)據(jù),代碼如下:

QImage image = QImage(width, height, format);

上式中format根據(jù)圖像的位深可以自行選擇,32、24、8位圖像對(duì)應(yīng)的格式為QImage::Format_32, QImage::Format_888, QImage::Format_Indexed8 。

3.3圖像的操作

在對(duì)像素進(jìn)行遍歷操作時(shí),將圖像看成二維數(shù)組,獲取到圖像的首地址,然后找到行下標(biāo),再尋找列下標(biāo),即可進(jìn)行操作。例如彩色圖像要獲取第i行,第j列的像素的紅色通道值記為R(i,j),索引圖像獲取索引值gray(i,j)。按照32位圖像每個(gè)像素占4個(gè)字節(jié),24位圖像每個(gè)像素占3個(gè)字節(jié),8位圖像每個(gè)像素占1個(gè)字節(jié)的理解,對(duì)于不同位深圖像的操作代碼會(huì)寫(xiě)成如下:

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位對(duì)齊,因此對(duì)于32位的圖像,上述操作不會(huì)有問(wèn)題,但對(duì)于24位和8位的圖像,上述操作就會(huì)存在問(wèn)題,當(dāng)圖像的寬度不是4的整數(shù)倍時(shí),上述操作無(wú)法取到正確的像素通道值。

3.3.1通用方法

為了得到正確的R(i,j),采用到公式(1)來(lái)重新計(jì)算圖像數(shù)據(jù)的實(shí)際字節(jié)寬度,計(jì)算方法如下:

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中對(duì)像素值操作的方法

由于QImage類提供了很多接口,能更加簡(jiǎn)便地獲取圖像的像素值。

方法一:利用數(shù)據(jù)補(bǔ)齊寬度進(jìn)行計(jì)算。

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頁(yè))(上接第256頁(yè))

方法二:先獲取圖像數(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 ];

通過(guò)上述兩種方法來(lái)操作圖像像素,不用再考慮數(shù)據(jù)對(duì)齊的問(wèn)題,計(jì)算方式更加簡(jiǎn)便。

3.4圖像數(shù)據(jù)類型轉(zhuǎn)換方法

在處理大型圖像數(shù)據(jù)時(shí),為了節(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ù)組的數(shù)據(jù)轉(zhuǎn)化成圖像數(shù)據(jù),以方便顯示。QImage類可以從uchar數(shù)據(jù)類型中構(gòu)造圖像:QImage ( uchar * data, int width, int height, Format format ) 。

由于存在數(shù)據(jù)對(duì)齊,從data32構(gòu)造圖像時(shí),不會(huì)有任何問(wèn)題,但當(dāng)width不是4的整數(shù)倍時(shí),上述方法就不能從data24和data8構(gòu)造出正確的圖像。

為了正確地將圖像構(gòu)造出來(lái),首先需要計(jì)算出圖像的真實(shí)數(shù)據(jù)量(字節(jié)數(shù))。一種方法是根據(jù)QImage.byteCount()函數(shù)來(lái)獲取圖像的字節(jié)數(shù);另一種方法則是通過(guò)公式(2)計(jì)算:

byteCount = height * W; (2)

這里的W就是每行的實(shí)際字節(jié)數(shù),通過(guò)公式(1)可以進(jìn)行計(jì)算。

然后,利用QT的QByteArray類來(lái)進(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_…);

通過(guò)上述轉(zhuǎn)換方法,transData中將是補(bǔ)齊數(shù)據(jù)的二維數(shù)組,由此構(gòu)造的圖像不會(huì)有任何問(wèn)題。

4總結(jié)

圖像處理技術(shù)已經(jīng)在越來(lái)越多的領(lǐng)域得到應(yīng)用,用于圖像處理的工具很多,QT由于其良好的封裝,在圖像處理編程方面得到了廣泛使用。本文基于QT庫(kù),對(duì)不同位深圖像的操作方法進(jìn)行了總結(jié),并闡述了圖像數(shù)據(jù)轉(zhuǎn)化的方法,為使用QT進(jìn)行圖像處理提供參考。

參考文獻(xiàn)

[1] (加)Blanchette,J.& (美)M.Summerfield.C++ GUI Qt4 編程[M].閆鋒欣,曾泉人,張志強(qiáng)譯.第2版.北京:電子工業(yè)出版社,2008.

[2] (美)岡薩雷斯.數(shù)字圖像處理[M].阮秋琦譯.北京:電子工業(yè)出版社,2007.

[3] 蔡志明.精通Qt4編程(第2版)[M].北京:電子工業(yè)出版社,2011.endprint

主站蜘蛛池模板: 在线看片国产| 精品综合久久久久久97超人该| 亚洲欧洲自拍拍偷午夜色| 婷婷五月在线| 青青青国产免费线在| 精品国产99久久| 米奇精品一区二区三区| 欧美a网站| 五月婷婷激情四射| 亚洲福利视频网址| 中文字幕乱码中文乱码51精品| 国产成人精品高清在线| 草草线在成年免费视频2| 亚洲欧洲日韩综合色天使| 色妞www精品视频一级下载| 狠狠干综合| 精品久久久无码专区中文字幕| 99精品影院| 国产网站免费观看| 成人国产小视频| 亚洲女同一区二区| 日韩精品亚洲人旧成在线| 欧洲av毛片| 色综合中文综合网| 在线中文字幕网| 国产欧美日韩一区二区视频在线| 亚洲Av激情网五月天| 9久久伊人精品综合| 亚洲热线99精品视频| 激情無極限的亚洲一区免费| 亚洲国产一成久久精品国产成人综合| 国产高清在线精品一区二区三区| 亚洲码在线中文在线观看| 亚洲欧美日韩成人在线| 色欲国产一区二区日韩欧美| 欧美亚洲欧美区| 91视频国产高清| 青草国产在线视频| 免费a级毛片18以上观看精品| 成年免费在线观看| 就去色综合| 国产精品吹潮在线观看中文| 91福利一区二区三区| 一区二区在线视频免费观看| 一级毛片无毒不卡直接观看| 亚洲欧美日本国产综合在线| 国产亚洲精品91| 在线观看免费人成视频色快速| 国产一二三区在线| 久久久久国色AV免费观看性色| 超清无码熟妇人妻AV在线绿巨人| 国产打屁股免费区网站| 婷婷综合在线观看丁香| 性色一区| 亚洲第一黄色网| 国产成人精品午夜视频'| 婷婷激情五月网| 国产91熟女高潮一区二区| 天天做天天爱天天爽综合区| 黄色成年视频| 麻豆国产在线观看一区二区 | 美女免费黄网站| 丰满人妻中出白浆| 精品久久久久无码| 免费看av在线网站网址| 欧美a在线视频| 亚洲色图欧美视频| 一区二区无码在线视频| 制服丝袜一区| 亚洲AV永久无码精品古装片| 欧美日韩在线观看一区二区三区| 夜夜爽免费视频| 在线永久免费观看的毛片| 2021国产精品自产拍在线观看 | 国产哺乳奶水91在线播放| 高清免费毛片| 欧美人与动牲交a欧美精品| 激情爆乳一区二区| 成人a免费α片在线视频网站| 国产乱子伦一区二区=| a在线亚洲男人的天堂试看| 国产导航在线|