肺结节CT影像特征提取(四)——肺结节CT影像特征提取MATLAB代码实现
之前的文章讲述了肺结节CT影像数据特征提取算法及基于MATLAB GUI设计的肺结节CT影像特征提取系统。本文将讲述几个主要部分的代码实现,分别是预处理、灰度特征提取、纹理特征提取、形态特征提取数据。
一.预处理部分代码
1、读取肺结节CT数据和专家标记的mask数据
function [ sData ] = read_dcm_mask( dcmPath,maskPath,Ng )
function [ sData ] = read_dcm_mask( dcmPath,maskPath,Ng )
%read_dcm_mask.m 读取dcm文件和mask文件为矩阵,为后期使用准备
%第一个程序
% DESCRIPTION:
%此函数处理dcm文件和mask文件
%1.设置dcm和mask文件所在路径
%2.执行函数即可
%INPUTS:
%dcmPath:dcm文件所在路径
%maskPath:mask文件所在路径
%Ng:标准化的CT灰度级数
%OUTPUTS:
%sData:保存了volume和mask以及prepareVolume函数所需参数的一个cell结构 nowPath=cd;
mkdir(nowPath,'feature_extraction');%创建文件夹存放数据
dcmList=dir(dcmPath); %获取dcm文件列表
maskList=dir(maskPath); %获取mask文件列表
nDcm=size(dcmList,1); %取得处理数据数目
%nMask=size(maskList,1); %获取prepareVolume函数需要的参数,创建cell结构的sData,保存volume和para.
dcm1Path=fullfile(dcmPath,dcmList(3).name); %获取第一个dcm文件
info=dicominfo(dcm1Path); %取得dcm文件部分信息用于参数设置
data.volume=[];
data.mask=[];
para.scanType='Other';
para.pixelW=info.PixelSpacing(1);
para.sliceS=info.SliceThickness;
para.R=1;
para.scale=info.PixelSpacing(1);
para.textType='Matrix';
para.quantAlgo='Lloyd';
para.Ng=Ng;
%sData={data,para} %开始读取数据
for i=1:nDcm-2
dcmName=dcmList(i+2).name;
dcmP=fullfile(dcmPath,dcmName);
maskName=maskList(i+2).name;
maskP=fullfile(maskPath,maskName);
volume=dicomread(dcmP);
data(i).volume=volume;
mask1=imread(maskP);%医生标记的ROI区域
mask=im2bw(mask1);
data(i).mask=mask;
end
%
disp('数据读取完毕!');
sData={data,para};
save sData.mat sData;
save info.mat info; % file=fullfile(nowPath,'feature_extraction');
% movefile('sData.mat',file);
2.获取ROI区域数据
function [ROIdata] = getROI( sDataPath )
function [ROIdata] = getROI( sDataPath )
%function getROI.m 获得ROI区域
% 第二个函数
%DESCRIPTION:
%读取sData数据,对每个volume和mask进行预处理,调用prepareVolume函数
%INOUTS:sData数据的路径
%OUTPUTS:保存ROIonly,levels,ROIbox,maskBox数据的ROIdata. load(sDataPath);
nFile=size(sData{1},2); %获取参数
scanType=sData{1, 2}.scanType;
pixelW=sData{1, 2}.pixelW;
sliceS=sData{1, 2}.sliceS;
R=sData{1, 2}.R;
scale=sData{1, 2}.scale;
textType=sData{1, 2}.textType;
quantAlgo=sData{1, 2}.quantAlgo;
Ng=sData{2}.Ng; for i=1:nFile
volume=sData{1}(i).volume; %获得dcm数据
mask=sData{1}(i).mask; %获取标记
%调用prepareVolume函数获得ROI区域数据
[ROIonly,levels,ROIbox,maskBox] = prepareVolume(volume,mask,scanType,pixelW,sliceS,R,scale,textType,quantAlgo,Ng);
ROI(i).ROIonly=ROIonly;
ROI(i).levels=levels;
ROI(i).ROIbox=ROIbox;
ROI(i).maskBox=maskBox;
fprintf('得到第%d组图像ROI数据\n',i);
end
ROIdata=ROI;
save ROIdata.mat ROIdata;
二、提取灰度特征
肺结节区域对应的灰度直方图,是表现了肺结节区域每一个像素出现的概率的图像。对每张CT影像ROI区域进行计算,得到灰度直方图。然后根据灰度统计的直方图提取8个灰度特征,用这8个灰度特征来描述肺结节的特点,8个灰度特征分别如下表所示,是方差、标准差、最大像素值、最小像素值、偏离度、峰态、能量和熵。
代码如下:
function [grayFeature] =get_gray_feature(ROIdataPath)
%function get_gray_feature.m 获取图像的灰度特征
%第三个函数
%DESCRIPTION:读取ROIdata数据,得到灰度直方图。提取灰度特征
%INPUTS:
%ROIdataPath:ROIdata的路径
%OUTPUTS:
%grayFeature:灰度特征
% grayFeature(j).mean:均值
% grayFeature(j).variance:方差
% grayFeature(i).maxP:最大值
% grayFeature(i).minP:最小值
% grayFeature(j).skewness:偏离度
%grayFeature(j).kurtosis:峰态
%grayFeature(j).energy:能量
%grayFeature(j).entropy:熵
% load(ROIdataPath);%打ROIdata数据
mkdir(cd,'histogram');
%featurePath=fullfile('D:\wuProgram\MATLAB2014b\work\test\feature_extraction_box\feature_extration');
n=size(ROIdata,2); %文件数量
Ng=size(ROIdata(1).levels,2); % 灰度级数 %得到所有ROI区域的灰度直方图
for i=1:n
ROIonly=ROIdata(i).ROIonly;
histData(i).H=my_hist(ROIonly,Ng);
%name=strcat(num2str(i),'.jpg');
%print('name.jpg');
end
save hist.mat histData;
disp('得到灰度直方图');
%.1计算均值mean
for j=1:n
mean=0;
for k=0:Ng-1
H=histData(j).H;
mean=mean+k*H(k+1);
grayFeature(j).mean=mean;
end
end
disp('得到均值'); %2.计算方差variance
for j=1:n
variance=0;
for k=0:Ng-1
mean=grayFeature(j).mean;
H=histData(j).H;
variance=variance+((k-mean).^2)*H(k+1);
grayFeature(j).variance=variance; end
grayFeature(j).deviation=sqrt(variance);
end
disp('得到方差'); %3.计算最大值最小值maxP,minP,
for i=1:n
ROIonly=ROIdata(i).ROIonly;
maxP=max(max(ROIonly));
grayFeature(i).maxP=maxP;
minP=min(min(ROIonly));
grayFeature(i).minP=minP;
end
disp('得到最大值最小值'); %4.计算偏离度,峰态,能量
for j=1:n
skewness=0;
kurtosis=0;
energy=0;
for k=0:Ng-1
H=histData(j).H;
mean=grayFeature(j).mean;
deviation= grayFeature(j).deviation;
skewness=skewness+((k-mean).^3*H(k+1))./(deviation.^3);
kurtosis=kurtosis+((k-mean).^4*H(k+1))./(deviation.^4);
energy=energy+H(k+1).^2;
end
grayFeature(j).skewness=skewness;
grayFeature(j).kurtosis=kurtosis-3;
grayFeature(j).energy=energy; end
disp('得到偏离度,峰态,能量'); %5.计算熵
entropy=0;
for j=1:n
for k=0:Ng-1
H=histData(j).H;
if(H(k+1)==0)
entropy=entropy+0;
else
entropy=entropy+H(k+1)*log2(H(k+1));
end
end
grayFeature(j).entropy=entropy;
end
disp('得到熵');
save grayFeature.mat grayFeature;
%movefile('grayFeature.mat',featurePath);
三、提取纹理特征
纹理特征是一类人类视觉可以明显感觉到的特征,同时也是图像的一类重要特征,主要表现为像素在空间分布模式的描述,可以反映图像表示的物体表面的粗糙度、光滑性、颗粒度、随机性等性质。本文采用灰度共生矩阵(GCLM)来提取肺结节CT影像数据的纹理特征。
灰度特征是基于图像矩阵的特点,利用数学方法构造的灰度共生矩阵,从灰度共生矩阵中得到图像的信息,本文利用设计的肺结节CT影像特征提取系统对选取的9张肺结节CT影像进行特征提取,本文采用灰度共生矩阵方法(GCLM)提取肺结节的纹理特征,这里提取了能量、对比度、相关、熵、差分矩、和平均6个特征。
代码如下(纹理特征利用了GCLM工具包):
function [textureFeature] = get_texture_feature( ROIdataPath )
%get_texture_feature.m :获取纹理特征
%DESCRIPTION:
%调用以下两个函数得到纹理特征
%[GLCM] = getGLCM(ROIonly,levels);
%[glcmTextures] = getGLCMtextures(GLCM);
%IMPUTS:
%
%OUTPUTS: load(ROIdataPath);%打ROIdata数据
% featurePath=fullfile('D:\wuProgram\MATLAB2014b\work\test\feature_extraction_box\feature_extration')
n=size(ROIdata,2); %文件数量
%Ng=size(ROIdata(1).levels,2); % 灰度级数 for i=1:n
ROIonly=ROIdata(i).ROIonly;
levels=ROIdata(i).levels;
ROIbox=ROIdata(i).ROIbox;
maskBox=ROIdata(i).maskBox;
[GLCM] = getGLCM(ROIonly,levels); %调用getGLCM获得GCLM矩阵
[glcmTextures] = getGLCMtextures(GLCM);%调用getGCLMtextures函数获得GCLM纹理
textureFeature(i).glcmTextures=glcmTextures;
fprintf('获取第%d组数据GCLM纹理特征\n',i);
end
save textureFeature.mat textureFeature;
%featurePath=fullfile('D:\wuProgram\MATLAB2014b\work\test\feature_extraction_box\feature_extration');
%movefile('textureFeature.mat',featurePath);
四、提取形态特征数据
提取了肺结节的大小、周长、面积、重心和形状参数特征,另外根据Hu不变矩算法提取了7个不变矩组作为形态特征。
1、基本形态特征提取代码
function [geometryFeature] = get_geometry_feature(sDataPath)
%function get_geometry_feature.m
%purpose:
%获取几何参数,边界长度perimeter、直径diameter、面积area、重心orthocenter、形状参数shape
%INPUTS:
%sDataPath:存储有mask的数据文件位置
%OUTPUTS:
%geometryFeature:存储有几何特征的数据
load(sDataPath);
n=size(sData{1, 1},2);
for i=1:n
mask=sData{1, 1}(i).mask;
perimeter = get_perimeter(mask);
[diameter,myarea] =get_diameter_area( mask );
orthocenter = get_orthocenter( mask,myarea );
shape = get_shape(perimeter ,myarea );
geometryFeature(i).perimeter=perimeter;
geometryFeature(i).diameter=diameter;
geometryFeature(i).myarea=myarea;
geometryFeature(i).orthocenter=orthocenter;
geometryFeature(i).shape=shape;
fprintf('得到第%d组形状参数\n',i);
end save geometryFeature.mat geometryFeature
2.形态特征提取子函数
function [perimeter] = get_perimeter(mask)
%function get_perimeter :获取周长
%purpose:
%获取mask中的周长
%INPUTS:
%mask:圈出区域
%OUTPUTS:
%perimeter:周长 m_edge=edge(mask);
edgeSpot=find(m_edge==1); %获取边界坐标数组
perimeter=size(edgeSpot,1);
end function [diameter,myArae] =get_diameter_area( mask )
%function get_diameter_area:获取mask的直径和面积
%description:
%输入mask,值不为0的地方为感兴趣区域,求其直径和面积
%INPUTS:
%mask:处理的矩阵
%OUTPUTS:
%diameter:直径
%area:面积 [m,n]=size(mask);
myArae=0;
diaTemp=[];
k=1;
for i=1:m
for j=1:n
if(mask(i,j)~=0)
myArae=myArae+1; %计算面积
diaTemp(k,1)=i; %区域存储坐标
diaTemp(k,2)=j;
k=k+1;
else
continue;
end
end
end n=size(diaTemp);
length=[];
k=1;
for i=1:n
for j=i+1:n
length(k)=sqrt((diaTemp(j,1)-diaTemp(i,1)).^2+(diaTemp(j,2)-diaTemp(i,2)).^2);%计算任意两个坐标间的距离
k=k+1;
end
end diameter=max(length);%得到最大距离,即直径
end function [orthocenter] = get_orthocenter( mask,area )
%function get_orthocenter:获取mask重心
%description:
%获取mask区域重心
%INPUTS:
%mask:需要计算的的图像
%OUTPUTS:
%orthocenter:重心 [m,n]=size(mask);
xTemp=0;
yTemp=0; for i=1:m
for j=1:n
if(mask(i,j)~=0)
xTemp=xTemp+i;
yTemp=yTemp+j;
else
continue;
end
end
end
orthocenter.x=ceil(xTemp/area);
orthocenter.y=ceil(yTemp/area); end function [shape] = get_shape(perimeter ,area )
%function get_shape:获取形状参数
%description:
%获取mask形状参数
%INPUTS:
%perimeter ,area区域的mask需要计算的的图像的周长,面积
%OUTPUTS:
%shape:形状参数 shape=(perimeter.^2)/(4*pi*area);
end
上述为肺结节CT影像特征提取系统主要部分代码,部分工具包代码过长,无法贴出。
肺结节CT影像特征提取(四)——肺结节CT影像特征提取MATLAB代码实现的更多相关文章
- C#开发PACS医学影像处理系统(十四):处理Dicom影像窗宽窗位
概念解释(网络资料): 窗宽: 窗宽指CT图像所显示的CT 值范围.在此CT值范围内的组织结构按其密度高低从白到黑分为16 个灰阶以供观察对比.例如,窗宽选定为100 Hu ,则人眼可分辨的CT值为1 ...
- 【独家】阿里天池IJCAI17大赛第四名方案全解析(附代码)
[独家]阿里天池IJCAI17大赛第四名方案全解析(附代码) https://mp.weixin.qq.com/s?__biz=MzAxMzA2MDYxMw==&mid=2651560625& ...
- 第四章 自定义sol合约转化java代码,并实现调用
鉴于笔者以前各大博客教程都有很多人提问,早期建立一个技术交流群,里面技术体系可能比较杂,想了解相关区块链开发,技术提问,请加QQ群:538327407 准备工作 1.官方参考说明文档 https:/ ...
- C#开发PACS医学影像三维重建(十三):基于人体CT值从皮肤渐变到骨骼的梯度透明思路
当我们将CT切片重建为三维体之后,通常会消除一些不必要的外部组织来观察内部病灶, 一般思路是根据人体常见CT值范围来使得部分组织透明来达到效果, 但这是非黑即白的,即,要么显示皮肤,要么显示神经,要么 ...
- 特征提取算法(1)——纹理特征提取算法LBP
模式识别中进行匹配识别或者分类器分类识别时,判断的依据就是图像特征.用提取的特征表示整幅图像内容,根据特征匹配或者分类图像目标. 常见的特征提取算法主要分为以下3类: 基于颜色特征:如颜色直方图.颜色 ...
- Java 找出四位数的全部吸血鬼数字 基础代码实例
/** * 找出四位数的全部吸血鬼数字 * 吸血鬼数字是指位数为偶数的数字,能够由一对数字相乘而得到,而这对数字各包括乘积的一半位数的数字,当中从最初的数字中选取的数字能够随意排序. * 以两个 ...
- COM_第四讲_保存GUID_优化使用代码
优化以前的代码,让使用者更方便 一丶 优化思路 1.我们可以将我们写的GUID(类工厂的ID)保存到注册表中,并且保存一下DLL的文件路径,遍历注册表去DLL路径即可. 2.每个类工厂我们就要使用一个 ...
- Java 找出四位数的所有吸血鬼数字 基础代码实例
/** * 找出四位数的所有吸血鬼数字 * 吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序. * 以两个 ...
- WorldWind源码剖析系列:影像存储类ImageStore、Nlt影像存储类NltImageStore和WMS影像存储类WmsImageStore
影像存储类ImageStore 影像存储类ImageStore提供了计算本地影像路径和远程影像影像URL访问的各种接口,是WmsImageStore类和NltImageStore类的基类.当划分完层次 ...
随机推荐
- 烦神的斐波那契&&洛谷-1306-斐波那契公约数
传送门 洛谷1306传送门 -------------------------------------------------------------------------------------- ...
- JVM-高效并发
Java内存模型与线程: Java内存模型的目的是定义程序中各个变量的访问规则,此处的变量包括实例字段.静态字段和构成数组对象的元素,但不包括局部变量和方法参数,因为后者是线程私有的. Java内存模 ...
- EChars学习之路1
引入echarts.min.js或者使用CDN https://cdn.bootcss.com/echarts/4.2.1-rc1/echarts.min.js 为ECharts准备一个具备大小(宽高 ...
- docker(七) 使用dockerfile-maven-plugin插件构建docker镜像
在dockerfile-maven-plugin插件出现之前,还有一个maven插件是docker-maven-plugin,是由同一个作者创造,作者明确表示推荐使用dockerfile-maven- ...
- Callable,Future和FutureTask详解
1.Callable和Runnable 看Callable接口: public interface Callable<V> { /** * Computes a result, or th ...
- Vue.Draggable
Vue.Draggable拖动效果 下载包:npm install vue-draggable --save 组件中引进依赖: import draggable from 'vuedraggable' ...
- rocketmq双主模式
1.官网 https://rocketmq.apache.org/ 官方安装文档 https://rocketmq.apache.org/docs/quick-start/ 2.rocketmq多主配 ...
- python之路5-函数
定义:函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可 特性: 减少重复代码 使程序变的可扩展 使程序变得易维护 def hello(): print(& ...
- 单链表&双链表的头插入&尾插入
#include<stdio.h> #include"stdlib.h" struct student { int data; struct student *pnex ...
- BZOJ1975[Sdoi2010]魔法猪学院——可持久化可并堆+最短路树
题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与 ...