趙之源
北京郵電大學(xué) 北京 100876
基于QT的數(shù)字圖像的幾何變換程序設(shè)計(jì)
趙之源
北京郵電大學(xué) 北京 100876
介紹了使用QT對(duì)BMP圖像進(jìn)行幾何變換的相關(guān)概念和方法。根據(jù)BMP格式圖像的格式類型和存儲(chǔ)原理,介紹對(duì)BMP格式圖像進(jìn)行讀取和寫(xiě)入方法,并在此基礎(chǔ)上介紹了對(duì)BMP圖片進(jìn)行幾何變換的處理的方法和C++代碼。
數(shù)字圖像;幾何變換;QT;C++
數(shù)字圖像的幾何變換,顧名思義,就是對(duì)圖像進(jìn)行幾何空間上的變換,比如圖像的大小、圖像的形狀、圖像的位置等變化。一般圖像處理軟件中的裁剪、縮放、旋轉(zhuǎn)等功能都是基于數(shù)字圖像的幾何變換原理工作的。市場(chǎng)中常見(jiàn)的PS等圖像處理軟件可調(diào)節(jié)參數(shù)較少,不能滿足用戶部分用戶需求,QT的界面設(shè)計(jì)使得開(kāi)發(fā)帶界面的軟件更為方便,且可用C++語(yǔ)言編寫(xiě),運(yùn)行效率高,執(zhí)行速度快,適合圖像處理。
數(shù)字圖像的幾何變換一般分為兩種,一種是位置變換,比如平移、旋轉(zhuǎn)等;另一種是形狀變換,比如縮放,裁剪等。當(dāng)然還有綜合兩者的復(fù)合變換。圖像幾何變換的原理比較簡(jiǎn)單,一般可以理解為圖像的像素點(diǎn)在平面內(nèi)的各種方向上的平移。但是對(duì)于縮放變換一般還涉及到圖像像素點(diǎn)的插值問(wèn)題。
數(shù)字圖像的幾何變換過(guò)程可以理解為一個(gè)線性換,由公式(1)和公示(2)定義:
公式(1)、(2)中的X、Y表示變換后的像素坐標(biāo),x、y表示變前的像素坐標(biāo),a、b是實(shí)數(shù)。而插值一般用于圖像的放大部分,對(duì)于放大后多出的像素需要經(jīng)過(guò)特定的計(jì)算賦值,一般取新增像素點(diǎn)的周?chē)c(diǎn)的平均值作為新增像素點(diǎn)的亮度值。
程序是基于QT設(shè)計(jì)的,使用C++編程語(yǔ)言,所以設(shè)計(jì)過(guò)程包括界面設(shè)計(jì)和程序設(shè)計(jì)思路。
2.1 程序界面設(shè)計(jì)
程序需要用戶輸入數(shù)據(jù),故設(shè)計(jì)用戶數(shù)據(jù)接口即可。
2.2 程序流程設(shè)計(jì)
程序設(shè)計(jì)的實(shí)現(xiàn)過(guò)程為:(1)讀取BMP文件的文件頭、信息頭、顏色表、像素點(diǎn)數(shù)據(jù)等位圖數(shù)據(jù)。(2)實(shí)現(xiàn)圖像的平移功能。主要代碼和注釋如下:
for(inti=0;i for(intj=0;j { intx1=i+100; inty1=j+100; if(y1 data6[i][j]=data0[x1][y1]; else data6[i][j]=0; } (3)實(shí)現(xiàn)圖像的左右反轉(zhuǎn)功能。用每行最大點(diǎn)數(shù)減橫坐標(biāo)即可得到新的橫坐標(biāo),縱坐標(biāo)不變即完成反轉(zhuǎn) 關(guān)鍵代碼如下: for (inti=0; i for (int j=0; j data1[i][j]=data0[i][byteline-j]; (4)實(shí)現(xiàn)圖像的上下反轉(zhuǎn)功能。同左右反轉(zhuǎn)原理,更改縱坐標(biāo)即可。 關(guān)鍵代碼如下: for (inti=0; i for (int j=0; j data2[i][j]=data0[Bitmapinfoheader.biHeight-i-1][j]; (5)實(shí)現(xiàn)圖像的等比例縮小功能。主要代碼如下: ///////原圖像旋轉(zhuǎn)平移后的坐標(biāo)跟原坐標(biāo)的對(duì)應(yīng)關(guān)系 for(inti=0;i for(intj=0;j { data5[i][j]=data0[i*4][j*4]; } (6)實(shí)現(xiàn)圖像的等比例擴(kuò)大功能。 等比例擴(kuò)大采用雙線性內(nèi)插法,前后共進(jìn)行三次直線方程計(jì)算,得出對(duì)應(yīng)點(diǎn)的坐標(biāo),關(guān)鍵代碼如下: BYTEtemp1; BYTEtemp2; BYTEtemp3; floatx,y; for(inti=0;i for(intj=0;j { x=i/4.0; y=j/4.0; //雙線性插入,共經(jīng)過(guò)以下三條直線方程計(jì)算出插入點(diǎn)亮度。 temp1=data0[i/4][j/4]+(data0[i/4+1][j/4]-data0[i/4] [j/4])*(x-i/4); temp2=data0[i/4][j/4+1]+(data0[i/4+1][j/4+1]-data0[i/4] [j/4+1])*(x-i/4); temp3=temp1+(temp2-temp1)*(y-j/4); data6[i][j]=temp3; } (7)將圖片數(shù)據(jù)寫(xiě)到新文件中。(8)如果縮放過(guò)程需要更改畫(huà)布大小,要根據(jù)新圖像所需畫(huà)布大小重新更改文件頭數(shù)據(jù),包括文件寬度、高度、數(shù)據(jù)大小、文件大小。 本實(shí)驗(yàn)用的是500乘500的8位BMP格式的灰度圖像。 原畫(huà)布大小旋轉(zhuǎn)丟失旋轉(zhuǎn)后畫(huà)布外的圖像,實(shí)驗(yàn)結(jié)果如圖3所示擴(kuò)大畫(huà)布大小旋轉(zhuǎn)保留全部圖像,實(shí)驗(yàn)結(jié)果如圖4所示3、程序測(cè)試實(shí)驗(yàn)