DICM和BMP图像的显示及转换
2012-11-21 13:03
239 查看
一.与设备无关位图的显示(DIB)
与设备无关位图(DIB)可以在不同的及其或者系统中小时位图所固有的颜色。DIB是一种外部的位图格式,经常存储以BMP为后缀的位图文件。DIB位图还支持图像数据的压缩。
1.BMP文件组成
BMP文件有文件头、位图相信头、颜色信息和图像数据四部分组成。位图结构如下所示:
a.BMP文件头
BMP文件头数据结构含有BMP文件的类型、文件大小和位图其实位置等信息。其结构定义如下:
typedefstructtagBITMAPFILEHEADER{
WORDbfType;
//位图文件的类型,必须为BMP
DWORDbfSize;
//位图文件的大小,一字节为单位
WORDbfReserved1;
//位图文件的保留字,必须为O
WORDbfReserved2;
//位图文件的保留字,必须为O
DWORDbfOffBits;
//位图数据的起始位置,一相对于位图文件
//的偏移量表示,以字节为单位
}BITMAPFILEHEADER,*PBITMAPFILEHEADER;
b.位图信息头
BMP位图信息头数据用于说明位图的尺寸等信息。
二.BMP图像的显示
大多数图像处理都是基于与设备无关位图(DIB)来进行讨论的,我们所使用的是方法是windows
API来实现BMP的显示,而API中又没有处理DIB位图的类,所以需要定义一个处理DIB位图的专用Cbmp类,在其中封装必要而有效的DIB数据成员和处理函数,该类具有的功能如下:
classCBmp
{
public:
intGetHeight();//返回位图的高度
intGetWidth();//返回位图的宽度
boolSaveToFile(CString&filename);//保存位图
boolIsCreate();
voidShowBmp(HDChdc,intx,inty,doublek);//显示BMP位图
boolSetColor(intx,inty,COLORREFcolor);
COLORREFGetColor(intx,inty);
boolCreate(intwidth,intheigh);
boolCreateFromFile(CString&FileName);//图像文件读取
CBmp();
virtual~CBmp();
private:
boolis_create;
intBytesPerLine;
intbuffer_size;
constintMax_Width;
constintMax_Height;
char*buffer;
intWidth;
intHeight;
};
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成员函数:
boolCreateFromDicm(DICM&Dicm);//从DICM图像中读取数据
设计一个新的类DICM,其成员变量和成员函数如下:
classDICM
{
public:
boolIsCreate();
intbuffer_size;
char*buffer;
boolCreateFromFile(CString&filename);//从文件中打开图像
boolCreate();
DICM();
virtual~DICM();
private:
boolis_create;
};
与设备无关位图(DIB)可以在不同的及其或者系统中小时位图所固有的颜色。DIB是一种外部的位图格式,经常存储以BMP为后缀的位图文件。DIB位图还支持图像数据的压缩。
1.BMP文件组成
BMP文件有文件头、位图相信头、颜色信息和图像数据四部分组成。位图结构如下所示:
位图文件头结构BITMAPFILEHEADER |
位图信息头结构BITMAPINFOHEADER |
位图颜色表RGBQUAD |
位图像素数据 |
BMP文件头数据结构含有BMP文件的类型、文件大小和位图其实位置等信息。其结构定义如下:
typedefstructtagBITMAPFILEHEADER{
WORDbfType;
//位图文件的类型,必须为BMP
DWORDbfSize;
//位图文件的大小,一字节为单位
WORDbfReserved1;
//位图文件的保留字,必须为O
WORDbfReserved2;
//位图文件的保留字,必须为O
DWORDbfOffBits;
//位图数据的起始位置,一相对于位图文件
//的偏移量表示,以字节为单位
}BITMAPFILEHEADER,*PBITMAPFILEHEADER;
b.位图信息头
BMP位图信息头数据用于说明位图的尺寸等信息。
typedefstructtagBITMAPINFOHEADER{
DWORDbiSize;//本结构所占用的字节数
LONGbiWidth;//位图的宽度,以像素为单位
LONGbiHeight;//位图的高度,一像素为单位
WORDbiPlanes;//目标设备的级别,必须为1
WORDbiBitCount;//每个像素所需要的位数,必须是1(双色),//4(16色),8(256色)或24(真彩色)之一
DWORDbiCompression;//位图压缩类型,必须是0(不压缩),1
//(BI_RLE8//压缩类型)或者2(BI_REL4)之一
DWORDbiSizeImage;//位图的大小,以字节为单位
LONGbiXPelsPerMeter;//位图水平分辨率,每米像素数
LONGbiYPelsPerMeter;//位图垂直分辨率,每米像素数
DWORDbiClrUsed;//位图实际使用的颜色表中的颜色数
DWORDbiClrImportant;//位图显示过程中重要的颜色数
}BITMAPINFOHEADER,*PBITMAPINFOHEADER;
c.颜色表
颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。RGBQUAD结构的定义如下:
typedefstructtagRGBQUAD
{
BYTErgbBlue;//蓝色的亮度
BYTErgbGreen;//绿色的亮度
BYTErgbRed;//红色的亮度
BYTErgbReserved;//保留,必须为0
}RGBQUAD;
颜色表中RGBQUAD结构数据的个数由biBitCount来确定:
当biBitCount=1,4,8,时,分别有2,16,256个表项;
当biBitCount=24时,没有颜色表项。
位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下:
TypedefstructtagBITMAPINFO
{
BITMAPFILEHEADERbmiHeader;//位图信息头
RGBQUADbimColors[1];//颜色表
}
d.位图数据
位图数据记录了位图的没一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。位图的一个像素所占的字节数:
当biBitCount=1时,8个像素占一个字节;
当biBitCount=4时,2个像素占一个字节;
当biBitCount=8时,一个像素占一个字节;
当biBitCount=24时,一个像素占3个字节。
二.BMP图像的显示
大多数图像处理都是基于与设备无关位图(DIB)来进行讨论的,我们所使用的是方法是windows
API来实现BMP的显示,而API中又没有处理DIB位图的类,所以需要定义一个处理DIB位图的专用Cbmp类,在其中封装必要而有效的DIB数据成员和处理函数,该类具有的功能如下:
classCBmp
{
public:
intGetHeight();//返回位图的高度
intGetWidth();//返回位图的宽度
boolSaveToFile(CString&filename);//保存位图
boolIsCreate();
voidShowBmp(HDChdc,intx,inty,doublek);//显示BMP位图
boolSetColor(intx,inty,COLORREFcolor);
COLORREFGetColor(intx,inty);
boolCreate(intwidth,intheigh);
boolCreateFromFile(CString&FileName);//图像文件读取
CBmp();
virtual~CBmp();
private:
boolis_create;
intBytesPerLine;
intbuffer_size;
constintMax_Width;
constintMax_Height;
char*buffer;
intWidth;
intHeight;
};
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成员函数:
boolCreateFromDicm(DICM&Dicm);//从DICM图像中读取数据
设计一个新的类DICM,其成员变量和成员函数如下:
classDICM
{
public:
boolIsCreate();
intbuffer_size;
char*buffer;
boolCreateFromFile(CString&filename);//从文件中打开图像
boolCreate();
DICM();
virtual~DICM();
private:
boolis_create;
};
相关文章推荐
- ITK实现DICM图像转换成BMP图像
- 将开发板中显示的图像保存为bmp
- 将bmp图像转换为CCS可以识读的dat文件,Matlab实现
- 图像转换(jpg to bmo)(bmp to jpg)
- 使用IPicture接口读取和显示BMP,GIF,JPG,ICO,EMF,WMF图像
- 使用IPicture接口读取和显示BMP,GIF,JPG,ICO,EMF,WMF图像
- CFE文件内嵌bmp图像并显示
- VC 中BMP、JPG、GIF图像的显示
- 使用IPicture的OLE实现读取和显示BMP,GIF,JPG,ICO,EMF,WMF图像
- BMP、JPG、GIF图像的显示
- VC++ 2005中显示jpg,bmp,gif图像的方法
- OpenCV中如何载入图像并且转换成灰度显示图像直方图
- C#使用GDAL将tif图像转换为jpg、bmp、png和gif格式的图像
- 【python】python库Pillow图像显示,和ndarray的相互转换
- 远程控制编写之屏幕传输 MFC实现 屏幕截图 发送bmp数据 显示bmp图像
- VC 中BMP、JPG、GIF图像的显示
- VC下显示JPG,BMP,GIF等图像格式
- TC下显示256色bmp图像
- BMP的图像在Google浏览器中不能显示
- 怎样显示Jpg,bmp,Gif图像文件