代码:

//zoukeke 1670386358@qq.com 2020年3月17日
#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <windows.h>
using namespace cv;
struct TagValue
{unsigned short tag1;unsigned short tag2;
};// 原始象素类型
enum E_SourcePixelType
{ ESourcePixelType_U16,     // USHORTESourcePixelType_I16,      // SHORT
};int _tmain(int argc, _TCHAR* argv[])
{bool isVR=true;bool isLitteEndian=true;int file_length=0;char VR[3];unsigned int pixDataLen=0;unsigned int pixDataOffset=0;unsigned short channle=0;unsigned short rows=0;unsigned short cols=0;unsigned short dataLen=0;  unsigned short validLen=0;E_SourcePixelType pixelType;int windowsWidth=0;int windowsCenter=0;bool ZeroIsBlack=true;float RescaleSlope =0.06;float RescaleIntercept=0;FILE *fp;fp=fopen("11.dcm","rb");if(fp==NULL){printf("can not open file!");return 0;} fseek(fp,0,SEEK_END);file_length=ftell(fp);fseek(fp,0,SEEK_SET);fseek(fp,128,SEEK_SET);char headchar[5];memset(headchar,0,5);int read_num = fread(headchar,1,4,fp);if(read_num!=4){fclose(fp);return 0;}if(strcmp(headchar,"DICM"))   {fclose(fp);printf("File is not DICM");return 0;}while(ftell(fp)+6<file_length){TagValue tag;unsigned int len;memset(VR,0,3);fread(&tag,sizeof(TagValue),1,fp);int index=ftell(fp);if(tag.tag1==0x02){fread(VR,1,2,fp);if(!strcmp(VR,"OB")||!strcmp(VR,"OW")||!strcmp(VR,"SQ")){fseek(fp,2,SEEK_CUR);fread(&len,sizeof(unsigned int),1,fp);}else{unsigned short l;int ss = fread(&l,sizeof(unsigned short),1,fp);int a=ftell(fp);len =(unsigned int)l ;}}else if(tag.tag1==0xfffe){if(tag.tag2==0xe000||tag.tag2==0xe00d||tag.tag2==0xe0dd){fread(&len,sizeof(unsigned int),1,fp);}}else if(isVR==true){fread(VR,1,2,fp);int a= ftell(fp);if(!strcmp(VR,"OB")||!strcmp(VR,"OW")||!strcmp(VR,"SQ")){fseek(fp,2,SEEK_CUR);fread(&len,sizeof(unsigned int),1,fp);}else{unsigned short l;l=sizeof(unsigned short);fread(&l,sizeof(unsigned short),1,fp);a= ftell(fp);len =(unsigned int)l ;}}else if(isVR==false){fread(&len,sizeof(unsigned int),1,fp);}if(tag.tag1==0x02&&tag.tag2==0x10){char msg[124];memset(msg,0,124);fread(msg,1,len,fp);if(!strcmp(msg,"1.2.840.10008.1.2.1")){isLitteEndian=true;isVR=true;}else if(!strcmp(msg,"1.2.840.10008.1.2.2")){isLitteEndian=false;isVR=true;}else if(!strcmp(msg,"1.2.840.10008.1.2")){isLitteEndian=true;isVR=false;}}else if(tag.tag1 ==0x28 && tag.tag2==0x103){unsigned short m;fread(&m,sizeof(unsigned short),1,fp);if(m==0){pixelType = ESourcePixelType_U16;}else if(m ==1){pixelType = ESourcePixelType_U16;}}else if(tag.tag1==0x7fe0&&tag.tag2==0x10){pixDataLen=len;pixDataOffset=ftell(fp);fseek(fp,len,SEEK_CUR);}else if(tag.tag1==0x28&&tag.tag2==0x10){fread(&rows,sizeof(unsigned short),1,fp);}else if(tag.tag1==0x28&&tag.tag2==0x11){fread(&cols,sizeof(unsigned short),1,fp);}else if(tag.tag1==0x28&&tag.tag2==0x02){fread(&channle,sizeof(unsigned short),1,fp);}else if(tag.tag1==0x28&&tag.tag2==0x101){fread(&validLen,sizeof(unsigned short),1,fp);}else if(tag.tag1==0x28&&tag.tag2==0x100){fread(&dataLen,sizeof(unsigned short),1,fp);}else if(tag.tag1==0x28&&tag.tag2==0x1050){char msg[11];memset(msg,0,11);fread(msg,1,len,fp);windowsCenter=atoi(msg);}else if(tag.tag1==0x28,tag.tag2==0x1051){//fseek(fp,len,SEEK_CUR);char msg[40];memset(msg,0,40);fread(msg,1,len,fp);windowsWidth=atoi(msg);}else if(tag.tag1==0x0028&&tag.tag2==0x0004){char msg[40];memset(msg,0,40);fread(msg,1,len,fp);if(!strcmp(msg,"MONOCHROME1 ")){ZeroIsBlack=false;}else if(!strcmp(msg,"MONOCHROME2 ")){ZeroIsBlack=true;}}else if(tag.tag1==0x0028&&tag.tag2==0x1052){char msg[40];memset(msg,0,40);fread(msg,1,len,fp);RescaleIntercept=atof(msg);}else if(tag.tag1==0x0028&&tag.tag2==0x1053){char msg[40];memset(msg,0,40);fread(msg,1,len,fp);RescaleSlope =atof(msg);}else{char msg[1024];memset(msg,0,1024);fread(msg,1,len,fp);}}fseek(fp,pixDataOffset,SEEK_SET);if(windowsCenter==0&&windowsWidth==0){windowsWidth = 1 << validLen;windowsCenter = windowsWidth / 2;}int min_value,max_value;min_value=windowsCenter-windowsWidth/2.0+0.5;max_value=windowsCenter+windowsWidth/2.0+0.5;double pers = 255.0/(max_value-min_value);  Mat src;    Mat src2;int nPixel= 0;double fCtA = 0; double fCtB = 0;fCtA = (double)256 /windowsWidth;fCtB = 128 - 256 * (double)windowsCenter / windowsWidth;if (fCtB < 0){fCtB = 0;}if (fCtB > 255){fCtB = 255;}if(channle==1){src.create((int)rows,(int)cols,CV_8UC1);src2.create((int)rows,(int)cols, CV_16SC1);for (int i = 0;i<rows;i++){for(int j=0;j<cols;j++){unsigned short   gray=0;short gray2 = 0;unsigned char pix[2];fread(pix,1,2,fp);if(pixelType == ESourcePixelType_U16){if(validLen<=8){if(isLitteEndian){gray=pix[0];}else   {gray=pix[1];}}else {long temp = 0;if(isLitteEndian){gray=*(unsigned short*)pix;if(gray > 32767){gray = 32767;}temp =gray*RescaleSlope+RescaleIntercept;temp = temp * fCtA + fCtB;}else{gray=pix[1]+pix[0]*256;}int nValue = (int)temp;if(nValue>0xff){nValue=0xff;}else if(nValue<0){nValue=0;}nPixel = nValue;}}else if(pixelType ==ESourcePixelType_I16){if(validLen<=8){if(isLitteEndian)   {gray2=pix[0];}else   {gray2=pix[1];}}else {long temp = 0;if(isLitteEndian){gray2=*(short*)pix;if(gray2 > 32767){gray2 = 32767;}if(gray2 < -32767){gray2 = -32767;}temp =gray2*RescaleSlope+RescaleIntercept;temp = temp * fCtA + fCtB;}else{gray2=pix[1]+pix[0]*256;}int nValue = (int)temp;if(nValue>0xff){nValue=0xff;}else if(nValue<0){nValue=0;}nPixel = nValue;}}       if(!ZeroIsBlack){nPixel=255-nPixel;}src.at<uchar>(i,j)=nPixel;}std::cout<<std::endl;}}else if(channle==3){src.create((int)rows,(int)cols,CV_8UC3);for (int i = 0;i<rows;i++){for(int j=0;j<cols;j++){unsigned char pix[3];fread(pix,1,3,fp);src.at<Vec3b>(i,j)[0]=pix[2];src.at<Vec3b>(i,j)[1]=pix[1];src.at<Vec3b>(i,j)[2]=pix[0];}}}imwrite("D:\\src.bmp", src);  fclose(fp);imshow("src",src);waitKey(0);return 0;
}

转载于:https://blog.csdn.net/sinat_33514750/article/details/104923531

DICOM医学图像格式转换的C++实现 DIOCM转 BMP、读取DICOM图像(转载)相关推荐

  1. python 图像格式转换文件夹下 jpg 转 bmp | 目录遍历

    python 图像格式转换文件夹下 jpg 转 bmp import os from PIL import Imagedef jpgToBmp(imgFile):dst_dir = "/ho ...

  2. php pacs,DICOM医学图像处理:WEB PACS初谈四,PHP DICOM Class – 只要踏出一步,路就在前方——zssure – CSDN博客...

    背景: 预告了好久的几篇专栏博文一直没有整理好,主要原因是早前希望搭建的WML服务器计划遇到了问题.起初以为参照DCMTK的官方文档wwwapp.txt结合前两天搭建的WAMP服务器可以顺利的实现WM ...

  3. 【办公基本软件】万彩办公大师教程丨DICOM图片批量转换工具

    关于万彩办公大师的DICOM图片批量转换工具 一款针对医学图像格式转换的工具.一键导入dicom/dcm格式图片,将医学CT图片,MRI图片快速转换成普通格式PNG图片.启动该程序时,以下主界面将显示 ...

  4. DICOM医学图像处理:二零一四▪DICOM专栏一览

    题记 二零一四刚过,新年伊始就发生了"外滩踩踏"恶性事件,告诫我们要珍爱生命,为自己更为家人-- 回顾去年,有些许收获.有些许感慨-- 曾经听过一个段子说两个在公司工作多年的老员工 ...

  5. DICOM医学图像处理:DICOM存储操作之“多幅BMP图像数据存入DCM文件”

    背景: 本专栏"DICOM医学图像处理"受众较窄,起初只想作为自己学习积累和工作经验的简单整理.前几天无聊浏览了一下,发现阅读量两极化严重,主要集中在"关于BMP(JPG ...

  6. DICOM医学影像协议

    DICOM医学影像协议 DICOM是什么意思? DICOM(Digital Imaging and Communications in Medicine)即医学数字成像和通信,是医学图像和相关信息的国 ...

  7. 使用python(pydicom)读取Dicom文件并且转换成png

    这篇主要讲怎么处理dicom格式的医学影像文件,并且转换成png,这样利于我们对图像进行处理. pydicom 目前取代了17年前的dicom库,更加的便捷 导入需要的模块,如果没安装,都可以用pip ...

  8. DICOM医学图像处理:Dcmtk与fo-dicom保存文件的不同设计模式之“同步VS异步”+“单线程VS多线程”...

    2019独角兽企业重金招聘Python工程师标准>>> 一.背景: 最近一直在做DCM相关的编程工作,以前项目使用C++居多,所以使用DCMTK开源库,而目前团队使用C#居多,所以需 ...

  9. python image 转成字节_(推荐)谈谈Python生态圈图像格式转换问题:含实例解析

    今天为大家带来的内容是:(推荐)谈谈Python生态圈图像格式转换问题:含实例解析 天气冷了,码字手都不利索了!先哈一哈气,各位也要多穿衣服注意保暖哈.话不多说,就直接进入主题了. 在Python生态 ...

最新文章

  1. java qt jni_java JNI 实现原理 (二) Linux 下如何 load JNILibrary
  2. python常见数据存储 csv txt pickle
  3. PaddlePaddle训练营——公开课——AI核心技术掌握——第1章迈入现代人工智能的大门——深度学习的基础算法——反向传播算法简介
  4. 电脑上有一个程序一直在按向上_HUAWEI Matebook 九个超牛电脑快捷键
  5. WTM 3.5发布,VUE来了!
  6. java yeild_Java 中 Thread.yield() 方法详解
  7. 超级猫超级签名分发源码
  8. oracle存储过程无效字符_Oracle中无效存储过程的重新编译方法
  9. RAID简介[zz]
  10. 苏宁:国庆节首日 电器门店订单增长50%
  11. 【Scala】使用Scala程序实现WordCount--词频统计(代码)
  12. eclipse集成testng插件
  13. tomcat下面的starup.bat的作用
  14. matlab对多维数组转置,C++向matlab engine传递二维数组,互为转置
  15. python的语言风格(一)
  16. 32位/64位处理器:*char与*int的区别?不同类型的指针+1的区别?
  17. 20种银河科幻风格ps字体样式
  18. OutLook 2013 添加 USC gmail 邮箱 解决国内USC邮箱打不开
  19. Mysql orchestrator高可用
  20. 形参和实参的储存单元是否一致?

热门文章

  1. 基于JAVA视频点播系统设计与实现 开题报告
  2. 物联网和android有关系吗,基于Android平台的物联网网关有什么优势?
  3. 财务舞弊(本福特——KS验证)
  4. 成都七中2021级高考成绩查询,2021年成都各高中高考成绩排名及放榜最新消息
  5. 如何治好这quot;看见别人好就不幸…
  6. 嘉祥教育计算机老师,嘉·时光 嘉祥教师的一天
  7. 内存不能为“read - written”的修复方法
  8. TITAN Haptics推出捆绑了Immersion许可的下一代触觉马达
  9. 【UCIe】UCIe Standard 256B Flit for PCIe 6.0 vs. PCIe 6.0 Flit
  10. 在类树莓派的ARM开发板上组建大数据集群