Commit c41c4815f8f0e80e8d1c73df3c5579a4d8293529
1 parent
42876a25
Exists in
orientation
Taking account direction cosines and the signed distance to know if a sagital ca…
…se is stacked L->R or R->L
Showing
1 changed file
with
38 additions
and
6 deletions
Show diff stats
invesalius/data/imagedata_utils.py
| ... | ... | @@ -438,16 +438,48 @@ def get_stacking_direction(files, orientation): |
| 438 | 438 | r2.Update() |
| 439 | 439 | p2 = r2.GetImagePositionPatient() |
| 440 | 440 | |
| 441 | + dc = r1.GetMedicalImageProperties().GetDirectionCosine() | |
| 442 | + dc1 = numpy.array(dc[:3]) | |
| 443 | + dc2 = numpy.array(dc[3:]) | |
| 444 | + dc3 = numpy.cross(dc1, dc2) | |
| 445 | + | |
| 446 | + distp = numpy.array(p2) - numpy.array(p1) | |
| 447 | + ndistp = distp / numpy.linalg.norm(distp) | |
| 448 | + distv = numpy.dot(dc3, ndistp) | |
| 449 | + | |
| 441 | 450 | if orientation == 'SAGITTAL': |
| 442 | - d = (p2[0] - p1[0]) | |
| 451 | + | |
| 452 | + if dc3[0] < 0: | |
| 453 | + if distv > 0: | |
| 454 | + dirx = -1 | |
| 455 | + else: | |
| 456 | + dirx = 1 | |
| 457 | + else: | |
| 458 | + if distv < 0: | |
| 459 | + dirx = -1 | |
| 460 | + else: | |
| 461 | + dirx = 1 | |
| 462 | + | |
| 463 | + ds = [ dirx, | |
| 464 | + -1 if dc1[1] < 0 else 1, | |
| 465 | + -1 if dc2[2] < 0 else 1, | |
| 466 | + ] | |
| 443 | 467 | |
| 444 | 468 | elif orientation == 'CORONAL': |
| 445 | 469 | d = (p2[1] - p1[1]) |
| 470 | + d = int(d / abs(d)) | |
| 471 | + ds = [] | |
| 446 | 472 | |
| 447 | 473 | else: |
| 448 | 474 | d = (p2[2] - p1[2]) |
| 475 | + d = int(d / abs(d)) | |
| 476 | + ds = [] | |
| 477 | + | |
| 478 | + print "===================================" | |
| 479 | + print dc1, dc2, dc3, ds, p2, p1, p2, distv | |
| 480 | + print "===================================" | |
| 449 | 481 | |
| 450 | - return int(d / abs(d)) | |
| 482 | + return ds | |
| 451 | 483 | |
| 452 | 484 | |
| 453 | 485 | def dcm2memmap(files, slice_size, orientation, resolution_percentage): |
| ... | ... | @@ -514,14 +546,14 @@ def dcm2memmap(files, slice_size, orientation, resolution_percentage): |
| 514 | 546 | elif orientation == 'SAGITTAL': |
| 515 | 547 | array.shape = matrix.shape[0], matrix.shape[1] |
| 516 | 548 | |
| 517 | - print ">>>", d, dcm_reader.GetImagePositionPatient(), dcm_reader.GetDirectionCosines() | |
| 549 | + #print ">>>", d, dcm_reader.GetImagePositionPatient(), dcm_reader.GetMedicalImageProperties().GetDirectionCosine() | |
| 518 | 550 | |
| 519 | 551 | # stacking from right to left |
| 520 | - if d == 1: | |
| 521 | - matrix[:, :,n] = array[:, ::-1] | |
| 552 | + if d[0] == 1: | |
| 553 | + matrix[:, :, n] = array[::d[1], ::d[2]] | |
| 522 | 554 | # stacking from left to right |
| 523 | 555 | else: |
| 524 | - matrix[:, :,-n-1] = array[:, ::-1] | |
| 556 | + matrix[:, :, -n-1] = array[::d[1], ::d[2]] | |
| 525 | 557 | else: |
| 526 | 558 | print array.shape, matrix.shape |
| 527 | 559 | array.shape = matrix.shape[1], matrix.shape[2] | ... | ... |