Skip to content

Commit

Permalink
Merge pull request #88 from oesteban/fix/AirMaskEmpty
Browse files Browse the repository at this point in the history
[FIX] Problem with AirMask computed with dipy
  • Loading branch information
oesteban committed Apr 23, 2016
2 parents a197570 + f246c77 commit fb6382a
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 43 deletions.
26 changes: 13 additions & 13 deletions mriqc/data/tests/ds003_downsampled_sMRI.csv
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
,subject,session,scan,cjv,cnr,efc,fber,fwhm,fwhm_x,fwhm_y,fwhm_z,icvs_csf,icvs_gm,icvs_wm,inu_med,inu_range,qi1,qi2,rpve_csf,rpve_gm,rpve_wm,size_x,size_y,size_z,snr,snr_csf,snr_gm,snr_wm,spacing_x,spacing_y,spacing_z,summary_mean_bg,summary_mean_csf,summary_mean_gm,summary_mean_wm,summary_p05_bg,summary_p05_csf,summary_p05_gm,summary_p05_wm,summary_p95_bg,summary_p95_csf,summary_p95_gm,summary_p95_wm,summary_stdv_bg,summary_stdv_csf,summary_stdv_gm,summary_stdv_wm
0,sub-05,single_session,T1w,0.847424864769,2.10923194885,0.578799850039,369.463500977,12.9737,11.6605,14.4329,12.9754,0.230082490651,0.426577723808,0.343339785541,1.23546981812,0.491762495041,0.0903339708695,1.01091288123,1026.11962891,2519.05957031,1567.52026367,40,48,48,69.9769397754,42.3087550692,68.7821066273,98.8399576295,4.0,5.33333349228,5.33333349228,201.109588623,78.7529067993,131.251022339,210.89692688,77.745816803,29.1234767914,43.6442089081,57.0059951782,347.036772156,135.755332947,224.423460388,367.024983215,80.4552230835,33.6032829285,56.5529441833,105.010406494
1,sub-01,single_session,T1w,0.874562561512,1.47343432903,0.606350762762,327.50390625,12.7457,11.7927,13.9248,12.6093,0.274554501619,0.379360375323,0.346085123058,1.26181507111,0.364555537701,0.0195172059579,0.900819805123,968.579589844,2388.50952148,1458.45019531,40,48,48,108.52060973,65.1083925304,106.420819558,154.032617101,4.0,5.33333349228,5.33333349228,202.529571533,84.3706817627,132.076080322,220.09815979,84.7403232574,36.127976799,47.0942914963,69.5903049469,344.315419006,132.370684052,228.391381836,359.709155273,79.3971633911,34.041179657,57.6171379089,99.7702178955
2,sub-06,single_session,T1w,0.737061262131,1.87585294247,0.596988232826,284.018493652,13.203,11.9093,14.9446,12.9313,0.227721920689,0.410150186264,0.362127893047,1.27448034286,0.64004098177,0.0541215653622,0.921848016787,1125.14953613,2673.63964844,1525.7701416,40,48,48,109.335706781,68.490839151,106.340882756,153.175398436,4.0,5.33333349228,5.33333349228,195.318481445,75.3311157227,121.461486816,213.293823242,77.6163963318,28.4385055542,39.902440834,64.4192962646,350.550248718,124.835761261,216.037435913,363.936181641,81.4288330078,40.574798584,54.5251808167,100.744934082
3,sub-07,single_session,T1w,0.823511183262,1.97894239426,0.575499164619,365.13394165,12.2029,10.9922,13.5629,12.1884,0.195145691124,0.428881071612,0.375973237264,1.05531001091,0.448346737027,0.0546762589928,0.968496793058,1091.49951172,2372.24951172,1770.50024414,40,48,48,89.537061464,57.5226940056,86.9032526047,124.185237782,4.0,5.33333349228,5.33333349228,210.575820923,88.5308380127,131.726043701,218.079528809,89.7520385742,30.0427445412,40.3056297302,64.5876541138,360.186901855,147.852485657,228.911262512,372.781997681,80.844543457,53.0673141479,58.6701469421,103.50567627
4,sub-04,single_session,T1w,0.840103089809,2.4273545742,0.553474931888,269.782440186,11.8226,11.384,13.0459,11.1269,0.292614508537,0.378984830461,0.328400661002,1.15958344936,0.3503677845,0.304568527919,1.22200386934,900.869628906,2541.34960938,1377.73022461,40,48,48,48.8502407566,27.4104386323,46.9230542988,72.2172293387,4.0,5.33333349228,5.33333349228,208.240509033,85.7316818237,134.509536743,235.095352173,78.9601211548,37.3932220459,45.4958799362,65.1360488892,375.569854736,144.653031921,230.597932434,394.985076904,90.9164581299,32.6919288635,58.118598938,114.78755188
5,sub-03,single_session,T1w,0.767543971539,1.26020896435,0.612684727218,375.348297119,12.2272,10.6437,12.991,13.2204,0.264987225052,0.370238905628,0.36477386932,0.819777131081,0.408699738979,0.124773960217,1.03065315098,707.279724121,2186.29956055,1422.98022461,40,48,48,89.7685582454,51.8964199029,90.37613048,127.033124353,4.0,5.33333349228,5.33333349228,180.71395874,73.4132003784,115.800613403,197.934112549,65.4469650269,28.9063926697,41.1063774109,58.219549942,313.601818848,119.46156311,197.262772369,322.721011353,76.3212661743,46.5311775208,49.3746643066,89.8358612061
6,sub-02,single_session,T1w,0.895094931126,1.22909700871,0.633608063136,225.1456604,13.6631,11.93,15.3384,13.9388,0.198709514018,0.422900090924,0.378390395059,1.22557473183,0.601146519184,0.0,0.846208273897,1064.9395752,2516.8293457,1942.46020508,40,48,48,104.857619686,66.5099850275,103.276440345,144.786433687,4.0,5.33333349228,5.33333349228,211.16947937,89.6594390869,133.817459106,214.460922241,86.6741218567,27.8390102386,40.677911377,64.010572052,362.561541748,151.417739868,241.828213501,374.110174561,84.855796814,70.8970718384,62.0585021973,102.56754303
7,sub-11,single_session,T1w,0.870250225067,1.310308218,0.584743609416,381.375366211,13.0657,11.8193,14.1448,13.3415,0.258896336772,0.401763879453,0.339339783775,1.44116592407,0.573433041573,0.0574518418385,0.978648080781,806.249633789,2023.77954102,1507.97021484,40,48,48,82.0031189887,48.1773209385,82.2881070231,115.543929005,4.0,5.33333349228,5.33333349228,200.896774292,79.6344528198,133.284973145,210.745773315,77.665304184,35.8709037781,47.5932956696,59.7072330475,346.197311401,125.371304321,226.949707031,360.812612915,81.4773788452,28.9504070282,56.9344100952,103.665336609
8,sub-08,single_session,T1w,0.974267244339,1.35735952854,0.604898143188,240.548660278,13.6094,12.061,14.6725,14.2441,0.176762767484,0.406914810829,0.416322421687,1.32965779305,1.02488465309,0.0,0.876077556832,837.349609375,2347.25927734,2354.51025391,40,48,48,110.081024531,77.5531854927,109.12846367,143.561424431,4.0,5.33333349228,5.33333349228,204.348007202,100.905487061,122.701156616,190.210174561,88.3374885559,30.0265647888,33.5215377808,51.4220882416,355.803994751,286.392626953,233.596073914,368.638330078,79.1864013672,75.7910079956,61.29845047,99.9164199829
9,sub-12,single_session,T1w,0.862985730171,2.49550485611,0.567749866931,303.89465332,14.3085,12.2781,16.2117,14.7172,0.226959848196,0.412951989756,0.360088162048,0.978660583496,0.533156013489,0.0,0.907442914589,1121.76953125,2620.46923828,1634.4901123,40,48,48,89.9767366408,57.0852563904,88.0307374717,124.81421606,4.0,5.33333349228,5.33333349228,216.013473511,85.5574264526,136.614501953,232.043151855,87.5165733337,30.1224594116,44.5036993027,66.9158721924,394.403338623,143.979238892,250.66816864,413.9796875,90.9113540649,49.2056541443,63.7618217468,112.754821777
10,sub-09,single_session,T1w,0.891922771931,1.27155911922,0.621692474098,245.084060669,13.4949,11.8433,15.1315,13.7137,0.176089010261,0.426038910792,0.397872078947,1.47093510628,1.15009073019,0.0,0.900945644595,821.029663086,2208.67919922,2133.8203125,40,48,48,98.1348029836,68.5653110437,97.4039324308,128.435165476,4.0,5.33333349228,5.33333349228,208.730651855,98.8687820435,131.935256958,197.303741455,91.9660743713,29.7262588501,39.3422395706,53.8423118591,363.26105957,251.369622803,240.566972351,374.07723999,79.1798095703,69.3393096924,61.3246078491,100.549987793
11,sub-10,single_session,T1w,0.908173263073,1.45979487896,0.623783041865,197.390869141,12.8371,11.5066,13.8085,13.3141,0.235025931321,0.397154418155,0.367819650525,1.31653761864,0.635138660669,0.0234567901235,0.938104310379,1027.95959473,2587.26953125,2038.74023438,40,48,48,57.4966657616,35.1837138273,57.3772874951,79.9289959625,4.0,5.33333349228,5.33333349228,202.888519287,81.1059646606,127.234413147,208.541854858,80.2244735718,32.6683872223,39.8194450378,60.2138324738,356.006082153,137.691156006,233.823631287,374.289535522,83.2907180786,44.0507621765,59.7665939331,103.621337891
12,sub-13,single_session,T1w,0.868193328381,1.54544448853,0.538360174772,428.928741455,13.5111,12.1714,14.0962,14.3759,0.243347987443,0.391594002412,0.365058010145,1.11308276653,0.603957104683,0.147783251232,1.05007446732,612.529724121,1877.50952148,1364.14013672,40,48,48,80.0197953003,48.8017525464,80.2427575847,111.01487577,4.0,5.33333349228,5.33333349228,217.98298645,89.1285095215,142.817245483,230.296798706,84.9433174133,31.573727417,50.286224556,69.6694313049,378.130267334,148.328210449,251.112011719,392.158425903,89.7677688599,51.8970298767,63.0603904724,108.479957581
0,sub-04,single_session,T1w,0.840103089809,2.4273545742,0.553474931888,236.2215271,11.8226,11.384,13.0459,11.1269,0.292614508537,0.378984830461,0.328400661002,1.15958344936,0.3503677845,0.351378958121,1.17195355903,900.869628906,2541.34960938,1377.73022461,40,48,48,15.432024415,8.65908850495,14.8232170067,22.8137677333,4.0,5.33333349228,5.33333349228,208.240509033,85.7316818237,134.509536743,235.095352173,78.9601211548,37.3932220459,45.4958799362,65.1360488892,375.569854736,144.653031921,230.597932434,394.985076904,90.9164581299,32.6919288635,58.118598938,114.78755188
1,sub-03,single_session,T1w,0.767543971539,1.26020896435,0.612684727218,81.2394866943,12.2272,10.6437,12.991,13.2204,0.264987225052,0.370238905628,0.36477386932,0.819777131081,0.408699738979,0.769635008599,1.7407809335,707.279724121,2186.29956055,1422.98022461,40,48,48,6.7789739697,3.91901670828,6.82485547257,9.59304972825,4.0,5.33333349228,5.33333349228,180.71395874,73.4132003784,115.800613403,197.934112549,65.4469650269,28.9063926697,41.1063774109,58.219549942,313.601818848,119.46156311,197.262772369,322.721011353,76.3212661743,46.5311775208,49.3746643066,89.8358612061
2,sub-07,single_session,T1w,0.823511183262,1.97894239426,0.575499164619,155.069335938,12.2029,10.9922,13.5629,12.1884,0.195145691124,0.428881071612,0.375973237264,1.05531001091,0.448346737027,0.543225656519,1.51530192134,1091.49951172,2372.24951172,1770.50024414,40,48,48,11.2295154309,7.21435313377,10.8991896781,15.5750034807,4.0,5.33333349228,5.33333349228,210.575820923,88.5308380127,131.726043701,218.079528809,89.7520385742,30.0427445412,40.3056297302,64.5876541138,360.186901855,147.852485657,228.911262512,372.781997681,80.844543457,53.0673141479,58.6701469421,103.50567627
3,sub-02,single_session,T1w,0.895094931126,1.22909700871,0.633608063136,106.638214111,13.6631,11.93,15.3384,13.9388,0.198709514018,0.422900090924,0.378390395059,1.22557473183,0.601146519184,0.556927546759,1.53853796346,1064.9395752,2516.8293457,1942.46020508,40,48,48,9.8627149002,6.2558068961,9.71399207877,13.6183457257,4.0,5.33333349228,5.33333349228,211.16947937,89.6594390869,133.817459106,214.460922241,86.6741218567,27.8390102386,40.677911377,64.010572052,362.561541748,151.417739868,241.828213501,374.110174561,84.855796814,70.8970718384,62.0585021973,102.56754303
4,sub-10,single_session,T1w,0.908173263073,1.45979487896,0.623783041865,150.787353516,12.8371,11.5066,13.8085,13.3141,0.235025931321,0.397154418155,0.367819650525,1.31653761864,0.635138660669,0.197310513447,0.999071730075,1027.95959473,2587.26953125,2038.74023438,40,48,48,17.5580221292,10.7442130389,17.5215670371,24.4082863116,4.0,5.33333349228,5.33333349228,202.888519287,81.1059646606,127.234413147,208.541854858,80.2244735718,32.6683872223,39.8194450378,60.2138324738,356.006082153,137.691156006,233.823631287,374.289535522,83.2907180786,44.0507621765,59.7665939331,103.621337891
5,sub-09,single_session,T1w,0.891922771931,1.27155911922,0.621692474098,164.56036377,13.4949,11.8433,15.1315,13.7137,0.176089010261,0.426038910792,0.397872078947,1.47093510628,1.15009073019,0.170072639225,0.984539427385,821.029663086,2208.67919922,2133.8203125,40,48,48,15.3889411392,10.7520217473,15.2743301798,20.1404714905,4.0,5.33333349228,5.33333349228,208.730651855,98.8687820435,131.935256958,197.303741455,91.9660743713,29.7262588501,39.3422395706,53.8423118591,363.26105957,251.369622803,240.566972351,374.07723999,79.1798095703,69.3393096924,61.3246078491,100.549987793
6,sub-12,single_session,T1w,0.862985730171,2.49550485611,0.567749866931,230.049835205,14.3085,12.2781,16.2117,14.7172,0.226959848196,0.412951989756,0.360088162048,0.978660583496,0.533156013489,0.229279753707,1.18864571357,1121.76953125,2620.46923828,1634.4901123,40,48,48,26.8287454071,17.0213531561,26.2484985764,37.2163844887,4.0,5.33333349228,5.33333349228,216.013473511,85.5574264526,136.614501953,232.043151855,87.5165733337,30.1224594116,44.5036993027,66.9158721924,394.403338623,143.979238892,250.66816864,413.9796875,90.9113540649,49.2056541443,63.7618217468,112.754821777
7,sub-01,single_session,T1w,0.874562561512,1.47343432903,0.606350762762,131.190750122,12.7457,11.7927,13.9248,12.6093,0.274554501619,0.379360375323,0.346085123058,1.26181507111,0.364555537701,0.809038192362,1.65336706282,968.579589844,2388.50952148,1458.45019531,40,48,48,9.44581155769,5.66714109142,9.26304238301,13.4072511986,4.0,5.33333349228,5.33333349228,202.529571533,84.3706817627,132.076080322,220.09815979,84.7403232574,36.127976799,47.0942914963,69.5903049469,344.315419006,132.370684052,228.391381836,359.709155273,79.3971633911,34.041179657,57.6171379089,99.7702178955
8,sub-06,single_session,T1w,0.737061262131,1.87585294247,0.596988232826,229.559890747,13.203,11.9093,14.9446,12.9313,0.227721920689,0.410150186264,0.362127893047,1.27448034286,0.64004098177,0.380316019499,1.34412450651,1125.14953613,2673.63964844,1525.7701416,40,48,48,24.7540157674,15.5065839164,24.0759763298,34.6794870558,4.0,5.33333349228,5.33333349228,195.318481445,75.3311157227,121.461486816,213.293823242,77.6163963318,28.4385055542,39.902440834,64.4192962646,350.550248718,124.835761261,216.037435913,363.936181641,81.4288330078,40.574798584,54.5251808167,100.744934082
9,sub-05,single_session,T1w,0.847424864769,2.10923194885,0.578799850039,325.3019104,12.9737,11.6605,14.4329,12.9754,0.230082490651,0.426577723808,0.343339785541,1.23546981812,0.491762495041,0.303586702401,1.30329303347,1026.11962891,2519.05957031,1567.52026367,40,48,48,28.8259195402,17.4284381881,28.3337264792,40.7155939532,4.0,5.33333349228,5.33333349228,201.109588623,78.7529067993,131.251022339,210.89692688,77.745816803,29.1234767914,43.6442089081,57.0059951782,347.036772156,135.755332947,224.423460388,367.024983215,80.4552230835,33.6032829285,56.5529441833,105.010406494
10,sub-08,single_session,T1w,0.974267244339,1.35735952854,0.604898143188,139.480529785,13.6094,12.061,14.6725,14.2441,0.176762767484,0.406914810829,0.416322421687,1.32965779305,1.02488465309,0.51104886399,1.46588650711,837.349609375,2347.25927734,2354.51025391,40,48,48,11.8781618614,8.3682841259,11.775376916,15.4908245422,4.0,5.33333349228,5.33333349228,204.348007202,100.905487061,122.701156616,190.210174561,88.3374885559,30.0265647888,33.5215377808,51.4220882416,355.803994751,286.392626953,233.596073914,368.638330078,79.1864013672,75.7910079956,61.29845047,99.9164199829
11,sub-11,single_session,T1w,0.870250225067,1.310308218,0.584743609416,243.202697754,13.0657,11.8193,14.1448,13.3415,0.258896336772,0.401763879453,0.339339783775,1.44116592407,0.573433041573,0.22125813449,1.14582124648,806.249633789,2023.77954102,1507.97021484,40,48,48,16.7727779966,9.85410699661,16.8310689627,23.6331580304,4.0,5.33333349228,5.33333349228,200.896774292,79.6344528198,133.284973145,210.745773315,77.665304184,35.8709037781,47.5932956696,59.7072330475,346.197311401,125.371304321,226.949707031,360.812612915,81.4773788452,28.9504070282,56.9344100952,103.665336609
12,sub-13,single_session,T1w,0.868193328381,1.54544448853,0.538360174772,368.930786133,13.5111,12.1714,14.0962,14.3759,0.243347987443,0.391594002412,0.365058010145,1.11308276653,0.603957104683,0.340307429547,1.31688475467,612.529724121,1877.50952148,1364.14013672,40,48,48,34.228183415,20.8747764333,34.3235547408,47.486219071,4.0,5.33333349228,5.33333349228,217.98298645,89.1285095215,142.817245483,230.296798706,84.9433174133,31.573727417,50.286224556,69.6694313049,378.130267334,148.328210449,251.112011719,392.158425903,89.7677688599,51.8970298767,63.0603904724,108.479957581
57 changes: 27 additions & 30 deletions mriqc/workflows/anatomical.py
Original file line number Diff line number Diff line change
Expand Up @@ -310,8 +310,7 @@ def _invt_flags(transforms):
(norm, invt, [('forward_transforms', 'transforms'),
(('forward_transforms', _invt_flags), 'invert_transform_flags')]),
(inputnode, invt, [('in_mask', 'reference_image')]),
(inputnode, combine, [('in_file', 'in_file'),
('head_mask', 'head_mask')]),
(inputnode, combine, [('head_mask', 'head_mask')]),
(invt, combine, [('output_image', 'artifact_msk')]),
(combine, qi1, [('out_file', 'air_msk')]),
(qi1, outputnode, [('out_air_msk', 'out_file'),
Expand Down Expand Up @@ -387,46 +386,28 @@ def _get_wm(in_file, wm_val=3, out_file=None):
nb.Nifti1Image(msk, imnii.get_affine(), imnii.get_header()).to_filename(out_file)
return out_file

def combine_masks(in_file, head_mask, artifact_msk, out_file=None):
def combine_masks(head_mask, artifact_msk, out_file=None):
"""Computes an air mask from the head and artifact masks"""
import os.path as op
import numpy as np
import nibabel as nb
from scipy import ndimage as sim

if out_file is None:
fname, ext = op.splitext(op.basename(in_file))
fname, ext = op.splitext(op.basename(head_mask))
if ext == '.gz':
fname, ext2 = op.splitext(fname)
ext = ext2 + ext
out_file = op.abspath('%s_combined%s' % (fname, ext))

imdata = nb.load(in_file).get_data()
msk = np.ones_like(imdata, dtype=np.uint8)
msk[imdata <= 0] = 0

imnii = nb.load(head_mask)
hmdata = imnii.get_data()

msk = np.ones_like(hmdata, dtype=np.uint8)
msk[hmdata == 1] = 0

adata = nb.load(artifact_msk).get_data()
msk[adata == 1] = 0

struc = sim.iterate_structure(sim.generate_binary_structure(3, 1), 3)
msk = sim.binary_opening(msk, struc).astype(np.uint8) # pylint: disable=no-member

# Remove small objects
label_im, nb_labels = sim.label(msk)
if nb_labels > 2:
sizes = sim.sum(msk, label_im, range(nb_labels + 1))
ordered = list(reversed(sorted(zip(sizes, range(nb_labels + 1)))))
for _, label in ordered[2:]:
msk[label_im == label] = 0

msk = sim.binary_closing(msk, struc).astype(np.uint8) # pylint: disable=no-member
struc = sim.iterate_structure(sim.generate_binary_structure(3, 1), 4)
msk = sim.binary_fill_holes(msk, struc).astype(np.uint8) # pylint: disable=no-member

nb.Nifti1Image(msk, imnii.get_affine(), imnii.get_header()).to_filename(out_file)
return out_file

Expand All @@ -446,9 +427,15 @@ def image_gradient(in_file, compute_abs=True, out_file=None):

imnii = nb.load(in_file)
data = imnii.get_data().astype(np.float32) # pylint: disable=no-member
sigma = 1e-3 * data[data > 0].std() # pylint: disable=no-member
range_max = np.percentile(data.reshape(-1), 90.)
data *= (100/range_max)
sigma = 1e-4 * data[data > 0].std(ddof=1) # pylint: disable=no-member
grad = gradient(data, sigma)

while grad.sum() < 1.e4:
sigma *= 1.5
grad = gradient(data, sigma)

if compute_abs:
grad = np.abs(grad)

Expand All @@ -460,8 +447,8 @@ def gradient_threshold(in_file, thresh=1.0, out_file=None):
import os.path as op
import numpy as np
import nibabel as nb
from scipy.ndimage import (generate_binary_structure, iterate_structure,
binary_closing, binary_fill_holes)
from scipy import ndimage as sim

thresh *= 1e-2
if out_file is None:
fname, ext = op.splitext(op.basename(in_file))
Expand All @@ -484,9 +471,19 @@ def gradient_threshold(in_file, thresh=1.0, out_file=None):

mask = np.zeros_like(data, dtype=np.uint8) # pylint: disable=no-member
mask[data > out_thresh] = 1
struc = iterate_structure(generate_binary_structure(3, 1), 2)
mask = binary_closing(mask, struc).astype(np.uint8) # pylint: disable=no-member
mask = binary_fill_holes(mask, struc).astype(np.uint8) # pylint: disable=no-member
struc = sim.iterate_structure(sim.generate_binary_structure(3, 2), 2)
mask = sim.binary_opening(mask, struc).astype(np.uint8) # pylint: disable=no-member

# Remove small objects
label_im, nb_labels = sim.label(mask)
if nb_labels > 2:
sizes = sim.sum(mask, label_im, range(nb_labels + 1))
ordered = list(reversed(sorted(zip(sizes, range(nb_labels + 1)))))
for _, label in ordered[2:]:
mask[label_im == label] = 0

mask = sim.binary_closing(mask, struc).astype(np.uint8) # pylint: disable=no-member
mask = sim.binary_fill_holes(mask, struc).astype(np.uint8) # pylint: disable=no-member

hdr = imnii.get_header().copy()
hdr.set_data_dtype(np.uint8) # pylint: disable=no-member
Expand Down

0 comments on commit fb6382a

Please sign in to comment.