【转】DELPHI 对DICOM中的窗宽、窗位调整

在写这篇文章前72小时,我的多窗显示组件对于个别大W/C值的16位影像显示还是个问题,也发了帖子到PACS站询问过,更是在Google上猫刨了很久,终归一无所获,今天静下心来,用了2小时反复查看程序处理过程,对比数据,居然就这么搞定了,原来如此简单,哎,困惑了3天,把答案公布了,也算是助人为乐(中国地大物博,人心应宽广无量)


对16位的影像,要判断DICOM中最大像素值(0028,0107)大于65534,是则将16位影像数据的像素值大于等于0的全部减去65535,小于0的全部加上65535,然后在window-level的方法中将pixel_val按word取值(word是无符号类型,相当于取绝对值)进行判断,然后赋值即可(CT影像不能用word类型取值和赋值),就这么简单,以下是关键代码,祝你愉快!!!

 

procedure DCM_GetWidAndCenBySmallint(var DICOMDATA: TDICOMDATA; var Buffer: SMallIntp0);
var
  Value, Size, i: integer;
  min16, max16: integer;
begin
  Size := DICOMDATA.ImageColumns * DICOMDATA.ImageRows;

  Value := Buffer[0];
  max16 := Value;
  min16 := Value;
  i := 0;
  while i < Size do begin
    Value := Buffer;
    if Value < min16 then min16 := Value;
    if Value > max16 then max16 := Value;
    i := i + 1;
  end;

  if DICOMDATA.MaxIntensity = 0 then DICOMDATA.MaxIntensity := max16;

  if (DICOMDATA.MaxIntensity > 65534) then begin//这里对高CT值的数据进行处理
    i := 0;
    while i < (Size) do begin
      if Buffer >= 0 then
        Buffer := Buffer - 65535
      else
        Buffer := 65535 + Buffer;
      i := i + 1;
    end;
  end;

  DICOMDATA.WinCen := round(DICOMDATA.WindowCenter);
  DICOMDATA.WinWid := round(DICOMDATA.WindowWidth);
  DICOMDATA.ImgMin := min16;
  DICOMDATA.ImgMax := max16;
  DICOMDATA.ImgWid := DICOMDATA.ImgMax - DICOMDATA.ImgMin;
  DICOMDATA.ImgCen := DICOMDATA.ImgMin + ((DICOMDATA.ImgWid) shr 1);
  if DICOMDATA.WindowWidth <= 0 then begin
    DICOMDATA.WinCen := DICOMDATA.ImgCen;
    DICOMDATA.WinWid := DICOMDATA.ImgWid;
    DICOMDATA.WindowCenter := DICOMDATA.ImgCen;
    DICOMDATA.WindowWidth := DICOMDATA.ImgWid;
  end;
end;

procedure DCM_Scale16to8bit(var DICOMDATA: TDICOMDATA; var Buffer: SMallIntp0; var lOutBuff: pByteArray; DataLen: integer);
var
  Value, i, lScaleShl10, Size, lWid, lcen: integer;
  min16, max16: integer;
  PixelVal: integer;
  Modality_CT: boolean;
begin
  if Buffer = nil then exit;
  //影像是否是CT
  if (DICOMDATA.TransferSyntax = '1.2.840.10008.5.1.4.1.1.2') or (trim(DICOMDATA.Modality) = 'CT') then
    Modality_CT := true
  else
    Modality_CT := false;
  DICOMDATA.WinCen := round(DICOMDATA.WindowCenter);
  DICOMDATA.WinWid := round(DICOMDATA.WindowWidth);
  Size := DICOMDATA.ImageColumns * DICOMDATA.ImageRows;
  lcen := round((round(DICOMDATA.WindowCenter) - DICOMDATA.IntenIntercept) / DICOMDATA.IntenScale); // 截距/斜率
  lWid := (trunc((round(DICOMDATA.WindowWidth) / DICOMDATA.IntenScale) / 2));


  min16 := lcen - lWid; //15za
  max16 := lcen + lWid; //15za

  getmem(lOutBuff, Size);
  Size := Size - 1;
  Value := (max16 - min16);
  if (Value = 0) or (trunc((1024 / Value) * 255) = 0) then begin
    if DICOMDATA.WinWid > 1024 then begin
      for i := 0 to Size do
        lOutBuff := 128;
    end else begin
      for i := 0 to Size do
        if Buffer < DICOMDATA.WinCen then
          lOutBuff := 0
        else
          lOutBuff := 255;
    end;
  end else begin
    if Value = 0 then Value := 1;
    lScaleShl10 := trunc((1024 / Value) * 255); //value = range,Scale = 255/range
    for i := 0 to Size do begin
      //除CT外,其余的全部取正值
      if Modality_CT then begin
        if (Buffer) < min16 then
          lOutBuff := 0
        else if (Buffer) > max16 then
          lOutBuff := 255
        else
          lOutBuff := (((Buffer) - min16) * lScaleShl10) shr 10;
      end else begin //非CT
        if word(Buffer) < min16 then
          lOutBuff := 0
        else if word(Buffer) > max16 then
          lOutBuff := 255
        else
          lOutBuff := ((word(Buffer) - min16) * lScaleShl10) shr 10;
      end; 
    end;
  end;
  DICOMDATA.BitsStored := 8; //转换为8位
end;
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436373.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【转】解密Qt安装目录的结构

转自&#xff1a;C语言中文网 强力推荐 网址&#xff1a;http://c.biancheng.net/view/3866.html 了解 Qt 安装目录的结构虽然不是编程必须的&#xff0c;但是它能练就我们的内功&#xff0c;让我们对 Qt 的编程环境了如指掌。Windows 和 Linux 下 Qt 安装目录的结构非常相似…

大话WinCE与WinXP应用程序开发的差异性

// //TITLE: // 大话WinCE与WinXP应用程序开发的差异性 //AUTHOR: // norains //DATE: // Wednesday 21-April-2010 //Environment: // Windows CE 5.0 // Windows XP // "龙生龙&#xff0c;凤生凤&#xff0c;老鼠生的儿子会打洞"&#xff0c;所以无…

WinCE驱动的动态卸载

// //TITLE: // WinCE驱动的动态卸载 //AUTHOR: // norains //DATE: // Wednesday 21-April-2010 //Environment: // Windows CE 5.0 // 在之前的一篇《WinCE驱动的动态加载》(http://blog.csdn.net/norains/archive/2010/02/22/5316923.aspx)中有谈到&#xff0c;…

【转】09.认识一下Qt用到的开发工具

Qt 不是凭空产生的&#xff0c;它是基于现有工具链打造而成的&#xff0c;它所使用的编译器、链接器、调试器等都不是自己的&#xff0c;Qt 官方只是开发了上层工具。下面我们分几个部分讲解 Qt 使用到的工具链。 GNU 工具集 在上个世纪八十年代&#xff0c;计算机都是奢侈品…

冒个泡

好久没有上来了。也没有什么好说的。最近在做基于SVG开发的一个实时监测系统&#xff0c;感觉目前SVG性能还不是太好&#xff0c;客户端CPU不经意间就达到80%以上了。向老板提出辞职&#xff0c;不过老板没有同意&#xff0c;最终协商结果再做三个月&#xff0c;直到新人完全接…

发一个自己写的2440驱动1602的资料(电路+代码)

上个星期把MINI2440板上的富余数据线引了出来&#xff0c;看着以前丢下的1602突然有了想用ARM9驱动它的冲动&#xff0c;于是就开始干了。 代码是从以前刚学C51的时候改的&#xff0c;呵呵&#xff0c;看见以前写的代码真觉得很烂&#xff0c;现在已经整理好了。 虽说有点牛刀…

【转】10.Qt编程涉及的术语和名词

本节我们来介绍一下使用 Qt 编程过程中常用的术语和名字&#xff0c;它们不一定专属于 Qt&#xff0c;在其它的 C/C 开发过程中也会使用到。 Project Project 的中文翻译是“项目”或者“工程”&#xff0c;这里的项目是指为实现某个相对独立功能的程序代码合集&#xff0c;这…

VS2005开发WinCE6.0应用程序 更换SDK后工程的移植

在应用VS2005开发嵌入式应用程序的时候&#xff0c;一旦平台的SDK发生改变&#xff0c;原先的应用程序就打不开了。搞的偶是非常郁闷&#xff0c;一旦添加了或者更改了驱动程序&#xff0c;重新导出平台SDK以后都要重新建工程&#xff0c;再把代码拷贝到新的工程中&#xff0c;…

【转】17.Qt界面布局管理详解

在上一节&#xff0c;通过一个简单的应用程序&#xff0c;分析了 Qt 创建的 GUI 应用程序中各个文件的作用&#xff0c;剖析了可视化设计的UI文件是如何被转换为 C 的类定义&#xff0c;并自动创建界面的。这些是使用 Qt Creator 可视化设计用户界面&#xff0c;并使各个部分融…

SQL Server 清空或删除所有数据库表中的数据

方法一&#xff1a; --生成数据库脚本的方法最快,处理的也最好 sql2000企业管理器 --右键要清理的数据库 --所有任务 --生成SQL脚本 --<常规>里选择"生成全部对象脚本"","在脚本文件中包含说明性标题&quo…

linux mysql移植_linux 下mysql 移植设置方法

环境:db01:10.10.10.101db03:10.10.10.103需求:将db01上mysql做完整移植,迁移到db03详细步骤:1. 打包db01上/app目录并scp到db03上:#tar -cvzf mysql.tar.gz /app/;scp mysql.tar.gz 10.10.10.103:/root/2. copy db01上/etc/ld.so.conf.d/mysql.conf到db03相应目录下,即/etc/ld…

【转】18.Qt信号与槽机制详解

信号&#xff1a;事件 槽&#xff1a;事件处理函数 信号与槽&#xff08;Signal & Slot&#xff09;是 Qt 编程的基础&#xff0c;也是 Qt 的一大创新。因为有了信号与槽的编程机制&#xff0c;在 Qt 中处理界面各个组件的交互操作时变得更加直观和简单。 信号&#xff0…

可以买的一本书:3D计算机图形学(原书第3版)

作  者&#xff08;英&#xff09;沃特&#xff08;Watt,A.) ,包宏 译出 版 社机械工业出版社图书定价&#xffe5;69.00 第1章 计算机图形学的数学基础 11.1 处理三维结构 11.1.1 计算机图形学中的三维仿射变换 11.1.2 改变坐标系的变换 61.2 结构变形变换 71.3 向量和计算机…

网站中毒

刚做了一个网站2008-应届生-校园招聘信息博客 购买了虚拟空间&#xff0c;可是发布没几天就发现中毒了打开网站首页&#xff0c;查看源文件&#xff0c;发现页面头部被加了一段代码 下载有关的文件并没有这行代码&#xff1f;不知道为什么&#xff1f;这段代码到底加到哪里了呢…

程序员找工作那点事儿

从7月中旬回武汉之后开始系统的复习&#xff0c;到9月下旬正式开始找工作&#xff0c;最后到10月中旬结束&#xff0c;前后历时三个月&#xff0c;从前期的职业定位&#xff0c;到中期的复习准备&#xff0c;最后到后期真枪实弹的笔试面试&#xff0c;个人感觉找工作就是个系统…

【转】QT介绍

一、Qt介绍 Qt&#xff0c;坦白来说&#xff0c;并不只是一个界面库&#xff0c;他是C编程思想的集大成者。它是一个经过完善的C应用程序框架。使用Qt&#xff0c;在一定程度上你获得的是一个“一站式”、“全方位”的解决方案&#xff0c;STL、string、XML、数据库、网络这些…

mysql函数未定义_未定义的函数,MYSQL错误

提交以下表单时&#xff0c;我收到此错误&#xff1a;Fatal error: Call to undefined function mysqli_connect() in .... mailing_list_include.php on line 7这里是mailing_list_include.php文件 - 真正的东西包括访问数据库的正确凭据function doDB() {global $mysqli;// c…

简单的实现RAII封装。

简单的实现RAII封装。前面的文章中介绍了通过RAII的技术实现保证资源被释放和某函数被执行的类似finally关键字的功能。并演示了一个通过boost的function和bind的两个库实现的通用RAII封装类。 那个例子固然通用而有效&#xff0c;然而&#xff0c;我们有时项目中并没有用到boo…

二叉树序列化

文件的大小尽可能的小。 想了四种方法&#xff1a; 第一种方法&#xff1a;把二叉树按前序和中序遍历一遍&#xff0c;存两次二叉树。 第二种方法&#xff1a;将二叉树按左枝为0&#xff0c;右枝为1进行路径编码&#xff0c;那么每个节点都可以表示成&#xff0c;节点信息和路径…

【转】OWIN是什么?

OWIN的英文全称是Open Web Interface for .NET。 如果仅从名称上解析&#xff0c;可以得出这样的信息&#xff1a;OWIN是针对.NET平台的开放Web接口。 那Web接口是谁和谁之间的接口呢&#xff1f;是Web应用程序与Web服务器之间的接口&#xff0c;OWIN就是.NET Web应用程序与W…