Thursday, June 16, 2005

บันทึก: June 16, 2005

  1. กลัวว่าจะทำ control point ต้นฉบับหายก็เลยเอามาเซฟไว้ที่นี้ด้วย

    int
    PaModelBuilder::initPhase1H001( float* arControlPts ) {
    float* b = arControlPts;

    int nAdjust = -3;

    /*** TRUNK ***/
    b[ 4+nAdjust] = 137; b[ 5+nAdjust] = 122; b[ 6+nAdjust] = 109;
    b[ 7+nAdjust] = 138; b[ 8+nAdjust] = 117; b[ 9+nAdjust] = 112;
    b[10+nAdjust] = 140; b[11+nAdjust] = 107; b[12+nAdjust] = 121;
    b[13+nAdjust] = 142; b[14+nAdjust] = 89; b[15+nAdjust] = 132;

    /*** LEFT ***/
    b[16+nAdjust] = 169; b[17+nAdjust] = 200; b[18+nAdjust] = 105;
    b[19+nAdjust] = 146; b[20+nAdjust] = 187; b[21+nAdjust] = 89;
    b[22+nAdjust] = 137; b[23+nAdjust] = 168; b[24+nAdjust] = 84;
    b[25+nAdjust] = 136; b[26+nAdjust] = 160; b[27+nAdjust] = 85;
    b[28+nAdjust] = 134; b[29+nAdjust] = 148; b[30+nAdjust] = 93;
    b[31+nAdjust] = 133; b[32+nAdjust] = 136; b[33+nAdjust] = 103; //Bifurcation point

    /*** RIGHT ***/
    b[34+nAdjust] = 128; b[35+nAdjust] = 146; b[36+nAdjust] = 102;
    b[37+nAdjust] = 121; b[38+nAdjust] = 155; b[39+nAdjust] = 105;
    b[40+nAdjust] = 109; b[41+nAdjust] = 163; b[42+nAdjust] = 107;
    b[43+nAdjust] = 100; b[44+nAdjust] = 167; b[45+nAdjust] = 109;
    b[46+nAdjust] = 93; b[47+nAdjust] = 168; b[48+nAdjust] = 112;

    return 15; //The number of control points.
    }

    int
    PaModelBuilder::initPhase1H002( float* arControlPts ) {
    float* b = arControlPts;

    int nAdjust = -3;

    /*** TRUNK ***/
    b[ 4+nAdjust] = 148; b[ 5+nAdjust] = 135; b[ 6+nAdjust] = 146;
    b[ 7+nAdjust] = 150; b[ 8+nAdjust] = 127; b[ 9+nAdjust] = 150;
    b[10+nAdjust] = 151; b[11+nAdjust] = 120; b[12+nAdjust] = 155;
    b[13+nAdjust] = 155; b[14+nAdjust] = 101; b[15+nAdjust] = 170;

    /*** LEFT ***/
    b[16+nAdjust] = 171; b[17+nAdjust] = 201; b[18+nAdjust] = 139;
    b[19+nAdjust] = 167; b[20+nAdjust] = 200; b[21+nAdjust] = 131;
    b[22+nAdjust] = 159; b[23+nAdjust] = 182; b[24+nAdjust] = 135;
    b[25+nAdjust] = 148; b[26+nAdjust] = 162; b[27+nAdjust] = 135;
    b[28+nAdjust] = 147; b[29+nAdjust] = 154; b[30+nAdjust] = 138;
    b[31+nAdjust] = 146; b[32+nAdjust] = 145; b[33+nAdjust] = 141; //Bifurcation point

    /*** RIGHT ***/
    b[34+nAdjust] = 126; b[35+nAdjust] = 145; b[36+nAdjust] = 149;
    b[37+nAdjust] = 129; b[38+nAdjust] = 155; b[39+nAdjust] = 150;
    b[40+nAdjust] = 122; b[41+nAdjust] = 162; b[42+nAdjust] = 154;
    b[43+nAdjust] = 118; b[44+nAdjust] = 165; b[45+nAdjust] = 157;
    b[46+nAdjust] = 104; b[47+nAdjust] = 172; b[48+nAdjust] = 158;

    return 15; //The number of control points.
    }

    int
    PaModelBuilder::initPhase2H048( float* arControlPts ) {
    float* b = arControlPts;

    int nAdjust = -3;

    /*** TRUNK ***/
    b[ 4+nAdjust] = 162; b[ 5+nAdjust] = 134; b[ 6+nAdjust] = 100;
    b[ 7+nAdjust] = 168; b[ 8+nAdjust] = 116; b[ 9+nAdjust] = 113;
    b[10+nAdjust] = 176; b[11+nAdjust] = 96; b[12+nAdjust] = 136;
    b[13+nAdjust] = 182; b[14+nAdjust] = 92; b[15+nAdjust] = 160;

    /*** LEFT ***/
    b[16+nAdjust] = 200; b[17+nAdjust] = 232; b[18+nAdjust] = 100;
    b[19+nAdjust] = 180; b[20+nAdjust] = 211; b[21+nAdjust] = 86;
    b[22+nAdjust] = 162; b[23+nAdjust] = 183; b[24+nAdjust] = 88;
    b[25+nAdjust] = 159; b[26+nAdjust] = 168; b[27+nAdjust] = 88;
    b[28+nAdjust] = 157; b[29+nAdjust] = 158; b[30+nAdjust] = 93;
    b[31+nAdjust] = 157; b[32+nAdjust] = 149; b[33+nAdjust] = 97; //Bifurcation point

    /*** RIGHT ***/
    b[34+nAdjust] = 141; b[35+nAdjust] = 154; b[36+nAdjust] = 103;
    b[37+nAdjust] = 128; b[38+nAdjust] = 160; b[39+nAdjust] = 109;
    b[40+nAdjust] = 122; b[41+nAdjust] = 167; b[42+nAdjust] = 113;
    b[43+nAdjust] = 114; b[44+nAdjust] = 168; b[45+nAdjust] = 118;
    b[46+nAdjust] = 103; b[47+nAdjust] = 168; b[48+nAdjust] = 124;

    return 15; //The number of control points.
    }

  2. Method to improve the result for all cases:
    Because of the number of control points is too small to address some complex curves of blood vessels, we can make additional recovery. The recovery process can be done in two folds: 1. Perpendicular to the axis (maybe more suitable for pulmonary artery)
    2. Independently from the axis by starting from 3 crucial points (for aorta)

  3. Things needed to be investigated:
    • Change the propotion of weight in optimization process (ลองแล้ว ก็ไม่ค่อยเปลี่ยน)
    • Independent search for each part of pulmonary artery (ไม่ค่อย make sense แ่ต่ก็จะลอง)
    • Make an explicit backup of best control points in global optimization process (ลองแล้วเหมือนเดิม)
    • Increase the number of control points to check if there is any improvement
    • Make an x-y scaling of coordinates before start model matching (ลองแล้วไม่ค่อยได้ผล)
    • I now know the reason of failure. The angle of the three parts of pulmonary artery is different from person to person. Although we try to add more models, it is very likely that the problem still persists. However, locating bifurcation point of Pa is reliable enough to do additional recovery.

No comments: