日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

DICM和BMP图像的显示及转换

發布時間:2023/12/31 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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(雙色),//416色),8256色)或24(真彩色)之一 DWORD biCompression; //位圖壓縮類型,必須是0(不壓縮),1 //BI_RLE8//壓縮類型)或者2BI_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 = 148,時,分別有216256個表項; 當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個字節;找到標簽號為(7FE00010)的元素,它指明了圖像像素的起始位置。

DICOM中像素的顯示順序是從左到右,從上到下,第一行顯示完再顯示第二行,設左上角第一個像素坐標為(11),在存儲文件中的地址為“A0,顯示矩陣為寬M、高N,圖像顯示的時候某一坐標為(XY)的像素點在文件中存儲的位置為:2×[X+M×(Y-1)-1]+A0

有了以上數據,就可以確定BMP圖像的相關參數,確定每一個像素在文件中的存儲位置。但與DICOM圖像中像素的顯示順序不同的是,BMP圖像從左下角開始顯示,從左到右,從下到上,因此要將DICOM圖像中最下排的像素填到BMP圖像的最上排。

需要注意的是:BMP圖像中,其存儲像素的藍、綠、紅3個字節的值相等就構成了黑白圖像,因此在顯示黑白圖像時,這3個字節只包含一個字節的信息量,從而BMP圖像只能包含8256個灰度等級。而DICOM12位灰度圖像可以包含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图像的显示及转换的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。