趙之源
北京郵電大學 北京 100876
基于QT的數字圖像的灰度化處理程序設計
趙之源
北京郵電大學 北京 100876
介紹了使用QT對BMP圖像進行灰度化處理的相關概念和方法。根據BMP格式圖像的格式類型和存儲原理,介紹對BMP格式圖像進行讀取和寫入方法,并在此基礎上介紹了對BMP圖片進行灰度化的方法。
數字圖像;灰度化處理;QT;C++;位圖
大家生活中很多情況下需要將一張彩色的圖片轉變成黑白的圖片,也就是灰度圖,但是大部分人都是直接使用PS或美圖秀秀這些圖片處理的軟件進行,而對圖片灰度化的過程不是十分了解甚至一無所知。很多時候我們需要把彩色圖像轉換為黑白圖像然后進行相關的計算等。而QT的界面設計使得開發帶界面的軟件更為方便,且可用C++語言編寫,運行效率高,執行速度快,適合圖像處理。因此用QT開發一款圖像灰度化的處理程序十分方便也能幫助我們理解灰度化的原理和過程。
生活中,我們見到的大部分物品都是彩色的,我們生活在一個五顏六色的世界中,我們通常用來描述一個物體的顏色的諸如赤、橙、黃、綠、青、藍、紫這些顏色名詞有很多,但是即使是這樣,仍然不能涵蓋自然界的所有顏色或者說即使用這些詞來描述一個物體的顏色仍舊不能描述得很準確。其實每一種復雜的顏色都是可以用紅綠藍這三種顏色按照不同的比例調配出來的,所以不同的顏色種類根據三種顏色所占比例的不同是不同的,數量是非常大的。
同樣,不同的色光還有不同的亮度,同樣是紅色,有的比較亮,有的比較暗。由此可見,顏色是無窮無盡的,那黑白圖像又是怎么一回事呢?圖像的灰度化的原理又是什么呢。
其實圖像灰度化就是根據公示計算出每個像素點的亮度,從而直接用亮度來表示圖片,而不是用以前的R(紅)、G(綠)、B(藍)值。計算公示如下:
這是一個矩陣計算公示,公式中的Y就是亮度值,實際上就是通過原像素點的紅綠藍的值計算出亮度值。通?;叶葓D的數據用8位進行存儲,這樣的圖片灰度有256級,也就是說這種灰度化的圖片中包含256中不同亮度的像素點,255是白色,0是黑色,中間是不同程度的灰色。
而對于不同位數的BMP圖像的灰度化過程也是不同的。
對于2 4位的B M P圖像只需要通過公式Y=0.299R+0.587G+0.144B計算出各像素點的亮度值,然后將亮度值附給該點的RGB值即R=B=G=Y就行了。
而對于其他位數的灰度化也有兩種方法。如對于8位的BMP圖像
Ⅰ.獲取第一個顏色表項中的R G B值,然后利用公式Y=0.299R+0.587G+0.144B計算出該顏色的亮度值Y,并令該顏色表項的RGB值都等于此亮度值Y。同理,再完成對剩余所有顏色表項的處理,便可實現灰度化。
Ⅱ.在8位BMP文件的位圖數據中,首先獲取任意第i行,第j列像素點的顏色表索引值index,根據該索引值找到與其對應的顏色表項color[index],并獲取該顏色表項的RGB值,然后利用公式Y=0.299R+0.587G+0.144B計算出該顏色的亮度值Y,再令index=Y;在完成上述處理之后,再對顏色表項按順序灰度化,即color[index]的R=G=B=index。至此,8位BMP文件的位圖數據就表示每個像素真實的亮度值。這里介紹的示例程序采用上述方法ii實現灰度化。
程序是基于QT設計的,使用C++編程語言,所以設計過程包括界面設計和程序設計思路。
2.1 程序界面設計
程序需要用戶輸入數據,故設計用戶數據接口即可。
2.2 程序流程設計
程序設計的實現過程為:
(1)讀取BMP文件的文件頭、信息頭、顏色表、像素點數據等位圖數據。
其中QT中封裝的獲得文件名代碼如下:
namebmp=QFileDialog::getOpenFileName(this,"打開bmp文件","/","files(*.bmp)");//獲得bmp文件名
(2)根據灰度化原理進行處理,
對8比特的BMP圖片進行灰度化的代碼如下:
for(inti=0;i { for(intj=0;j { index=data[i][j]; ////////24bit if(Bitmapinfoheader.biBitCount==24) { doubley3=0.299*data[i][j*3]+0.587*data[i][3*j+1]+0.114*data[i] [3*j+2]; inty4=(int)((y3+0.5)*10/10.0); if(ui->checkBox->isChecked()) y4=255; data[i][j*3]=y4; data[i][j*3+1]=y4; data[i][j*3+2]=y4; } ////////8bit if(Bitmapinfoheader.biBitCount==8) y0=0.299*Rgbquad[index].rgbRed+0.587*Rgbquad[index]. rgbGreen+0.114*Rgbquad[index].rgbBlue; (3)將新圖片數據寫到新文件中。 ///////寫新文件 FILE*fp1; fp1=fopen((dir1+"/"+name1).toStdString().c_str(),"wb"); fwrite(&Bitmapfileheader,14,1,fp1); fwrite(&Bitmapinfoheader,40,1,fp1); ///////8bit if(Bitmapinfoheader.biBitCount==8) { fwrite(Rgbquad,4*colornum,1,fp1); for(intn=0;n fwrite(data[n],w1,1,fp1); } 本實驗用的是500乘500的8位BMP格式的彩色圖像。灰度化結果如圖2所示 這里只介紹了8比特彩色圖像的灰度化,在進行4比特圖像的灰度化的過程中時要注意數據部分中,每個字節中包含兩個像素的索引值,每次讀出一個字節后需要進行處理。3、程序測試實驗
4、其他