Pengolahan Citra MRI Menggunakan Matlab
Magnetic Resonance Imaging (MRI) adalah suatu alat diagnostik untuk memeriksa dan mendeteksi organ tubuh dengan menggunakan medan magnet dan gelombang frekuensi radio (tanpa operasi, penggunaan sinar X ataupun bahan radioaktif). Tampilan pesawat MRI dan proses akuisisi citra ditunjukkan pada gambar berikut ini.
Hasil pemeriksaan MRI adalah berupa rekaman citra potongan penampang tubuh/organ manusia dengan menggunakan medan magnet berkekuatan antara 0,064 – 1,5 Tesla dan resonansi getaran terhadap inti atom hidrogen. Contoh citra kepala hasil pemeriksaan dengan modalitas MRI ditunjukkan pada gambar di bawah ini.
Dengan beberapa faktor kelebihan yang dimilikinya, terutama kemampuannya membuat potongan aksial, sagital, coronal, dan oblik tanpa banyak memanipulasi posisi tubuh pasien, membuat MRI sangat sesuai untuk proses diagnostik jaringan lunak.
Berikut ini merupakan contoh aplikasi programmatic GUI Matlab untuk pengolahan citra MRI dan visualisasi citra secara tiga dimensi. Koding dapat dijalankan minimal menggunakan matlab r2014b (karena menggunakan komponen baru yaitu uitab).
Citra MRI dalam matlab terdiri dari 27 slice tampang horizontal (axial). Tampang horizontal tersebut kemudian ditransformasi menjadi tampang sagittal (35 slice) dan tampang coronal (45 slice) menggunakan transformasi radon. Selanjutnya masing-masing tampang divisualisasikan secara tiga dimensi.
Tampilan GUI Matlab untuk melakukan pengolahan citra MRI adalah sebagai berikut:
1. Tampang horizontal (axial)
File source code lengkap beserta citra untuk MRI Image Processing dapat diperoleh melalui halaman berikut ini: Source Code
Source code tersebut dapat dijalankan pada software matlab minimal versi R2014b karena menggunakan komponen baru yaitu uitab.
Tampilan source codenya adalah:
function mri_image_processing global D map siz toggle1 toggle2 load mri f = figure('Name','MRI Image Processing','MenuBar','none',... 'ToolBar','none','NumberTitle','off','Position',[250 130 800 500]); tgroup = uitabgroup('Parent', f); tab1 = uitab('Parent', tgroup, 'Title', 'Horizontal'); panel1 = uipanel('Parent',tab1,'Title','Horizontal Slice','FontWeight','bold',... 'FontSize',10,'Position',[.1 .3 .35 .6]); panel2 = uipanel('Parent',tab1,'Title','Slice Number','FontWeight','bold',... 'FontSize',10,'Position',[.1 .12 .35 .13]); btn1 = uicontrol('Parent',panel2,'Style', 'pushbutton', 'String', '<<',... 'Position', [12 12 80 20],'Callback', @pushbutton1); btn2 = uicontrol('Parent',panel2,'Style', 'pushbutton', 'String', '>>',... 'Position', [183 12 80 20],'Callback', @pushbutton2); ax1 = axes('Parent',panel1,'Position',[.1 .1 .85 .85],'XTick',[],... 'YTick',[],'Visible','off'); edit1 = uicontrol('Parent',panel2,'Style','edit','Enable','inactive',... 'String','0','Position',[98 12 80 20]); tab2 = uitab('Parent', tgroup, 'Title', 'Sagittal'); panel3 = uipanel('Parent',tab2,'Title','Sagittal Slice','FontWeight','bold',... 'FontSize',10,'Position',[.1 .3 .35 .6]); panel4 = uipanel('Parent',tab2,'Title','Slice Number','FontWeight','bold',... 'FontSize',10,'Position',[.1 .12 .35 .13]); btn3 = uicontrol('Parent',panel4,'Style', 'pushbutton', 'String', '<<',... 'Position', [12 12 80 20],'Callback', @pushbutton3); btn4 = uicontrol('Parent',panel4,'Style', 'pushbutton', 'String', '>>',... 'Position', [183 12 80 20],'Callback', @pushbutton4); ax2 = axes('Parent',panel3,'Position',[.1 .1 .85 .85],'XTick',[],... 'YTick',[],'Visible','off'); edit2 = uicontrol('Parent',panel4,'Style','edit','Enable','inactive',... 'String','0','Position',[98 12 80 20]); tab3 = uitab('Parent', tgroup, 'Title', 'Coronal'); panel5 = uipanel('Parent',tab3,'Title','Coronal Slice','FontWeight','bold',... 'FontSize',10,'Position',[.1 .3 .35 .6]); panel6 = uipanel('Parent',tab3,'Title','Slice Number','FontWeight','bold',... 'FontSize',10,'Position',[.1 .12 .35 .13]); btn5 = uicontrol('Parent',panel6,'Style', 'pushbutton', 'String', '<<',... 'Position', [12 12 80 20],'Callback', @pushbutton5); btn6= uicontrol('Parent',panel6,'Style', 'pushbutton', 'String', '>>',... 'Position', [183 12 80 20],'Callback', @pushbutton6); ax3 = axes('Parent',panel5,'Position',[.1 .1 .85 .85],'XTick',[],... 'YTick',[],'Visible','off'); edit3 = uicontrol('Parent',panel6,'Style','edit','Enable','inactive',... 'String','0','Position',[98 12 80 20]); panel7 = uipanel('Parent',tab1,'Title','3D Visualization','FontWeight','bold',... 'FontSize',10,'Position',[.55 .3 .35 .6]); panel8 = uipanel('Parent',tab1,'Title','Panel','FontWeight','bold',... 'FontSize',10,'Position',[.55 .12 .35 .13]); toggle1 = uicontrol('Parent',panel8,'Style', 'togglebutton', 'String', '3D',... 'Position', [12 12 120 20],'Callback', @togglebutton1); toggle2 = uicontrol('Parent',panel8,'Style', 'togglebutton', 'String', 'Rotate on',... 'Position', [143 12 120 20],'Callback', @togglebutton2); ax4 = axes('Parent',panel7,'Position',[.1 .1 .85 .85],'XTick',[],... 'YTick',[],'Visible','off'); panel9 = uipanel('Parent',tab2,'Title','3D Visualization','FontWeight','bold',... 'FontSize',10,'Position',[.55 .3 .35 .6]); panel10 = uipanel('Parent',tab2,'Title','Panel','FontWeight','bold',... 'FontSize',10,'Position',[.55 .12 .35 .13]); toggle3 = uicontrol('Parent',panel10,'Style', 'togglebutton', 'String', '3D',... 'Position', [12 12 120 20],'Callback', @togglebutton3); toggle4 = uicontrol('Parent',panel10,'Style', 'togglebutton', 'String', 'Rotate on',... 'Position', [143 12 120 20],'Callback', @togglebutton4); ax5 = axes('Parent',panel9,'Position',[.1 .1 .85 .85],'XTick',[],... 'YTick',[],'Visible','off'); panel11 = uipanel('Parent',tab3,'Title','3D Visualization','FontWeight','bold',... 'FontSize',10,'Position',[.55 .3 .35 .6]); panel12 = uipanel('Parent',tab3,'Title','Panel','FontWeight','bold',... 'FontSize',10,'Position',[.55 .12 .35 .13]); toggle5 = uicontrol('Parent',panel12,'Style', 'togglebutton', 'String', '3D',... 'Position', [12 12 120 20],'Callback', @togglebutton5); toggle6 = uicontrol('Parent',panel12,'Style', 'togglebutton', 'String', 'Rotate on',... 'Position', [143 12 120 20],'Callback', @togglebutton6); ax6 = axes('Parent',panel11,'Position',[.1 .1 .85 .85],'XTick',[],... 'YTick',[],'Visible','off'); function pushbutton1(~,~) image_num = str2double(get(edit1,'string')); if image_num > 1 image_num = image_num-1; axes(ax1); image(D(:,:,image_num)); axis image; colormap(map); set(edit1, 'string', image_num); else image_num = 0; axes(ax1) cla reset set(gca,'XTick',[]) set(gca,'YTick',[]) set(ax1,'Visible','off') set(edit1, 'string', image_num); end end function pushbutton2(~,~) image_num = str2double(get(edit1,'string')); if image_num < 27 image_num = image_num+1; else image_num = 27; end axes(ax1); image(D(:,:,image_num)); axis image; colormap(map); set(edit1, 'string', image_num); end function pushbutton3(~,~) image_num = str2double(get(edit2,'string')); if image_num > 1 image_num = image_num-1; R3 = makeresampler({'cubic','nearest','nearest'},'fill'); T3 = maketform('affine',[-2.5 0 0; 0 1 0; 0 0 0.5; 68.5 0 -14]); S = tformarray(D,T3,R3,[4 1 2],[1 2 4],[66 128 35],[],0); S2 = padarray(S,[6 0 0 0],0,'both'); S2 = squeeze(S2); axes(ax2); imagesc(S2(:,:,image_num)); axis image; colormap(map); set(edit2, 'string', image_num); else image_num = 0; axes(ax2) cla reset set(gca,'XTick',[]) set(gca,'YTick',[]) set(ax2,'Visible','off') set(edit2,'string',image_num) end end function pushbutton4(~,~) image_num = str2double(get(edit2,'string')); if image_num < 35 image_num = image_num+1; else image_num = 35; end R3 = makeresampler({'cubic','nearest','nearest'},'fill'); T3 = maketform('affine',[-2.5 0 0; 0 1 0; 0 0 0.5; 68.5 0 -14]); S = tformarray(D,T3,R3,[4 1 2],[1 2 4],[66 128 35],[],0); S2 = padarray(S,[6 0 0 0],0,'both'); S2 = squeeze(S2); axes(ax2); imagesc(S2(:,:,image_num)); axis image; colormap(map); set(edit2, 'string', image_num); end function pushbutton5(~,~) image_num = str2double(get(edit3,'string')); if image_num > 1 image_num = image_num-1; R3 = makeresampler({'cubic','nearest','nearest'},'fill'); T4 = maketform('affine',[-2.5 0 0; 0 1 0; 0 0 -0.5; 68.5 0 61]); C = tformarray(D,T4,R3,[4 2 1],[1 2 4],[66 128 45],[],0); C2 = padarray(C,[6 0 0 0],0,'both'); C2 = squeeze(C2); axes(ax3); imagesc(C2(:,:,image_num)); axis image; colormap(map); set(edit3, 'string', image_num); else image_num = 0; axes(ax3) cla reset set(gca,'XTick',[]) set(gca,'YTick',[]) set(ax3,'Visible','off') set(edit3, 'string', image_num) end end function pushbutton6(~,~) image_num = str2double(get(edit3,'string')); if image_num < 45 image_num = image_num+1; else image_num = 45; end R3 = makeresampler({'cubic','nearest','nearest'},'fill'); T4 = maketform('affine',[-2.5 0 0; 0 1 0; 0 0 -0.5; 68.5 0 61]); C = tformarray(D,T4,R3,[4 2 1],[1 2 4],[66 128 45],[],0); C2 = padarray(C,[6 0 0 0],0,'both'); C2 = squeeze(C2); axes(ax3); imagesc(C2(:,:,image_num)); axis image; colormap(map); set(edit3, 'string', image_num); end function togglebutton1(~,~) val1 = get(toggle1,'Value'); if val1 == 1 axes(ax4); Ds = smooth3(squeeze(D)); hiso = patch(isosurface(Ds,5),... 'FaceColor',[1,.75,.65],... 'EdgeColor','none'); isonormals(Ds,hiso) hcap = patch(isocaps(squeeze(D),5),... 'FaceColor','interp',... 'EdgeColor','none'); view(35,30) axis off colormap(map) daspect([1,1,.4]) lightangle(45,30); set(gcf,'Renderer','zbuffer'); lighting phong set(hcap,'AmbientStrength',.6) set(hiso,'SpecularColorReflectance',0,'SpecularExponent',50) else axes(ax4); cla reset set(gca,'XTick',[]) set(gca,'YTick',[]) set(ax4,'Visible','off') end end function togglebutton2(~,~) val1 = get(toggle2,'Value'); if val1 == 1 rotate3d(ax4,'on'); set(toggle2,'string','Rotate off') else rotate3d(ax4,'off'); set(toggle2,'string','Rotate on') end end function togglebutton3(~,~) val1 = get(toggle3,'Value'); if val1 == 1 axes(ax5); R3 = makeresampler({'cubic','nearest','nearest'},'fill'); T3 = maketform('affine',[-2.5 0 0; 0 1 0; 0 0 0.5; 68.5 0 -14]); S = tformarray(D,T3,R3,[4 1 2],[1 2 4],[66 128 35],[],0); S2 = padarray(S,[6 0 0 0],0,'both'); Ds = smooth3(squeeze(S2)); hiso = patch(isosurface(Ds,5),... 'FaceColor',[1,.75,.65],... 'EdgeColor','none'); isonormals(Ds,hiso) hcap = patch(isocaps(squeeze(S2),5),... 'FaceColor','interp',... 'EdgeColor','none'); view(35,30) axis off colormap(map) daspect([1,1,.4]) lightangle(45,30); set(gcf,'Renderer','zbuffer'); lighting phong set(hcap,'AmbientStrength',.6) set(hiso,'SpecularColorReflectance',0,'SpecularExponent',50) else axes(ax5); cla reset set(gca,'XTick',[]) set(gca,'YTick',[]) set(ax5,'Visible','off') end end function togglebutton4(~,~) val1 = get(toggle4,'Value'); if val1 == 1 rotate3d(ax5,'on'); set(toggle4,'string','Rotate off') else rotate3d(ax5,'off'); set(toggle4,'string','Rotate on') end end function togglebutton5(~,~) val1 = get(toggle5,'Value'); if val1 == 1 axes(ax6); R3 = makeresampler({'cubic','nearest','nearest'},'fill'); T4 = maketform('affine',[-2.5 0 0; 0 1 0; 0 0 -0.5; 68.5 0 61]); C = tformarray(D,T4,R3,[4 2 1],[1 2 4],[66 128 45],[],0); C2 = padarray(C,[6 0 0 0],0,'both'); C2 = squeeze(C2); Ds = smooth3(squeeze(C2)); hiso = patch(isosurface(Ds,5),... 'FaceColor',[1,.75,.65],... 'EdgeColor','none'); isonormals(Ds,hiso) hcap = patch(isocaps(squeeze(C2),5),... 'FaceColor','interp',... 'EdgeColor','none'); view(35,30) axis off colormap(map) daspect([.85,.85,.4]) lightangle(45,30); set(gcf,'Renderer','zbuffer'); lighting phong set(hcap,'AmbientStrength',.6) set(hiso,'SpecularColorReflectance',0,'SpecularExponent',50) else axes(ax6); cla reset set(gca,'XTick',[]) set(gca,'YTick',[]) set(ax6,'Visible','off') end end function togglebutton6(~,~) val1 = get(toggle6,'Value'); if val1 == 1 rotate3d(ax6,'on'); set(toggle6,'string','Rotate off') else rotate3d(ax6,'off'); set(toggle6,'string','Rotate on') end end end
Posted on December 29, 2015, in Pengolahan Citra and tagged aplikasi pengolahan citra digital menggunakan matlab, aplikasi pengolahan citra medis, axial, cara membuat gui matlab pengolahan citra digital, cara menampilkan citra pada matlab, citra biner, citra grayscale, citra MRI Matlab, contoh gui matlab pengolahan citra, contoh program matlab pengolahan citra, contoh program matlab sederhana, coronal, gui matlab, image processing, MRI image, mri image processing, pengolahan citra CT scan matlab, pengolahan citra dicom, Pengolahan Citra Digital, pengolahan citra digital menggunakan GUI Matlab, pengolahan citra digital menggunakan matlab, pengolahan citra grayscale menggunakan matlab, pengolahan citra medis, pengolahan citra medis 3 dimensi, pengolahan citra MRI matlab, sagittal, slice axial, slice coronal, slice sagittal. Bookmark the permalink. 2 Comments.
kak apa bisa minta datanya?
Source code lengkap beserta data bisa dibeli melalui tokopedia