脑图像的数据预处理2
作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/
在脑图像的数据预处理中已经介绍了一些内容,这篇文章是对前一篇文章的补充与完善。更多内容请看脑图像。数据来源:BrainWeb: Simulated Brain Database
1. 将0、1、2、3类数据分离出来,并存入文件
main.m
function main(filename,name, num) %将真实脑图像中的0、1、2、3拿出来,其余像素为0. %function main(filename,name,name_label, num) %函数main(filename, num)中的第一个参数filename是欲读取的rawb文件的文件名,第二个参数num就是第多少张。 %例如:main('t1_icbm_normal_1mm_pn0_rf0.rawb','train.txt','label.txt', 90), main('phantom_1.0mm_normal_csf.rawb','train.txt','label.txt', 90) mark=Mark('phantom_1.0mm_normal_crisp.rawb',num); read=readrawb(filename, num); [row,col]=size(read); for i=1:row %行 for j=1:col %列 if mark(i,j)==0 read_new(i,j)=0; else read_new(i,j)=read(i,j); %将第0、1、2、3类拿出来,其余类为0 end end end % 旋转90°并显示出来 read_new=imrotate(read_new, 90); %mark=mark'; Write_txt(name,read_new); %将数据写入TXT文件 %Write_txt(name_label,mark); %将标签数据写入TXT文件 imshow(uint8(read_new),'border','tight','initialmagnification','fit');
Mark.m
function mark=Mark(filename,num) %将标签为1、2、3类分出来,其余为0,mark取值:0、1、2、3 %[mark_new,mark]=Mark('phantom_1.0mm_normal_crisp.rawb',90); fp=fopen(filename); temp=fread(fp, 181 * 217 * 181); image=reshape(temp, 181 * 217, 181); images=image(:, num); images=reshape(images, 181, 217); mark_data=images; fclose(fp); %将第0、1、2、3类标签所在的坐标点拿出来,其余置0 for i=1:181 for j=1:217 if (mark_data(i,j)==1)||(mark_data(i,j)==2)||(mark_data(i,j)==3) mark(i,j)=mark_data(i,j); else mark(i,j)=0; end end end
readrawb.m
function g = readrawb(filename, num) %函数readrawb(filename, num)中的第一个参数filename是欲读取的rawb文件的文件名,第二个参数num就是第多少张。 fid = fopen(filename); %连续读取181*217*181个数据,这时候temp是一个长度为181*217*181的向量。 %先将rawb中的所有数据传递给temp数组,然后将tempreshape成图片集。 temp = fread(fid, 181 * 217 * 181); %所以把它变成了一个181*217行,181列的数组,按照它的代码,这就是181张图片的数据,每一列对应一张图。 %生成图片集数组。图片集images数组中每一列表示一张图片。 images = reshape(temp, 181 * 217, 181); %读取数组中的第num行,得到数组再reshape成图片原来的行数和列数:181*217。 image = images(:, num); image = reshape(image, 181, 217); g = image; fclose(fid); end
Write_txt.m
function Write_txt(name,read) %将数据写入txt文件 fp=fopen(name,'w'); [row,col]=size(read); for i=1:row %行 for j=1:col %列 if j==col fprintf(fp,'%f\n',read(i,j)); %换行 %f或者%d else fprintf(fp,'%f\t',read(i,j)); %多个空格tab end end end fclose(fp);
结果
>> main('t1_icbm_normal_1mm_pn0_rf0.rawb','train.txt', 90)
2. 标准分割结果
用到三个函数:Ground_truth.m、Mark.m与Write_txt.m
Ground_truth.m
function Ground_truth(name, num) %标准分割结果 %例如:Ground_truth('Ground truth.txt',90) mark=Mark('phantom_1.0mm_normal_crisp.rawb',num); for i=1:181 %行 for j=1:217 %列 if mark(i,j)==1 read_new(i,j)=50; elseif mark(i, j)==2 read_new(i,j)=150; elseif mark(i, j)==3 read_new(i,j)=255; else read_new(i,j)=0; end end end % 旋转90°并显示出来 read_new=imrotate(read_new, 90); %mark=mark'; Write_txt(name,read_new); %将数据写入TXT文件 %Write_txt(name_label,mark); %将标签数据写入TXT文件 imshow(uint8(read_new),'border','tight','initialmagnification','fit');
结果
>> Ground_truth('Ground truth.txt',90)
3. 说明
T1模态、icmb协议下,切片厚度为1mm,噪声水平为0,灰度不均匀水平为0的正常脑图像,第90层
只选取0、1、2、3类的数据
0:背景 blankground 0
1:脑脊液 CSF 26-89
2:灰质 Grey Matter 78-132
3:白质 White Matter 124-150
分割之后各类用以下像素值进行渲染:
0:0
1:50
2:150
3:255
数据均为217*181的矩阵