图像灰度特征之-⼀阶统计量特征灰度直⽅图特征(Matlab实
现)
⼀阶统计量特征,或者说灰度直⽅图特征,主要思想是对整张图像,或者图像中的感兴趣区域进⾏⼀些统计学计算,求得相应的统计量,⽤于在灰度层⾯描述图像。需要注意的是,⼀阶统计量特征仅适⽤于单通道的灰度图像,如果想对彩⾊图像提取⼀阶统计量特征,需要先对彩⾊图像进⾏灰度化操作。本⽂的代码展⽰的是如何对图像的感兴趣区域提取⼀阶统计量特征。
本⽂使⽤的例⼦是⼀例⾻肿瘤患者的CT图像和它对应的肿瘤区域标记,原始CT图像数据是三维的.nii格式,在Matlab中打开和处理这种格式的数据需要借助NIFTI⼯具库,NIFTI⼯具库⼤家可以在GitHub中搜索下载,或者通过下⾯的链接下载,下载解压后将其添加到Matlab的路径中即可使⽤。
提取三维数据中的⼀层进⾏演⽰,代码如下,使⽤的软件版本为Matlab 2018b,⾸先介绍数据的读取和预处理。
% 读取三维原始图像image和对应的感兴趣区域标记⽂件label
% image和label的尺⼨为512×512×65,65是层数
image = load_nii('C:\Users\Administrator\Desktop\image.nii');
image = image.img;
label = load_nii('C:\Users\Administrator\Desktop\label.nii');
label = label.img;
% 选取原始图像和标记⽂件的第35层,并对标记⽂件进⾏⼆值化操作
% 使得标记中感兴趣区域为1,其他区域为0
img = image(:,:,35);
mask = label(:,:,35);
mask = imbinarize(mask);
% 医学影像灰度值跨度很⼤,所以将img的像素值归⼀化到0-255范围内,便于后续分析
img = double(img);
ymin = 0;
ymax = 255;
xmin = min(min(img));
xmax = max(max(img));
img = round((ymax-ymin)*(img-xmin)/(xmax-xmin) + ymin);
img = uint8(img);
% 将第35层的原图和标记展⽰出来
imshow(img, []);
figure
imshow(mask);
% 求原图在感兴趣区域上的灰度直⽅图并可视化出来
% 变量level存放的是图像的灰度级,这⾥为256×1的向量,存放0-255之间的整数
% 变量count存放的是感兴趣区域中每个像素值的数量
[count, level] = imhist(img(mask == 1));
figure
imhist(img(mask == 1));
上⾯代码得到的数据读取和预处理结果如下所⽰,第⼀幅图是像素值归⼀化到0-255后的第35层原始数据,第⼆幅图是它对应的⼆值化后的感兴趣区域标记图像,⽩⾊区域为⼿⼯勾画的肿瘤区域,第三幅图是将感兴趣区域投射回原图的⽰意图,第四幅图是原始图像感兴趣区域内的灰度直⽅图。
下⾯的代码根据感兴趣区域和灰度直⽅图信息对原图提取⼀些统计量,⽤于在灰度层⾯上描述图像。
% 变量roi中存放的是对应于感兴趣区域的原始图像中的灰度值
roi = img(mask == 1);
roi = double(roi);
% 变量pixelnum中存放的是感兴趣区域(⽩⾊区域)内的像素数
pixelnum = sum(sum(mask == 1));
% 定义第⼀维特征为感兴趣区域内所有像素值的平均值
histofeats(1) = sum(roi) / pixelnum;
% 定义第⼆维特征为感兴趣区域内所有像素值的中位数
histofeats(2) = median(roi);
% 定义第三维特征为感兴趣区域内所有像素值的标准差
histofeats(3) = std(roi);
% 定义第四维特征为感兴趣区域内所有像素值的偏度
histofeats(4) = skewness(roi);
% 定义第五维特征为感兴趣区域内所有像素值的峰度
histofeats(5) = kurtosis(roi);
% 定义第六维特征为感兴趣区域内所有像素值的最⼩值
histofeats(6) = min(roi);
matlab直方图% 定义第七维特征为感兴趣区域内所有像素值的最⼤值
histofeats(7) = max(roi);
% 定义第⼋维特征为感兴趣区域内所有像素值的熵
histofeats(8) = entropy(roi);
% 定义第九维特征为感兴趣区域内所有像素值的能量
p = count/ pixelnum;
histofeats(9) = p' * p;
% 定义第⼗维特征为感兴趣区域内所有像素值的范围
histofeats(10) = max(roi) - min(roi);
% 定义第⼗⼀维特征为感兴趣区域内所有像素值的平均绝对离差
minu = roi - sum(roi) / pixelnum;
histofeats(11) = sum(abs(minu)) / pixelnum;
% 定义第⼗⼆维特征为感兴趣区域内所有像素值的均⽅根
histofeats(12) = sqrt(sum(roi.^2) / pixelnum);
代码中的特征仅仅是例⼦,⼤家可以发挥⾃⼰的想象⼒,设计出更多特征⽤于实际任务。