当前位置:首页 > 代码 > 正文

位图处理源代码(获取位图的常用方法)

admin 发布:2022-12-19 10:15 190


今天给各位分享位图处理源代码的知识,其中也会对获取位图的常用方法进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

求DICOM转换到BMP图像的VB源代码

16日 星期二 11:04 目的 探讨DICOM图像转换成BMP图像的方法,以便于对DICOM图像进行读取、处理、存贮。方法 分析DICOM图像和BMP图像文件格式,读取DICOM图像数据并进行加窗显示、垂直镜像变换,以BMP格式存储。结果 此方法实现了DICOM图像到BMP图像的转换。结论 多数的计算机没有读取DICOM图像的软件,转换为BMP图像后几乎所有的计算机均可读取图像。

DICOM;BMP;加窗显示

Translating from DICOM image into BMP imageWANG Shi-gang , LI Yue-qing , WANG Chang-yuan(Taishan Medical College, Taian 271000,China)

Abstract:Objective: To explore the method of translating the DICOM image into BMP one in order to read, process and memorize the DICOM image. Methods:The structures of DICOM image and BMP one were analyzed; the data of DICOM image were read with the window displayed; plumb mirror were transformed and memorized in the format of BMP image. Results: The DICOM image was translated into BMP one by this method. Conclusion: The majority of computers are not provided with the software that can read DICOM image, but almost any computers can read the translated image in the format of BMP.

Key words:DICOM; BMP; window display

医学数字成像与通讯(digital imaging and communication in medicine,DICOM)标准的应用促进了医学影像设备之间的互操作性,提供了一种用于医学信息的开放性的数据交换标准,使得不同厂商生产的影像设备形成的图像统一存档与通讯成为可能,加快了图像存档与通讯系统(picture archiving and communication systems,PACS)的发展;但是大多数图像处理软件都不支持DICOM图像文件格式,所以要处理DICOM图像文件必然要对其进行格式转换,而BMP格式图像是应用最广泛的一种图像文件格式,且Windows操作系统带有BMP图像处理软件——画图。因此,将DICOM图像转换成BMP图像是非常必要的。

1 材料与方法

1.1 材料

胜利油田中心医院somatom sensation 16CT DICOM图像、Windows2000操作系统、Microsoft Visual C++ 6.0编程软件。

1.2 方法

1.2.1 DICOM文件格式 DICOM图像由文件信息头和至少一个图像数据集合组成。DICOM文件格式见图1,其文件头是可选的,其中前同步码长128Bytes,没有结构,不能作为数据元编码,它的存在是为了提供一些通用计算机文件格式的兼容性,文件的说明信息应该放在前同步中,如文件的传输格式,生成该文件的应用程序等等。当一个文件被切割成多个部分(例如用多张盘存储一个文件时),文件头可以存放随机访问图像所需要的信息。当文件头没有被使用时,它应该设为全零,即128Bytes的00H。前缀长4Bytes,为大写字符“DICM”,可以根据该值来判断一个文件是否为一个DICOM文件〔1~4〕。

图1 DICOM文件格式

数据集合由数据元素组成,是数据元素的有序集合,它不仅包括医学图像数据,还包括许多和医学图像有关的信息,如病人姓名,图像大小等等。数据元素由若干字段组成:数据元素标签(Data Element Tag)、数据值类型表述(value representation ,VR)、数据值长度、数据值体。

数据元素标签,是一个16Bits无符号整数对按顺序排列。前面是数据元素的组号,后面是数据元素号码,数据元素是通过数据元素标签唯一标志的,组号为偶数的是标准数据元素,DICOM的数据字典中有定义,如(0008,0020)表示研究日期,(7FE0,0010)表示像素数据;组号为奇数的为私有数据元素,由用户在使用过程中自己定义,但在DICOM标准中对自己定义的数据元素也有详细的规则说明。

数据值类型表述,是16Bits的字符串,指明该数据元素中的数据是那种类型的,用DICOM默认字符集编码。如:一个数据元素的VR为DA,则表示该数据元素中存储的数据为日期型数据。

数据值长度,是一个16Bits或32Bits(取决于显示或隐式VR)无符号整数,表明准确的数据值体的长度,按字节数目记录。

数据值体,其长度为偶数字节,存放了该数据元素的数值,该字段的数据类型由数据元素的VR所确定。

1.2.2 BMP文件格式 BMP文件由四个部分组成:位图文件头(Bitmap-file)、位图信息头(Bitmap-information)、彩色表(Color Table)或调色板(Palette)、图像数据阵列。〔5〕

位图文件头包含文件类型、文件大小、存放位置等信息,在Windows中用BITMAPFILEHEADER结构定义,这个结构的长度是固定的,为14Bytes;位图信息头BITMAPINFOHEADER也是一个长度固定的结构,为40Bytes;调色板是可选项,如果有调色板,则调色板实际上是一个数组,它建立了数组和颜色之间的对应关系,其个数为位图使用的颜色数个元素,数组中每个元素的类型是一个RGB QUAD结构,占4Bytes,定义如下:1Byte用于蓝色分量,1Byte用于绿色分量,1Byte用于红色分量,1Byte用于填充符(设置为0);图像数据位于调色板之后。若没有调色板,则在BITMAPINFOHEADER之后。

1.2.3 两种图像文件格式的不同 DICOM图像与BMP图像文件头和数据结构都有很大差别,DICOM图像除了有图像大小、高度、宽度、每像素字节数等普通图像的必备信息外,还在数据集合的数据元素中存储了大量医疗信息如病人姓名、年龄、医院名、成像时间、检查部位等。

两种图像的图像数据阵列也有很大差异,DICOM图像是按顺序存储的,阵列中的第一个字节表示图像左上角的像素,而最后一个字节表示图像右下角的像素;BMP图像是由底向上存储的,也就是说,阵列中的第一个字节表示图像左下角的像素,而最后一个字节表示图像右上角的像素,因此在图像转换中需要用到镜像变换。

阅读DICOM与BMP文献,分析比较其图像存储格式,编程读取DICOM图像文件信息,进行镜像变换和加窗显示技术,写入BMP文件以实现图像格式的转换。

1.2.4 镜像变换 镜像变换是医学图像处理的一种手段,分为水平镜像变换、垂直镜像变换、对角镜像变换等。水平镜像变换图像以图像铅直中轴线为对称轴进行列像素对调;垂直镜像变换以图像水平中轴线为对称轴进行行像素对调,对角镜像变换以图像对角线为对称轴进行像素对调。

1.2.5 加窗显示技术 所谓加窗显示是指通过一个窗口,将窗口区域的图像线性地转换到显示器的最大显示范围内,高于或低于窗口上下限的图像数据则分别设置为最高或最低的显示值。这样通过动态地调节窗口的窗宽(需显示的图像数据的范围)和窗位(需显示的图像数据的中心值),则可以观察医学图像的更多信息。〔6〕

1.2.6 图像转换过程 图像转换程序的流程图如图2所示,在图2中,cb 表示图像文件的大小,DICOM表示数组,Rows 表示图像行数,Columns表示图像列数, WC表示图像窗位, WW表示图像窗宽, PixData表示图像数据的起始位置。

2 结 果

程序实现的图像格式转换的结果如图3和图4所示。

图4便是由图3转换得到的图像,此程序实现的功能并没有读取DICOM图像患者本身的信息(如姓名、性别、年龄、等等)、扫描参数(如千伏、毫安、层厚、等等),只读取了图像的数据。

3 讨 论

由于BMP图像每一行的字节数必须是4的整倍数,因此,在转换时需补齐;另外,BMP文件的数据从下到上,从左到右的存放,因此,写入BMP的像素需要做垂直镜像变换处理。

在BMP图像中,其存储像素的蓝、绿、红3Bytes的值相等就构成了黑白灰阶图像,因此在显示黑白灰阶图像时,这3Bytes只包含了1Byte的信息,从而BMP图像只能包含256个灰度等级;而DICOM格式的图像数据可以按8Bits、12Bits、16Bits或24Bits存储,对于8Bits的数据可以直接按坐标位置填入BMP图像中,对于其他三种情况则可通过加窗显示技术使其转换为8Bits的BMP图像或再填充使蓝、绿、红3Bytes的值相等构成24Bits 的黑白灰阶图像。

胜利油田中心医院somatom sensation 16CT DICOM图像每一个像素占2个Bytes,有效的是12Bits信息,即12Bits的黑白灰阶图像。图3是初始的DICOM图像,大小为514K,图4是图3转换后的BMP图像,大小为257K,大小为原图像的一半,原因是DICOM图像每一个像素占2Bytes,而转换后的BMP图像每一个像素占1Byte。

网上找的我是没看懂希望对你有帮助。。

求bmp位图在VC++中的打开,显示,保存

用VC读取bmp位图文件的源代码 :

CPaintDC dc(this);

CDC memDC;

CBitmap bmp;

HBITMAP hbmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),strPath,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

bmp.Attach(hbmp);

memDC.CreateCompatibleDC(dc);

memDC.SelectObject(bmp);

dc.BitBlt(0,0,800,600,memDC,0,0,SRCCOPY);

memDC.DeleteDC();

其中strPath为位图的地址如:strPath="E:\\test.bmp";

帮忙看一段C代码 图像处理方面

看了半天才看明白,这个程序是个画线程序,它的算法好苯,好复杂,看得我晕乎乎的

好了下面我不逐行解释了,但是我会帮你把理解该程序的关键点告诉你。

首先这个源图像肯定是256色DIB位图,这个毫无疑问,根据程序的像素附值0和255,有可能是256色黑白位图,0代表黑色像素,255代表白色像素,但是不一定,通常意义上是这样的,除非他更改了调色板的索引。BYTE *pE表示了图像数据的指针,int dh就是作为y0,y1之间的距离判断条件。

我把for循环中间的break,continue去掉,然后把循环合并,程序实际上实现了一个完整像素寻址,依次访问的过程,每次都是从第一列开始,垂直向上循环,然后第二列,再垂直向上,一直到第width列结束。

for(x=0;xWidth;x++)

{

for(y=0;yhy;y++)

{

pME=pE+rWidth*y+x; //这里pME就是指向图像中第y行第x列的像素的指针

*pME=255; //就是给像素附值

}

}

rWidth就是图像每一行的总字节数,只不过程序中用了pME+=rWidth的方式来表示,很不直观。

至于该程序实现的目标,为了更形象的表示,我用0,1画图给你表达图像

111111111111111111111111111111111111111111111111

111111111111111111111111111111111111111111111111

111111111111111111111111111111111111111111111111

111111111111111111111111111111111111111111111111

000000000000000000000000000000000000000000

000000000000000000000000000000000000000000

000000000000000000000000000000000000000000

000000000000000000000000000000000000000000

111111111111111111111111111111111111111111111111

111111111111111111111111111111111111111111111111

111111111111111111111111111111111111111111111111

000000000000000000000000000000000000000000

000000000000000000000000000000000000000000

000000000000000000000000000000000000000000

运行该程序之后,就会把两个行1之间的距离小于int dh,则把0全部附值为255,恩就这么简单,结果编写这个程序的人弄得非常难以理解.

求处理图片bmp文件的程序代码(C语言)

bmp文件由文件头,位图信息头,颜色表,和数据部组成

文件头:

typedef struct tagBITMAPFILEHEADER

{

    WORD bfType;//位图文件的类型,必须为BM(1-2字节)

    DWORD bfSize;//位图文件的大小,以字节为单位(3-6字节,低位在前)

    WORD bfReserved1;//位图文件保留字,必须为0(7-8字节)

    WORD bfReserved2;//位图文件保留字,必须为0(9-10字节)

    DWORD bfOffBits;//位图数据的起始位置,以相对于位图(11-14字节,低位在前)

    //文件头的偏移量表示,以字节为单位

}BITMAPFILEHEADER;

位图信息头:

typedefstructtagBITMAPINFOHEADER{

    DWORDbiSize;//本结构所占用字节数(15-18字节)

    LONGbiWidth;//位图的宽度,以像素为单位(19-22字节)

    LONGbiHeight;//位图的高度,以像素为单位(23-26字节)

    WORDbiPlanes;//目标设备的级别,必须为1(27-28字节)

    WORDbiBitCount;//每个像素所需的位数,必须是1(双色),(29-30字节)

    //4(16色),8(256色)16(高彩色)或24(真彩色)之一

    DWORDbiCompression;//位图压缩类型,必须是0(不压缩),(31-34字节)

    //1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一

    DWORDbiSizeImage;//位图的大小(其中包含了为了补齐行数是4的倍数而添加的空字节),以字节为单位(35-38字节)

    LONGbiXPelsPerMeter;//位图水平分辨率,每米像素数(39-42字节)

    LONGbiYPelsPerMeter;//位图垂直分辨率,每米像素数(43-46字节)

    DWORDbiClrUsed;//位图实际使用的颜色表中的颜色数(47-50字节)

    DWORDbiClrImportant;//位图显示过程中重要的颜色数(51-54字节)

}BITMAPINFOHEADER;

打开文件读出这些信息,然后用一个RGB的构造体二维数组(height*width)来读取数据部分

如何用VISUAL C++打开BMP图像?求源代码

你首先需要了解bmp文件的文件结构。

1)前面14个字节是

文件头

——c++中有一个结构体

bitmapfileheader

与其对应

2)接下来的40个字节

是位图信息头

——

c++中有一个结构体

bitmapinfoheader

与其对应

3)再接下来就是调色板——字节数和你所用的文件的颜色总数有关,例如,256色,就有256条记录;16色就有,16条记录。注意,每条记录有4个字节,文件中存储顺序(bgr)再加上一个保留字节。如果是24真彩色,那么就没有调色板。

4)接下来就是位图信息了。如果是24真彩色,那么就是三个字节代表一个像素的rgb;如果,不是24真彩色,就是一个字节代表一个像素的rgb。需要注意的是,(非24真彩色时)这一个字节代表的只是索引值,用来寻找调色板中对应该索引的rgb值。

综上所述,你只要用一个指针指向位图信息,再根据相应的颜色数,就可以取得rgb值。

贴具体代码,比较麻烦。不过,弄清楚了这些,你就可以自己写了。

用c语言读取24位位图bmp文件

可以使用C语言标准函数库中的fopen、fseek、fclose等系列函数来打开bmp位图文件,以及进行相应的处理,下面是一个demo,仅供参考。以下代码在vc6.0中编译通过。

#include stdio.h

#include stdlib.h

#define BITMAPFILEHEADERLENGTH 14   // The bmp FileHeader length is 14

#define BM 19778                    // The ASCII code for BM

/* Test the file is bmp file or not */

void bmpFileTest(FILE* fpbmp);

/* To get the OffSet of header to data part */

void bmpHeaderPartLength(FILE* fpbmp);

/* To get the width and height of the bmp file */

void BmpWidthHeight(FILE* fpbmp);

//get r,g,b data

void bmpDataPart(FILE* fpbmp);

// output data to corresponding txt file

void bmpoutput(FILE *fpout);

unsigned int OffSet = 0;    // OffSet from Header part to Data Part

long width ;          // The Width of the Data Part

long height ;         // The Height of the Data Part

unsigned char r[2000][2000],output_r[2000][2000];

unsigned char g[2000][2000],output_g[2000][2000];

unsigned char b[2000][2000],output_b[2000][2000];

int main(int argc, char* argv[])

{

     /* Open bmp file */

unsigned char *fp_temp;

     FILE *fpbmp;

     FILE *fpout;

     fpbmp= fopen("1.bmp", "rb");

     if (fpbmp == NULL)

     {

 printf("Open bmp failed!!!\n");

 return 1;

     }

     fpout= fopen("out.bmp", "wb+");

     if (fpout == NULL)

     {

 printf("Open out.bmp failed!!!\n");

 return 1;

     }

     

     bmpFileTest(fpbmp);                //Test the file is bmp file or not

     bmpHeaderPartLength(fpbmp);        //Get the length of Header Part

     BmpWidthHeight(fpbmp);             //Get the width and width of the Data Part

     

     

//

fseek(fpbmp, 0L, SEEK_SET);

fseek(fpout, 0L, SEEK_SET);

 

fp_temp=(unsigned char *)malloc(OffSet);

         fread(fp_temp, 1, OffSet, fpbmp);

fwrite(fp_temp,1,OffSet,fpout);

     

bmpDataPart(fpbmp);                //Reserve the data to file 

     

/*

 

 

 如果您想对图片进行处理,请您再这里插入处理函数!!!!!!!!!!!!!!!!!!

 

*/

bmpoutput(fpout);

fclose(fpbmp);

fclose(fpout);

         return 0;

}

void bmpoutput(FILE* fpout)

{

         int i, j=0;

         int stride;

unsigned char* pixout=NULL;

   

stride=(24*width+31)/8;

stride=stride/4*4;

pixout=(unsigned char *)malloc(stride);

 

fseek(fpout, OffSet, SEEK_SET);

for(j=0;jheight;j++)

{

   for(i=0;iwidth;i++)

        {

            pixout[i*3+2]=output_r[height-1-j][i];

            pixout[i*3+1]=output_g[height-1-j][i];

            pixout[i*3]  =output_b[height-1-j][i];

        }

fwrite(pixout, 1, stride, fpout);

}

}

void bmpDataPart(FILE* fpbmp)

{

         int i, j=0;

int stride;

unsigned char* pix=NULL;

FILE* fpr;

         FILE* fpg;

FILE* fpb;

     

     if((fpr=fopen("bmpr.txt","w+")) == NULL)

     {

    printf("Failed to construct file bmpr.txt.!!!");

exit(1);

     }

     if((fpg=fopen("bmpg.txt","w+")) == NULL)

     {

 printf("Failed to construct file bmpg.txt.!!!");

 exit(1);

     }

if((fpb=fopen("bmpb.txt","w+")) == NULL)

     {

printf("Failed to construct file bmpb.txt.!!!");

exit(1);

     }

 

     fseek(fpbmp, OffSet, SEEK_SET);

stride=(24*width+31)/8;

stride=stride/4*4;

pix=(unsigned char *)malloc(stride);

 

for(j=0;jheight;j++)

{

fread(pix, 1, stride, fpbmp);

   for(i=0;iwidth;i++)

        {

            r[height-1-j][i]   =pix[i*3+2];

            g[height-1-j][i]   =pix[i*3+1];

            b[height-1-j][i]   =pix[i*3];

output_r[height-1-j][i]   =pix[i*3+2];

            output_g[height-1-j][i]   =pix[i*3+1];

            output_b[height-1-j][i]   =pix[i*3];

        }

}

 for(i =0; i  height; i++)

     {

for(j = 0; j  width-1; j++)

{   

fprintf(fpb,"%4d",b[i][j]);

fprintf(fpg,"%4d",g[i][j]);

fprintf(fpr,"%4d",r[i][j]);

}

fprintf(fpb,"%4d\n",b[i][j]);

fprintf(fpg,"%4d\n",g[i][j]);

fprintf(fpr,"%4d\n",r[i][j]);

 }

  

fclose(fpr);

fclose(fpg);

fclose(fpb);

 

}

void bmpFileTest(FILE* fpbmp)

{     

     unsigned short bfType = 0;

 

     fseek(fpbmp, 0L, SEEK_SET);//seek_set 起始位置

     fread(bfType, sizeof(char), 2, fpbmp);

     if (BM != bfType)

     {

 printf("This file is not bmp file.!!!\n");

 exit(1);

     }

}

/* To get the OffSet of header to data part */

void bmpHeaderPartLength(FILE* fpbmp)

{

     fseek(fpbmp, 10L, SEEK_SET);

     fread(OffSet, sizeof(char), 4, fpbmp);  

     printf("The Header Part is of length %d.\n", OffSet);

}

/* To get the width and height of the bmp file */

void BmpWidthHeight(FILE* fpbmp)

{

     fseek(fpbmp, 18L, SEEK_SET);

     fread(width, sizeof(char), 4, fpbmp);

     fseek(fpbmp, 22L, SEEK_SET);

     fread(height, sizeof(char), 4, fpbmp);

     printf("The Width of the bmp file is %ld.\n", width);

     printf("The Height of the bmp file is %ld.\n", height);

}

关于位图处理源代码和获取位图的常用方法的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/6528.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载