前言:本程序是我去年实现论文算法时所做。主要功能为标记切割肝脏区域。时间有点久,很多细节已经模糊加上代码做了很多注释,因此在博客中不再详述。

NOTE: 程序分几大段功能模块,仔细阅读,对解决医学图像还是有一定的借鉴意义

想借鉴本文的一定要仔细阅读代码和注释,中间有人机交互部分,空跑会抛异常

.dcm数据,我放到了我的百度云盘,有兴趣的可以下载,实测一下代码。dcm数据连接

  1. clc,clear
  2. img_1=dicomread('10011.dcm');%读取dcm文件 (所谓的灰度值)
  3. metadata=dicominfo('10011.dcm');%获取dcm文件的信息
  4. % figure
  5. % imagesc(img_1);
  6. % imshow(uint8(img_1));
  7. Hu0=(int16(img_1)*1+(-1024));
  8. %文档中的第二步,转为CT值的那个。
  9. %% 窗宽窗位设置:c 窗位 w 窗宽 这个是按照你给的公式写的
  10. Hu=double(Hu0);%此时有正负。转双精度的CT值。
  11. gm=255;
  12. c=60;
  13. w=100;
  14. Gv=0.*(Hu<c-w/2)+(gm/w)*(Hu+(w/2)-c).*(c-w/2<=Hu&Hu<=c+w/2)+gm.*(Hu>c+w/2);%Gv为显示灰度。
  15. figure
  16. imshow(uint8(Gv));
  17. title('加窗')
  18. %% 一次CTRL+T
  19. %% 拉普拉斯高斯滤波 (有库函数) %这个是整体区域。
  20. img_gray=uint8(Gv);
  21. hsize=10;%滤波模板大小。自己可以修改
  22. sigma=0.4; %滤波系数sigma 自己修改会得到不同的效果图
  23. h = fspecial('log', hsize, sigma); %构造拉普拉斯_高斯滤波器,'log'是这个滤波器的标志
  24. img_filter0=double(imfilter(Hu0, h)); %调用matlab中的imfilter函数 ,进行滤波。其中img_gray为要过滤的图像,h为滤波器。
  25. figure
  26. img_filter=uint8(img_filter0);
  27. imshow((img_filter));%显示图像
  28. title('拉普拉斯高斯滤波')
  29. %%
  30. %% 自作ROI区域 利用ginput函数标出点,然后包围所标区域。%%对滤波变换后进行抠图
  31. figure
  32. imshow(img_filter);%%此处为img_filter 就是对滤波后抠图,此处为img_gray就是对为滤波的灰度图进行抠图。
  33. title('加窗图抠图')
  34. hold on
  35. x=[];y=[];
  36. n=0;
  37. while(1)
  38. [xtemp,ytemp,button]=ginput(1);
  39. plot(xtemp,ytemp,'r*');
  40. x=[x xtemp];
  41. y=[y ytemp];
  42. n=n+1;
  43. % text(xtemp+0.1,ytemp,int2str(n));
  44. if(button==32) %button=32表示 当你点点完了。你就按空格,退出点点的状态。
  45. break
  46. end
  47. end
  48. line(x,y);%x y连线
  49. % hold off
  50. t=1:n;
  51. tt=1:0.1:n;
  52. xx=spline(t,x,tt); %因为手点 点数不够多,不够精确,需要插值 spline为插值函数
  53. yy=spline(t,y,tt);
  54. plot(xx,yy,'b:');
  55. BW = roipoly(img_filter,xx,yy); %roipoly为抠图函数。以img_filiter为基础。xx yy为轮廓。包围的区域扣出来
  56. figure, imshow(BW) %返回的是一个二值图像BW。就是一张黑白图。扣除的地方为1.其他地方均为0
  57. title('轮廓图')
  58. %% 下面返回 被扣的地方的图像。 就是图上只有被扣除的东西
  59. figure
  60. img_last=BW.*(double(img_filter));%原理是这样:BW 1 0的二值图,被扣的地方是兴趣区域都是1.这时
  61. %与原图像进行.* ,除了为1的地方返回灰度值*1,其他地方都返回灰度值*0
  62. img_last1=uint8(img_last);%转为uint8格式。不然显示不了
  63. img_last1(img_last1==0)=NaN;% 调整背景。
  64. % figure
  65. subplot(221)
  66. imshow(img_last1)%显示最后的图像
  67. title('轮廓返回图')
  68. %%
  69. %你需要的兴趣区域的数据如下: 。它的特点就是 兴趣区域为原图的CT值,非兴趣区域全是0matlab图像是矩阵。所以必须是规则的。
  70. %所以 要有0 来填充。
  71. final_CT=BW.*(Hu);%%你要是要用 最后的抠图的CT值。这个就是。
  72. %%论文中 有这么一句话:the mean gray-level intensity (m) and uniformity (u)
  73. %%指的是平均灰度强度和均一性。实质求的是ROI区域的灰度值,和灰度值的均一性;
  74. %% l是灰度值, p(l)是l灰度值出现的概率。
  75. %% 先给图像加窗 转为灰度值Gv——>拉普拉斯高斯滤波——>抠图——>求抠图地方的灰度平均值m、均一性值n
  76. %% 那个gui是演示用的。是在没滤波的基础上进行的抠图。没有关系。因为数据在这产生。
  77. %% img_last1 的最后数据。就是 抠出得图。周围用 0填充的。所以周围为黑色。
  78. [p,q]=size(img_last1);
  79. RGB=zeros(p,q);
  80. img_B=cat(3,RGB,RGB,img_last1);%实质就是讲RGB R=0G=0B=灰度值。下面类似。
  81. subplot(222)
  82. imshow(img_B);
  83. title('B')
  84. img_G=cat(3,RGB,img_last1,RGB);
  85. subplot(223)
  86. imshow(img_G);
  87. title('G')
  88. img_R=cat(3,img_last1,RGB,RGB);
  89. subplot(224)
  90. imshow(img_R);
  91. title('R')
  92. %% ROI 区域均值求取。 img_mean;
  93. img_sum=sum(img_last1(:));%求出所有元素总和。填充区域为0 。不影响。
  94. N=numel(find(BW==1));%BW中有1的地方 就是有灰度的地方。所以BW1 的多少,就是灰度的总数。
  95. img_mean=img_sum/N;

大致的结果图如下:







Matlab 高斯_拉普拉斯滤波器处理医学图像的更多相关文章

  1. MATLAB高斯混合数据的生成

    MATLAB高斯混合数据的生成 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 高斯混合模型的基本原理:聚类——GMM,MATLAB中GMM聚类算法:M ...

  2. matlab函数_连通区域

    1. matlab函数bwareaopen──删除小面积对象格式:BW2 = bwareaopen(BW,P,conn)作用:删除二值图像BW中面积小于P的对象,默认情况下使用8邻域.算法:(1)De ...

  3. matlab初学者_脚本文件调用函数文件

    问题: matlab里面有两种文件,一种是脚本文件,一种是函数文件,为了模块化程序,我们需要把专门的功能写成一个函数封装到某个函数文件里面. 那么来看如何在脚本文件里调用函数文件中的函数. 注意点: ...

  4. 【转】matlab函数_连通区域

    转载自einyboy的博文Matlab的regionprops详解 1. matlab函数bwareaopen──删除小面积对象格式:BW2 = bwareaopen(BW,P,conn)作用:删除二 ...

  5. matlab中实现Gabor滤波器

    1.spatialgabor.m描述gabor函数 % SPATIALGABOR - applies single oriented gabor filter to an image%% Usage: ...

  6. matlab高斯模板生成,K是归一化系数,上面是一个半径200的高斯模板用来做MSR

    R3=; F=zeros(*R3+,*R3+); sigma=R3/; r=; :*R3+     :*R3+         r=(x-R3)*(x-R3)+(y-R3)*(y-R3);       ...

  7. SSE图像算法优化系列二十八:深度优化局部拉普拉斯金字塔滤波器。

    基于局部拉普拉斯金字塔的Edge-aware滤波器是在2011年由Adobe 公司的研究员Sylvain Paris(大神级人物,写了很多文章)提出的,我在4年前曾经参考有关代码实现过这个算法,但是速 ...

  8. IIR滤波器软件实现(Matlab+C++)

    使用C++来写一个IIR滤波器 我们首先要在MATLAB中设计一个IIR滤波器,并生成一个头文件,这个头文件中反映了IIR滤波器的频率响应特性 理论支持 IIR滤波叫做递归滤波器,它是一种具有反馈的滤 ...

  9. MATLAB用“fitgmdist”函数拟合高斯混合模型(一维数据)

    MATLAB用“fitgmdist”函数拟合高斯混合模型(一维数据) 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 在MATLAB中“fitgmdis ...

随机推荐

  1. .Net Core MVC 网站开发(Ninesky) 2.4、添加栏目与异步方法

    在2.3中完成依赖注入后,这次主要实现栏目的添加功能.按照前面思路栏目有三种类型,常规栏目即可以添加子栏目也可以选择是否添加内容,内容又可以分文章或其他类型,所以还要添加一个模块功能.这次主要实现栏目 ...

  2. [翻译]开发文档:android Bitmap的高效使用

    内容概述 本文内容来自开发文档"Traning > Displaying Bitmaps Efficiently",包括大尺寸Bitmap的高效加载,图片的异步加载和数据缓存 ...

  3. 浅谈我对DDD领域驱动设计的理解

    从遇到问题开始 当人们要做一个软件系统时,一般总是因为遇到了什么问题,然后希望通过一个软件系统来解决. 比如,我是一家企业,然后我觉得我现在线下销售自己的产品还不够,我希望能够在线上也能销售自己的产品 ...

  4. rnandroid环境搭建

    react-native 环境搭建具体步骤这个大家已经玩烂了,这个主要是记录下来自己做win7系统遇到的坑 1.com.android.ddmlib.installexception 遇到这个问题,在 ...

  5. 【SQLServer】【恢复挂起的解决方案】附加文件时候的提示“无法重新生成日志,原因是数据库关闭时存在打开的事务/用户,该数据库没有检查点或者该数据库是只读的。 ”【数据库恢复】

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 先贴错误: 吐槽一下: 进入正题: 新建一个同名数据库 停止MSSQL服务 替换数据库文 ...

  6. JAVA问题集锦Ⅰ

    1.Java的日期添加: import java.util.Date ; date=new date();//取时间 Calendar calendar = new GregorianCalendar ...

  7. Android注解使用之通过annotationProcessor注解生成代码实现自己的ButterKnife框架

    前言: Annotation注解在Android的开发中的使用越来越普遍,例如EventBus.ButterKnife.Dagger2等,之前使用注解的时候需要利用反射机制势必影响到运行效率及性能,直 ...

  8. Node.js:Buffer浅谈

    Javascript在客户端对于unicode编码的数据操作支持非常友好,但是对二进制数据的处理就不尽人意.Node.js为了能够处理二进制数据或非unicode编码的数据,便设计了Buffer类,该 ...

  9. 玩转spring boot——结合JPA事务

    接着上篇 一.准备工作 修改pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...

  10. 编写高质量代码:改善Java程序的151个建议(第8章:异常___建议114~117)

    建议114:不要在构造函数中抛出异常 Java异常的机制有三种: Error类及其子类表示的是错误,它是不需要程序员处理也不能处理的异常,比如VirtualMachineError虚拟机错误,Thre ...