在医生阅片确诊的过程中,当发线疑似病灶时在灰度显示下有时并不清晰,这时候就需要色彩增强效果来使灰度图像变为彩色图像. LUT可以简单的理解为0-255的颜色映射值,例如:彩虹编码,将其打包成LUT格式文件,在读取图像后载入LUT: //实例化文件处理对象并打开文件 DicomFile dicomFile = DicomFile.Open(@"C:\101\1.dcm"); //获取dicom图像对象 DicomImage dicomImage = new DicomImage(dico…
在医生实际使用过程中,对于有病灶的影像需要一些2D绘图操作,例如对于病灶的标记和测量, 这就牵涉到在WPF中的2D绘图操作技术,一般的思路是监听鼠标的按下和抬起以及运动轨迹,目前整理出的常用绘图和测量功能如下: 图形标记类:(测量类请参考本系列文章:绘图处理之测量工具) 功能 说明 选区 蚂蚁线选择框 线段 线段标记 折线 折线标记 圆形 空心圆形 矩形 空心矩形 多边形 空心多边形 箭头 指向作用 文本 文本标记 清除所有标记 清空单元格绘图对象 撤销上个标记 删除上一个绘图对象 在WPF中,…
1.定位线概念:某个方位的影像在另一个方向的影像上的投影相交线,例如横断面(从头到脚的方向)在矢状面(从左手到右手)上的影像投影面交线. 举个例子:右边的是MR(核磁共振)的某一帧切片,这是从头开始扫描,扫描到眼睛这个位置, 而左边图像是从左手到右手的扫描切片,那么右边图像的位置就恰好在左边图像的眼睛的位置,用红线标出的位置则为定位线, 一般用于医生参考病灶在矢状面.冠状面和横断面的具体方位. 2.检查设备示意图 在笛卡尔空间直角坐标系中,Y 右肩膀到左肩膀,X 后背到前胸,Z 足到头 3.算法…
1.平移,利用WPF中控件边距来控制位移: /// <summary> /// 平移图像 /// </summary> /// <param name="X">平移X轴距离</param> /// <param name="startX">X轴起始位置</param> /// <param name="Y">平移Y轴距离</param> /// <…
概念解释(网络资料): 窗宽: 窗宽指CT图像所显示的CT 值范围.在此CT值范围内的组织结构按其密度高低从白到黑分为16 个灰阶以供观察对比.例如,窗宽选定为100 Hu ,则人眼可分辨的CT值为100 / 16 =6 . 25 Hu ,即2 种组织CT值相差在6 . 25Hu以上者即可为人眼所识别.因此,窗宽的宽窄直接影响图像的清晰度与对比度.如果使用窄的窗宽,则显示的CT 值范围小,每一灰阶代表的CT 值幅度小,对比度强,适于观察密度接近的组织结构(如脑组织).反之,如果使用宽的窗宽,则显…
在XAML代码设计器中,添加canvas画布与圆形几何对象,利用VisualBrush笔刷来复制画面内容到指定容器: <Canvas x:Name="CvsGlass" Width="106" Height="106" HorizontalAlignment="Left" VerticalAlignment="Top" MouseWheel="CvsGlass_MouseWheel"…
通俗点说,挂片协议可以看作整个系统的一个相对复杂一点的配置文件,可以用JSON或XML格式来读取与保存, 另外,可以制作一个独立的exe配置程序来管理这些挂片协议. 假设配置了CT的挂片协议的右键菜单,那么在打开CT影像时则是对应的不同的动态的右键菜单,如下图: CT影像的自定义工具栏,如下图: CT影像的自定义窗宽窗位,如下图: 协议格式可以参考XML格式: <?xml version="1.0" encoding="utf-8"?> <Moda…
在菜单栏布局上,为了使用自定义窗体样式和按钮,我们需要先将窗体设置为无边框,然后添加一个Grid作为菜单栏并置顶,VerticalAlignment="Top" logo图片和标题是Image和TextBlock控件,菜单是Menu控件,系统按钮是Button控件. 其中需要注意的是,一般医院影像科或放射科阅片采用的是双屏,横屏+竖屏,而PACS一般是在竖屏上显示, 当最大化窗体时,如果不进行特殊处理,则会在横屏上最大化,而我们的要求是在竖屏上最大化, 所以需要监听最大化按钮的点击事件…
工具栏布局采用WPF中Grid作为容器,按钮采用自定义样式和图标,并采用Separator分割线: XAML设计器代码: 其中  Style="{StaticResource ButtonStyle}"  按钮样式可以根据自身UI风格来使用自定义样式 <Button x:Name="BtnRotate" Margin="5,0,0,0" Style="{StaticResource ButtonStyle}" Horiz…
对于一款软件的扩展性和维护性来说,上层业务逻辑和UI表现一定要自己开发才有控制权,否则项目上线之后容易被掣肘, 而底层图像处理,我们不需要重复造轮子,这里推荐使用fo-dicom,同样基于Dicom3.0协议. 根据以上原则,后台影像处理完成之后,即可使用自己开发的控件来呈现. 1.先准备好自己的dcm文件,可以是单个文件或序列文件或DicomDir文件. 2.在VS编辑器里打开NUGET搜索fo-dicoman安装即可. 3.使用fo-dicom读取影像. //将图像处理模式设置为全局WPF模…
接上一篇文章,当我们可以绘制图形标记后,就可以在此操作类上面进行扩展, 比如测量类工具,目前整理出的常用绘图和测量功能如下: 测量工具类:(图形标记类请参考本系列文章:绘图处理之图形标记) 功能 说明 标尺 线段长度测量 折尺 曲线长度测量  心胸比 两根线段按比例测量  交叉尺 两根线段互相垂直测量  Cobb角 两根线段的垂线交点角度测量,一般用于脊柱曲率  开角 两根线段的延长交点的角度测量 T型尺 两根线段相交的任意角度摇摆测量和长度测量 角度测量 角度测量  圆形测量 圆形或椭圆面积测…
1.任意角度旋转 在XAML设计器中,设置RotateTransform属性 <InkCanvas x:Name="ToolInkCanvas" UseCustomCursor="True" ClipToBounds="False" MinHeight="50" MinWidth="50" EditingMode="None" Background="{x:Null}&q…
本系列文章将从以下模块和大家分享和讨论使用C#开发医学软件PACS和RIS系统, 国内相关资料比较少,也借此机会丰富一下医学软件开发生态,讨论技术难点,希望大家互相帮助共同进步. 章节介绍及截图预览: (一)PACS客户端:客户端功能和相关医学知识 部分功能菜单: (二)PACS三维:MRP.MIP.VR (三)PACS网页端:开发Web版本的PACS (四)PACS移动端:基于HTML5 (五)PACS服务端:架构.收图.归档 (六)PACS与RIS系统的通信与集成 (七)视频特效教程:使用A…
1.先看结构: 创建WPF用户控件:YourTab 创建WPF用户控件:YourItem 创建选项卡时循环添加item,并设置序列缩略图到控件和异步下载的进度条, 1个病人1个或多个Study检查,1个Study检查1个选项卡,并为每个选项卡添加自定义关闭按钮 Tab自定义关闭按钮的XAML样式如下: <Style TargetType="{x:Type TabItem}"> <Setter Property="Template"> <…
很久没有更新dapr系列了.今天带来的是一个小的组件集成,通过多级缓存框架来实现对服务的缓存保护,依旧是一个简易的演示以及对其设计原理思路的讲解,欢迎大家转发留言和star 目录:一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr实现一个简单的基于.net的微服务电商系统(二)--通讯框架讲解 三.通过Dapr实现一个简单的基于.net的微服务电商系统(三)--一步一步教你如何撸Dapr 四.通过Dapr实现一个简单的基于.net的微服务电商系统(四)--一步一步教你如…
前面介绍了JavaFX标签控件的用法,其中提到Label文本支持中文字体,那么它到底支持哪些中文字体呢?自然要看当前的操作系统都安装了哪些字体才行,对于中文的Windows系统,默认安装了黑体“SimHei”.宋体“NSimSun”.仿宋“FangSong”与楷体“KaiTi”.在AWT与Swing的体系中,Font工具支持填入中文字体的名称:但在JavaFX编程之中,Font工具则要填写中文字体的拼音.除了这四种基础字体以外,只要系统安装了中文Office,则还会增加下述的中文字体,这些字体也…
VTK简介: VTK是一个开源的免费软件系统,主要用于三维计算机图形学.图像处理和可视化.Vtk是在面向对象原理的基础上设计和实现的,它的内核是用C++构建的. 因为使用C#语言开发,而VTK是C++的,所以推荐使用VTK的.Net开发库:ActiViz. 本系列文章主要以技术和代码讲解为主,ActiViz的安装和环境配置可以参考: ActiViz(VTK的C#库)学习使用心得之二:Activiz.NET的下载和安装 官网资料:https://www.kitware.eu/product/act…
一.转盘(裁剪图片.自定义按钮.旋转) 1.裁剪图片 将一张大图片裁剪为多张 // CGImageCreateWithImageInRect:用来裁剪图片 // image:需要裁剪的图片 // rect:裁剪图片的尺寸,传递是像素 CGImageRef norImage = CGImageCreateWithImageInRect(norBigImage.CGImage, clipRect); 2.每次点击按钮立马变为选中状态,并且取消上次的按钮的选中状态 只要用个成员变量记录下状态就 ok…
创建并启动连接器实例之后,连接器就会基于Http协议向指定的数据接收服务器发送xmlfeed格式数据,我们可以通过配置http代理服务器抓取当前基于http协议格式的数据(或者也可以通过其他网络抓包工具抓取) // 设置代理 /Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("IP地址", "端口")); synchronized (this) { uc = (HttpURLConnect…
前面介绍了通过JDBC如何管理数据库,当时提到Statement专门提供了executeQuery方法用于查询操作,为什么查询操作这么特殊呢?这是因为其它语句跑完一次就了事了,顶多像insert.update.delete再返回受影响的记录数量,但select命令跟它们不一样,查询语句可能会返回多条记录,每条记录又包含多个字段.似此多条记录多个字段的情景,返回值无论定义为哪种类型都不太好办,故而干脆给个单独的executeQuery方法,该方法的返回值也设置成专属的ResultSet类型,表示查…
前面介绍了如何通过AWT显示程序的窗口界面,那么要怎样在该窗口上面添加丰富多样的控件呢?注意Frame类是个窗口工具,它由窗楣(标题栏)与窗体(窗口主界面)两部分组成,故而Frame类只对整个窗口统筹规划,本身并不能直接添加各类控件.实际的控件管理操作交给了专门的Panel面板工具,由面板接管窗口主界面,在面板上添加和删除控件,Frame对象只需调用add方法把面板添加到窗口即可.接下来以常见的按钮控件为例,演示一下如何在面板上添加按钮.进而在窗口界面显示按钮的过程.按钮控件名叫Button,按…
前面提过,AWT没提供能够直接显示图像的控件,这无疑是个令人诟病的短板,因为一上来就得由程序员自己去定义新控件,对于初学者来讲很不友好.这个问题在Swing中也解决掉了,不过Swing并未提供单独的图像视图,而是利用标签控件JLabel来显示图像.JLabel的setText方法用来设置标签上的文本,而setIcon方法用来设置标签上的图标,根据两个方法的调用与否状况,标签所展示的内容可分为下列三种情况:1.只调用setText方法,未调用setIcon方法,此时标签只显示文本.2.只调用set…
Ajax技术 Ajax = 异步 JavaScript 和 XML. Ajax 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. 1.jQuery的load()方法 jQuery load()方法是简单但强大的AJAX方法. load()方法从服务器加载数据,并把返回的数据放入被选元素中. 语法: $("selector").load(url,data,callback); 1.必须的url参数规定记载的url地址 2.可选的data参数规定与请求一同发送的查询字符串键/…
当我们将CT切片重建为三维体之后,通常会消除一些不必要的外部组织来观察内部病灶, 一般思路是根据人体常见CT值范围来使得部分组织透明来达到效果, 但这是非黑即白的,即,要么显示皮肤,要么显示神经,要么显示骨骼- 然而,当病灶介于两个CT值范围中间或重合时,要观察病灶这将是一个非常困难的工作,需要手动旋转.切割等一系列操作, 严重降低判断准确性和工作效率,故此采用梯度透明思想来展现渐变过程. 准备一张人体CT值范围表参考: 当我们对三维体使用鼠标操作时,将CT值从最小值到最大值映射到三维体上面,并…
在之前的系列文章中聊过分布式事务的一种实现方案,即通过在集群中暴露actor服务来实现分布式事务的本地原子化.但是actor服务本身有其特殊性,场景上并不通用.所以今天来讲讲分布式事务实现方案之saga模式,并在文后附上代码供各位读者参考,评论. 目录:一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr实现一个简单的基于.net的微服务电商系统(二)--通讯框架讲解 三.通过Dapr实现一个简单的基于.net的微服务电商系统(三)--一步一步教你如何撸Dapr 四.通过…
连接器是基于http协议通过推模式(push)向数据接收服务端推送数据,即xmlfeed格式数据(xml格式),其发送数据接口命名为Pusher Pusher接口定义了与发送数据相关的方法 public interface Pusher { /** * Status indicating the readiness of the Pusher. */ public static enum PusherStatus { OK, LOW_MEMORY, LOCAL_FEED_BACKLOG, GSA…
Android进阶(十八)AndroidAPP开发问题汇总(二) 端口被占用解决措施: Android使用SimpleAdapter更新ListView里面的Drawable元素: http://www.cnblogs.com/thu539/archive/2012/02/01/2334455.html Android中Bitmap,byte[],Drawable相互转化: http://www.cnblogs.com/fighter/archive/2012/02/20/android-bit…
子曰:工欲善其事,必先利其器.我们要把显卡作为通用并行处理器来做并行算法处理,就得知道CUDA给我提供了什么样的接口,就得了解CUDA作为通用高性能计算平台上的一十八般武器.(如果你想自己开发驱动,自己写开发库- -那我不得不佩服你很有时间,想必也不会有很多人想自己在去实现一个CUDA吧,呵呵,虽然实现一个也不是太难).前面我们讲到了一些简单的CUDA的C语言扩展的规则,下面就具体来讲解CUDA给我听哦买提供了多少方便的API函数.在开发CUDA的时候,CDUA也给我们提供了一套完整的API函数…
一个EventLoopGroup当中会包含一个或多个EventLoop. 一个EventLoop在它的整个生命周期当中都只会与唯一一个Thread进行绑定. 所有由EventLoop所处理的各种I/O事件都将在它所关联的那个Thread上进行处理. 一个Channel在它的整个生命周期中只会注册在一个EventLoop上. 一个EventLoop在运行过程中,会被分配给一个或多个Channel. 同一个Channel提交的任务执行顺序和提交顺序是一样的(先进去的先出来,任务队列). 重要结论:在…
之前有很多同学提到如何做容器调试,特别是k8s环境下的容器调试,今天就讲讲我是如何调试的.大家都知道在vs自带的创建项目模板里勾选docker即可通过F5启动docker容器调试.但是对于启动在k8s则不是那么清楚.其实两者原理上是一样的. 目录:一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr实现一个简单的基于.net的微服务电商系统(二)--通讯框架讲解 三.通过Dapr实现一个简单的基于.net的微服务电商系统(三)--一步一步教你如何撸Dapr 四.通过Dap…