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

主站蜘蛛池模板: 伊人成人在线| jizz在线观看| 91精品综合| 国产不卡一级毛片视频| 2022精品国偷自产免费观看| 久久人妻xunleige无码| 亚洲AⅤ波多系列中文字幕| 99视频在线免费看| 91丨九色丨首页在线播放| 国产91小视频| 日本午夜在线视频| 国产成人做受免费视频| 91成人在线免费视频| 成人亚洲国产| 色综合中文综合网| 中文字幕日韩丝袜一区| 亚洲欧美在线综合一区二区三区 | 99视频在线看| 色综合天天娱乐综合网| 国产尤物视频网址导航| 美女黄网十八禁免费看| 91探花在线观看国产最新| 国产乱码精品一区二区三区中文 | 婷婷六月色| 喷潮白浆直流在线播放| 免费人成黄页在线观看国产| 国产第一页免费浮力影院| 亚洲av无码人妻| 日韩av高清无码一区二区三区| 亚洲制服丝袜第一页| 精品偷拍一区二区| 自拍欧美亚洲| 麻豆国产在线不卡一区二区| 香蕉eeww99国产精选播放| 久久中文无码精品| 久久性妇女精品免费| 国产在线观看高清不卡| 在线看片中文字幕| 98精品全国免费观看视频| 国产成人精品2021欧美日韩 | 亚洲大学生视频在线播放| 成人字幕网视频在线观看| 久久婷婷国产综合尤物精品| 毛片免费观看视频| 制服丝袜一区二区三区在线| 成人第一页| 日本免费一区视频| 全免费a级毛片免费看不卡| 亚洲中文制服丝袜欧美精品| 亚洲天堂.com| 久久精品人人做人人综合试看| 无码一区二区三区视频在线播放| 在线视频精品一区| 美臀人妻中出中文字幕在线| 亚洲综合精品香蕉久久网| 中文字幕欧美成人免费| 精品伊人久久久久7777人| 午夜爽爽视频| 国产精品高清国产三级囯产AV| 色老头综合网| 操美女免费网站| 思思热在线视频精品| 国产主播福利在线观看| 欧美日韩国产成人高清视频| 最新亚洲av女人的天堂| 欧美成人在线免费| 男女男精品视频| 人妻少妇乱子伦精品无码专区毛片| 91无码视频在线观看| 亚洲AV一二三区无码AV蜜桃| 久久婷婷六月| 动漫精品啪啪一区二区三区| 91视频首页| 在线观看无码av免费不卡网站| 91青青在线视频| 午夜性刺激在线观看免费| 亚洲天堂在线免费| 亚洲免费毛片| 亚洲国产成熟视频在线多多| 毛片久久久| 第九色区aⅴ天堂久久香| 国产中文一区二区苍井空|