File: vmtkimagecompare.py

package info (click to toggle)
vmtk 1.0.1-3
  • links: PTS, VCS
  • area: non-free
  • in suites: jessie, jessie-kfreebsd
  • size: 8,632 kB
  • ctags: 8,076
  • sloc: cpp: 79,872; ansic: 31,817; python: 18,860; perl: 381; makefile: 118; sh: 15; tcl: 1
file content (101 lines) | stat: -rw-r--r-- 3,531 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#!/usr/bin/env python

import sys
import vtk
import vtkvmtk
import pypes

vmtkimagecompare = 'vmtkImageCompare'

class vmtkImageCompare(pypes.pypeScript):

    def __init__(self):

        pypes.pypeScript.__init__(self)

        self.Image = None
        self.ReferenceImage = None
        self.Method = ''
	self.Tolerance = 1E-8
        self.Result = ''
        self.ResultLog = ''

        self.SetScriptName('vmtkimagecompare')
        self.SetScriptDoc('compares an image against a reference')
        self.SetInputMembers([
            ['Image','i','vtkImageData',1,'','the input image','vmtkimagereader'],
            ['ReferenceImage','r','vtkImageData',1,'','the reference image to compare against','vmtkimagereader'],
            ['Method','method','str',1,'["subtraction","range"]','method of the test'],
            ['Tolerance','tolerance','float',1,'','tolerance for numerical comparisons'],
            ])
        self.SetOutputMembers([
            ['Result','result','bool',1,'','Output boolean stating if images are equal or not'],
            ['ResultLog','log','str',1,'','Result Log']
            ])

    def rangeCompare(self):

        imageRange = self.Image.GetPointData().GetScalars().GetRange()
        referenceRange = self.ReferenceImage.GetPointData().GetScalars().GetRange()
        rangeDiff = (imageRange[0] - referenceRange[0], imageRange[1] - referenceRange[1])

        self.InputInfo('Image Range: '+ str(imageRange))
        self.InputInfo('Reference Image Range: '+ str(referenceRange))
        self.InputInfo('Range Difference: '+ str(rangeDiff))

        if max([abs(d) for d in rangeDiff]) < self.Tolerance:
            return True
 
        return False

    def subtractionCompare(self):

        imagePoints = self.Image.GetNumberOfPoints()
        referencePoints = self.ReferenceImage.GetNumberOfPoints()

        self.InputInfo('Image Points: ' + str(imagePoints))
        self.InputInfo('Reference Image Points: ' + str(referencePoints))

        if abs(imagePoints - referencePoints) > 0 :
            self.ResultLog = 'Uneven NumberOfPoints'
            return False
            
        imageScalarType = self.Image.GetScalarType()
        referenceScalarType = self.ReferenceImage.GetScalarType()
        minScalarType = min(imageScalarType,referenceScalarType)
        self.Image.SetScalarType(minScalarType) 
        self.ReferenceImage.SetScalarType(minScalarType) 

        imageMath = vtk.vtkImageMathematics()
        imageMath.SetInput1(self.Image) 
        imageMath.SetInput2(self.ReferenceImage) 
        imageMath.SetOperationToSubtract()
        imageMath.Update()
        differenceImage = imageMath.GetOutput()
        differenceRange = differenceImage.GetPointData().GetScalars().GetRange()

        self.InputInfo('Difference Range: ' + str(differenceRange))
 
        if max([abs(d) for d in differenceRange]) < self.Tolerance:
            return True
        
        return False

    def Execute(self):

        if not self.Image:
            self.PrintError('Error: No image.')
        if not self.ReferenceImage:
            self.PrintError('Error: No reference image.')
        if not self.Method:
            self.PrintError('Error: No method.')        
        
        if (self.Method == 'subtraction'):
            self.Result = self.subtractionCompare()
        elif (self.Method == 'range'):
            self.Result = self.rangeCompare()
        
if __name__=='__main__':
    main = pypes.pypeMain()
    main.Arguments = sys.argv
    main.Execute()