腦圖像的數據預處理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的矩陣
