腦圖像的數據預處理 BrainWeb: Simulated Brain Database使用說明

腦圖像的數據預處理

    在「BrainWeb: Simulated Brain Database使用說明」中已經介紹瞭如何下載並打開腦數據庫,這篇文章將0、一、二、三、8類分割出來,用之後續對圖像的處理。html

    做者:凱魯嘎吉 - 博客園 http://www.cnblogs.com/kailugaji/web

1.準備

    從BrainWeb: Simulated Brain Database網站中下載咱們須要的腦圖像數據,如t1_icbm_normal_1mm_pn0_rf0.rawb文件,表示在T1模態、icmb協議下,切片厚度爲1mm,噪聲水平爲0,灰度不均勻水平爲0的正常腦圖像。
算法

2.程序

main.m

function main(filename,name,num)
% 函數main(filename, num)中的第一個參數filename是欲讀取的rawb文件的文件名,第二個參數num就是第多少張。
%例如:main('t1_icbm_normal_1mm_pn0_rf0.rawb','train.txt',90), main('phantom_1.0mm_normal_csf.rawb','train.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、一、二、三、8類拿出來,其他類爲0
        end
    end
end
Write_txt(name,read_new);    %將數據寫入TXT文件
% 旋轉90°並顯示出來
read_new=imrotate(read_new, 90);                                        
imshow(uint8(read_new));
end

Mark.m

function mark=Mark(filename,num)
%將標籤爲一、二、三、8類分出來,其他爲0,mark取值:0、一、二、三、8
%[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、一、二、三、8類標籤所在的座標點拿出來,其他置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_data(i,j)==8)
            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);

processed_data.m

function processed_data(filename,name,num)
%將一、二、三、8類的數據作歸一處理,其他爲0
% processed_data('t1_icbm_normal_1mm_pn0_rf0.rawb','train.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)./255;   %將第0、一、二、三、8類拿出來,其他類爲0
        end
    end
end
Write_txt(name,read_new);    %將數據寫入TXT文件

init_image.m

function init_image(filename,num)
%function init_image(filename,name,num)
% 函數init_image(filename,num)中的第一個參數filename是欲讀取的rawb文件的文件名,第二個參數num就是第多少張。輸出爲原始圖像,未處理
%例如:init_image('t1_icbm_normal_1mm_pn0_rf0.rawb','train.txt',90), init_image('phantom_1.0mm_normal_csf.rawb','train.txt',90)
read=readrawb(filename, num);
%Write_txt(name,read);  %將數據寫入文件
% 旋轉90°並顯示出來
read=imrotate(read, 90);                                        
imshow(uint8(read));
end

3.結果

>> init_image('t1_icbm_normal_1mm_pn0_rf0.rawb',90)

  

>> main('t1_icbm_normal_1mm_pn0_rf0.rawb','train.txt',90)

4.注意

    init_image()這個函數輸出原圖像,main()這個函數將0、一、二、三、8類分離出來(用前四個函數便可),用於後續的研究,processed_data()這個函數對一、二、三、8類進行歸一化,並將結果寫入TXT文件。這篇文章僅做爲保存我以前所作的內容,從此不會研究腦圖像,但我以前的博客園文章中提到的聚類算法均可以用在腦圖像分割中,有興趣的話能夠對聚類算法用在腦圖像分割這個領域作進一步研究。數據庫

相關文章
相關標籤/搜索