DICM和BMP图像的显示及转换
一.與設備無關位圖的顯示(DIB)
與設備無關位圖(DIB)可以在不同的及其或者系統中小時位圖所固有的顏色。DIB是一種外部的位圖格式,經常存儲以BMP為后綴的位圖文件。DIB位圖還支持圖像數據的壓縮。
1.BMP文件組成
BMP文件有文件頭、位圖相信頭、顏色信息和圖像數據四部分組成。位圖結構如下所示:
| 位圖文件頭結構BITMAPFILEHEADER |
| 位圖信息頭結構BITMAPINFOHEADER |
| 位圖顏色表RGBQUAD |
| 位圖像素數據 |
a.BMP文件頭
BMP文件頭數據結構含有BMP文件的類型、文件大小和位圖其實位置等信息。其結構定義如下:
typedef struct tagBITMAPFILEHEADER {
? WORD??? bfType; ??????????? //位圖文件的類型,必須為BMP
? DWORD?? bfSize; ??????????? //位圖文件的大小,一字節為單位
? WORD??? bfReserved1;?????? //位圖文件的保留字,必須為O
? WORD??? bfReserved2; ????? //位圖文件的保留字,必須為O
? DWORD?? bfOffBits; ??????? //位圖數據的起始位置,一相對于位圖文件
//的偏移量表示,以字節為單位
} BITMAPFILEHEADER, *PBITMAPFILEHEADER;
b.位圖信息頭
BMP位圖信息頭數據用于說明位圖的尺寸等信息。
typedef struct tagBITMAPINFOHEADER{ DWORD biSize; //本結構所占用的字節數 LONG biWidth; //位圖的寬度,以像素為單位 LONG biHeight; //位圖的高度,一像素為單位 WORD biPlanes; //目標設備的級別,必須為1 WORD biBitCount; //每個像素所需要的位數,必須是1(雙色),//4(16色),8(256色)或24(真彩色)之一 DWORD biCompression; //位圖壓縮類型,必須是0(不壓縮),1 //(BI_RLE8//壓縮類型)或者2(BI_REL4)之一 DWORD biSizeImage; //位圖的大小,以字節為單位 LONG biXPelsPerMeter; //位圖水平分辨率,每米像素數 LONG biYPelsPerMeter; //位圖垂直分辨率,每米像素數 DWORD biClrUsed; //位圖實際使用的顏色表中的顏色數 DWORD biClrImportant; // 位圖顯示過程中重要的顏色數 } BITMAPINFOHEADER, *PBITMAPINFOHEADER; c.顏色表 顏色表用于說明位圖中的顏色,它有若干個表項,每一個表項是一個RGBQUAD類型的結構,定義一種顏色。RGBQUAD結構的定義如下: typedef struct tagRGBQUAD { BYTE rgbBlue; //藍色的亮度 BYTE rgbGreen; //綠色的亮度 BYTE rgbRed;// 紅色的亮度 BYTE rgbReserved; //保留,必須為0 } RGBQUAD; 顏色表中RGBQUAD結構數據的個數由biBitCount來確定: 當biBitCount = 1,4,8,時,分別有2,16,256個表項; 當biBitCount = 24時,沒有顏色表項。 位圖信息頭和顏色表組成位圖信息,BITMAPINFO結構定義如下: Typedef struct tagBITMAPINFO { BITMAPFILEHEADER bmiHeader;//位圖信息頭 RGBQUAD bimColors[1]; //顏色表 } d.位圖數據 位圖數據記錄了位圖的沒一個像素值,記錄順序是在掃描行內是從左到右,掃描行之間是從下到上。位圖的一個像素所占的字節數: 當biBitCount = 1時,8個像素占一個字節; 當biBitCount = 4時,2個像素占一個字節; 當biBitCount = 8時,一個像素占一個字節; 當biBitCount = 24時,一個像素占3個字節。二.BMP圖像的顯示
大多數圖像處理都是基于與設備無關位圖(DIB)來進行討論的,我們所使用的是方法是windows API來實現BMP的顯示,而API中又沒有處理DIB位圖的類,所以需要定義一個處理DIB位圖的專用Cbmp類,在其中封裝必要而有效的DIB數據成員和處理函數,該類具有的功能如下:
class CBmp
{
public:
int GetHeight();//返回位圖的高度
int GetWidth();//返回位圖的寬度
bool SaveToFile(CString & filename); //保存位圖
bool IsCreate();
void ShowBmp(HDC hdc,int x,int y,double k); //顯示BMP位圖
bool SetColor(int x,int y,COLORREF color);
COLORREF GetColor(int x,int y);
bool Create(int width,int heigh);
bool CreateFromFile(CString &FileName); //圖像文件讀取
CBmp();
virtual ~CBmp();
private:
bool is_create;
int BytesPerLine;
int buffer_size;
const int Max_Width;
const int Max_Height;
char * buffer;
int Width;
int Height;
};
Cbmp類設計的目標
用面向對象的方法處理位圖的核心是設計一個DIB的類,稱之為Cbmp類,我主要從功能、數據封裝、和繼承等方面來分析Cbmp類的設計目標。
1.功能
a.根據上面對DIB操作的分析,Cbmp的基本功能包括:
b.DIB文件的讀、寫;
c.提供位圖寬度、高度、顏色數目等位圖相關信息;
d.提供有關位圖占據內存空間信息,包括:圖像數據區首地址、顏色表首地址、位圖信息結構首地址等信息。
2.數據封裝
面向對象方法的一個主要的特征就是數據封裝,即將類的成員數據隱藏在類中,外界只能通過類的成員函數來操作類的成員數據。這是面向對象方法的重要優點,它可以保護類中的數據不受外界的故意修改。
3.繼承
在這里不多介紹!
三.DICM圖像的讀取與顯示
DICM數據的編碼方式和文件結構在莘浩萍本科畢業論文中有詳細的論述。
將DCM圖像轉化為BMP圖像
要把DICOM圖像轉換為BMP圖像,首先要讀取DICOM圖像文件中的參數。通過DICOM說明文件或DICOM標準中的數據字典,查詢到存儲圖像的相關數據,主要有:圖像顯示矩陣,即圖像的寬與高;圖像存儲位數,即每一個像素占用幾個字節,如果圖像為標準的12位灰度(黑白)圖像,必然占用2個字節;找到標簽號為(7FE0,0010)的元素,它指明了圖像像素的起始位置。
DICOM中像素的顯示順序是從左到右,從上到下,第一行顯示完再顯示第二行,設左上角第一個像素坐標為(1,1),在存儲文件中的地址為“A0”,顯示矩陣為寬M、高N,圖像顯示的時候某一坐標為(X,Y)的像素點在文件中存儲的位置為:2×[X+M×(Y-1)-1]+A0。
有了以上數據,就可以確定BMP圖像的相關參數,確定每一個像素在文件中的存儲位置。但與DICOM圖像中像素的顯示順序不同的是,BMP圖像從左下角開始顯示,從左到右,從下到上,因此要將DICOM圖像中最下排的像素填到BMP圖像的最上排。
需要注意的是:BMP圖像中,其存儲像素的藍、綠、紅3個字節的值相等就構成了黑白圖像,因此在顯示黑白圖像時,這3個字節只包含一個字節的信息量,從而BMP圖像只能包含8位256個灰度等級。而DICOM的12位灰度圖像可以包含4096個灰度等級。將12位的DICOM圖像轉換為BMP圖像,必須進行變換。
變換利用窗口技術,變換之前,要先讀取DICOM圖像中的顯示窗寬、窗位值(在DICOM設備或軟件中,將窗寬、窗位調節到最佳),根據窗位確定中間值,低于窗寬的顯示為最
暗,高于窗寬的顯示為最亮,窗寬范圍內的值通過線性或非線性變換轉換為小于256的值。由于人眼的分辨率有限,256個灰度級已完全能滿足人眼的辨別極限。
對于8位的黑白圖像或彩超等的彩色圖像的像素,和BMP的單個像素長度結構一致,只須按坐標位置填入BMP圖像中即可。
四.DICM轉換的具體實現:
有DICM的復雜性,本文只針對某些DCM圖像做讀取與顯示。
首先在Cbmp類中添加public成員函數:
?? bool CreateFromDicm(DICM & Dicm);//從DICM圖像中讀取數據
設計一個新的類DICM,其成員變量和成員函數如下:
class DICM?
{
public:
?? bool IsCreate();
?? int buffer_size;
?? char * buffer;
?? bool CreateFromFile(CString & filename);//從文件中打開圖像
?? bool Create();
?? DICM();
?? virtual ~DICM();
private:
?? bool is_create;
};
總結
以上是生活随笔為你收集整理的DICM和BMP图像的显示及转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 馈线互调测试仪仿真软件,CYME电力工程
- 下一篇: 通过Cadence学拉扎维的第0天-工艺