Commit c00a783831e9e39f2d8e3a4b0fa9a7d4c5df5b92
1 parent
1de98e05
Exists in
invesalius-libift
Added image processing tools (with ift library)
Showing
20 changed files
with
1032 additions
and
18 deletions
Show diff stats
.gitattributes
... | ... | @@ -154,6 +154,20 @@ icons/zh_TW.bmp -text |
154 | 154 | invesalius/.svnignore -text |
155 | 155 | invesalius/data/bases.py -text |
156 | 156 | invesalius/data/co_registration.py -text |
157 | +invesalius/libc/__init__.py -text | |
158 | +invesalius/libc/libalign/__init__.py -text | |
159 | +invesalius/libc/libalign/libalign.py -text | |
160 | +invesalius/libc/libift/Makefile -text | |
161 | +invesalius/libc/libift/__init__.py -text | |
162 | +invesalius/libc/libift/libift.c -text | |
163 | +invesalius/libc/libift/libift.i -text | |
164 | +invesalius/libc/libift/makefile.vc -text | |
165 | +invesalius/libc/libscnvtk/Makefile -text | |
166 | +invesalius/libc/libscnvtk/__init__.py -text | |
167 | +invesalius/libc/libscnvtk/libscnvtk.py -text | |
168 | +invesalius/libc/libscnvtk/makefile.vc -text | |
169 | +invesalius/libc/libscnvtk/scnvtk.cxx -text | |
170 | +invesalius/libc/libscnvtk/scnvtk.i -text | |
157 | 171 | locale/de/LC_MESSAGES/invesalius.mo -text |
158 | 172 | locale/el/LC_MESSAGES/invesalius.mo -text |
159 | 173 | locale/en/LC_MESSAGES/invesalius.mo -text | ... | ... |
invesalius/constants.py
... | ... | @@ -430,7 +430,16 @@ VTK_WARNING = 0 |
430 | 430 | |
431 | 431 | [ID_DICOM_IMPORT, ID_PROJECT_OPEN, ID_PROJECT_SAVE_AS, ID_PROJECT_SAVE, |
432 | 432 | ID_PROJECT_CLOSE, ID_PROJECT_INFO, ID_SAVE_SCREENSHOT, ID_DICOM_LOAD_NET, |
433 | -ID_PRINT_SCREENSHOT, ID_EXIT, ID_IMPORT_OTHERS_FILES, ID_ANALYZE_IMPORT] = [wx.NewId() for number in range(12)] | |
433 | +ID_ALIGN, ID_PRINT_SCREENSHOT, ID_EXIT, ID_IMPORT_OTHERS_FILES, ID_EXPORT_OTHERS_FILES, ID_ANALYZE_IMPORT, ID_ANALYZE_EXPORT] = [wx.NewId() for number in range(15)] | |
434 | + | |
435 | +ID_GAUSSIAN = wx.NewId() | |
436 | +ID_MEDIAN = wx.NewId() | |
437 | +ID_MODE = wx.NewId() | |
438 | +ID_SOBEL = wx.NewId() | |
439 | +ID_HISTEQ = wx.NewId() | |
440 | +ID_INTERP = wx.NewId() | |
441 | +ID_ERASEBG = wx.NewId() | |
442 | +ID_ERASESUP = wx.NewId() | |
434 | 443 | |
435 | 444 | |
436 | 445 | [ID_EDIT_UNDO, ID_EDIT_REDO, ID_EDIT_LIST] =\ |
... | ... | @@ -493,3 +502,4 @@ STYLE_LEVEL = {SLICE_STATE_EDITOR: 1, |
493 | 502 | STATE_ZOOM_SL: 2, |
494 | 503 | STATE_PAN:2, |
495 | 504 | VOLUME_STATE_SEED:1} |
505 | + | ... | ... |
invesalius/control.py
... | ... | @@ -35,6 +35,9 @@ import reader.analyze_reader as analyze |
35 | 35 | import reader.dicom_grouper as dg |
36 | 36 | import reader.dicom_reader as dcm |
37 | 37 | import session as ses |
38 | +import libc.libalign.libalign as libalign | |
39 | +import libc.libift.libift as libift | |
40 | +import libc.libscnvtk.libscnvtk as libscnvtk | |
38 | 41 | |
39 | 42 | from utils import debug |
40 | 43 | |
... | ... | @@ -63,6 +66,16 @@ class Controller(): |
63 | 66 | |
64 | 67 | ps.Publisher().subscribe(self.OnShowDialogSaveProject, 'Show save dialog') |
65 | 68 | |
69 | + ps.Publisher().subscribe(self.OnAlignVolume, 'Align volume') | |
70 | + ps.Publisher().subscribe(self.Tools_Gaussian, 'Tools gaussian') | |
71 | + ps.Publisher().subscribe(self.Tools_Median, 'Tools median') | |
72 | + ps.Publisher().subscribe(self.Tools_Mode, 'Tools mode') | |
73 | + ps.Publisher().subscribe(self.Tools_Sobel, 'Tools sobel') | |
74 | + ps.Publisher().subscribe(self.Tools_EraseBackground, 'Tools erase background') | |
75 | + ps.Publisher().subscribe(self.Tools_EraseSupport, 'Tools erase support') | |
76 | + ps.Publisher().subscribe(self.Tools_HistogramEqualization, 'Tools histogram equalization') | |
77 | + ps.Publisher().subscribe(self.Tools_Interpolation, 'Tools interpolation') | |
78 | + | |
66 | 79 | ps.Publisher().subscribe(self.LoadRaycastingPreset, |
67 | 80 | 'Load raycasting preset') |
68 | 81 | ps.Publisher().subscribe(self.SaveRaycastingPreset, |
... | ... | @@ -75,7 +88,8 @@ class Controller(): |
75 | 88 | ps.Publisher().subscribe(self.OnShowDialogCloseProject, 'Close Project') |
76 | 89 | ps.Publisher().subscribe(self.OnOpenProject, 'Open project') |
77 | 90 | ps.Publisher().subscribe(self.OnOpenRecentProject, 'Open recent project') |
78 | - ps.Publisher().subscribe(self.OnShowAnalyzeFile, 'Show analyze dialog') | |
91 | + ps.Publisher().subscribe(self.OnShowImportAnalyzeFile, 'Show analyze import dialog') | |
92 | + ps.Publisher().subscribe(self.OnShowExportAnalyzeFile, 'Show analyze export dialog') | |
79 | 93 | |
80 | 94 | |
81 | 95 | def OnCancelImport(self, pubsub_evt): |
... | ... | @@ -84,11 +98,146 @@ class Controller(): |
84 | 98 | |
85 | 99 | |
86 | 100 | ########################### |
101 | + | |
102 | + def OnAlignVolume(self, pubsub_evt): | |
103 | + #bi = wx.BusyInfo("Working, please wait...", self) | |
104 | + proj = prj.Project() | |
105 | + newimg = libalign.VolumeAlign(proj.imagedata) | |
106 | + #bi.Destroy() | |
107 | + self.CloseProject() | |
108 | + self.CreateAnalyzeProject(newimg) | |
109 | + self.LoadProject() | |
110 | + ps.Publisher().sendMessage("Enable state project", True) | |
111 | + | |
112 | + | |
113 | +########################### | |
114 | + | |
115 | + def Tools_Gaussian(self, pubsub_evt): | |
116 | + print "Running gaussian smoothing..." | |
117 | + adj=libift.Spheric(2) | |
118 | + kernel = libift.GaussianKernel3(adj,2) | |
119 | + kernel2 = libift.NormalizeKernel3(kernel) | |
120 | + scn = libscnvtk.VtkImageDataToScene(prj.Project().imagedata) | |
121 | + flag=libift.ShiftScene(scn) | |
122 | + scn2 = libift.LinearFilter3(scn,kernel2) | |
123 | + libift.NewDestroyScene(scn) | |
124 | + libift.UnShiftScene(scn2,flag) | |
125 | + newimg = libscnvtk.SceneToVtkImageData(scn2) | |
126 | + libift.NewDestroyScene(scn2) | |
127 | + self.CloseProject() | |
128 | + self.CreateAnalyzeProject(newimg) | |
129 | + self.LoadProject() | |
130 | + ps.Publisher().sendMessage("Enable state project", True) | |
131 | + | |
132 | + def Tools_Median(self, pubsub_evt): | |
133 | + print "Running median filter..." | |
134 | + adj=libift.Spheric(2) | |
135 | + scn = libscnvtk.VtkImageDataToScene(prj.Project().imagedata) | |
136 | + flag=libift.ShiftScene(scn) | |
137 | + scn2 = libift.MedianFilter3(scn,adj) | |
138 | + libift.NewDestroyScene(scn) | |
139 | + libift.UnShiftScene(scn2,flag) | |
140 | + newimg = libscnvtk.SceneToVtkImageData(scn2) | |
141 | + libift.NewDestroyScene(scn2) | |
142 | + self.CloseProject() | |
143 | + self.CreateAnalyzeProject(newimg) | |
144 | + self.LoadProject() | |
145 | + ps.Publisher().sendMessage("Enable state project", True) | |
146 | + | |
147 | + def Tools_Mode(self, pubsub_evt): | |
148 | + print "Running mode filter..." | |
149 | + adj=libift.Spheric(2) | |
150 | + scn = libscnvtk.VtkImageDataToScene(prj.Project().imagedata) | |
151 | + flag=libift.ShiftScene(scn) | |
152 | + scn2 = libift.ModeFilter3(scn,adj) | |
153 | + libift.NewDestroyScene(scn) | |
154 | + libift.UnShiftScene(scn2,flag) | |
155 | + newimg = libscnvtk.SceneToVtkImageData(scn2) | |
156 | + libift.NewDestroyScene(scn2) | |
157 | + self.CloseProject() | |
158 | + self.CreateAnalyzeProject(newimg) | |
159 | + self.LoadProject() | |
160 | + ps.Publisher().sendMessage("Enable state project", True) | |
161 | + | |
162 | + def Tools_Sobel(self, pubsub_evt): | |
163 | + print "Running sobel filter..." | |
164 | + scn = libscnvtk.VtkImageDataToScene(prj.Project().imagedata) | |
165 | + flag=libift.ShiftScene(scn) | |
166 | + scn2 = libift.SobelFilter3(scn) | |
167 | + libift.NewDestroyScene(scn) | |
168 | + libift.UnShiftScene(scn2,flag) | |
169 | + newimg = libscnvtk.SceneToVtkImageData(scn2) | |
170 | + libift.NewDestroyScene(scn2) | |
171 | + self.CloseProject() | |
172 | + self.CreateAnalyzeProject(newimg) | |
173 | + self.LoadProject() | |
174 | + ps.Publisher().sendMessage("Enable state project", True) | |
175 | + | |
176 | + def Tools_EraseBackground(self, pubsub_evt): | |
177 | + print "Running erase background..." | |
178 | + scn = libscnvtk.VtkImageDataToScene(prj.Project().imagedata) | |
179 | + flag=libift.ShiftScene(scn) | |
180 | + scn2 = libift.EraseBackground(scn) | |
181 | + libift.NewDestroyScene(scn) | |
182 | + libift.UnShiftScene(scn2,flag) | |
183 | + newimg = libscnvtk.SceneToVtkImageData(scn2) | |
184 | + libift.NewDestroyScene(scn2) | |
185 | + self.CloseProject() | |
186 | + self.CreateAnalyzeProject(newimg) | |
187 | + self.LoadProject() | |
188 | + ps.Publisher().sendMessage("Enable state project", True) | |
189 | + | |
190 | + def Tools_EraseSupport(self, pubsub_evt): | |
191 | + print "Running erase support..." | |
192 | + scn = libscnvtk.VtkImageDataToScene(prj.Project().imagedata) | |
193 | + flag=libift.ShiftScene(scn) | |
194 | + scn2 = libift.EraseSupport(scn) | |
195 | + libift.NewDestroyScene(scn) | |
196 | + libift.UnShiftScene(scn2,flag) | |
197 | + newimg = libscnvtk.SceneToVtkImageData(scn2) | |
198 | + libift.NewDestroyScene(scn2) | |
199 | + self.CloseProject() | |
200 | + self.CreateAnalyzeProject(newimg) | |
201 | + self.LoadProject() | |
202 | + ps.Publisher().sendMessage("Enable state project", True) | |
203 | + | |
204 | + def Tools_HistogramEqualization(self, pubsub_evt): | |
205 | + print "Running histogram equalization..." | |
206 | + scn = libscnvtk.VtkImageDataToScene(prj.Project().imagedata) | |
207 | + flag=libift.ShiftScene(scn) | |
208 | + scn2 = libift.Equalize3(scn,4095) | |
209 | + libift.NewDestroyScene(scn) | |
210 | + libift.UnShiftScene(scn2,flag) | |
211 | + newimg = libscnvtk.SceneToVtkImageData(scn2) | |
212 | + libift.NewDestroyScene(scn2) | |
213 | + self.CloseProject() | |
214 | + self.CreateAnalyzeProject(newimg) | |
215 | + self.LoadProject() | |
216 | + ps.Publisher().sendMessage("Enable state project", True) | |
217 | + | |
218 | + def Tools_Interpolation(self, pubsub_evt): | |
219 | + print "Running histogram equalization..." | |
220 | + scn = libscnvtk.VtkImageDataToScene(prj.Project().imagedata) | |
221 | + scn2 = libift.LinearInterp(scn,0,0,0) | |
222 | + libift.NewDestroyScene(scn) | |
223 | + newimg = libscnvtk.SceneToVtkImageData(scn2) | |
224 | + libift.NewDestroyScene(scn2) | |
225 | + self.CloseProject() | |
226 | + self.CreateAnalyzeProject(newimg) | |
227 | + self.LoadProject() | |
228 | + ps.Publisher().sendMessage("Enable state project", True) | |
229 | + | |
230 | + | |
231 | + | |
232 | +########################### | |
87 | 233 | ########################### |
88 | 234 | |
89 | 235 | def OnShowDialogImportDirectory(self, pubsub_evt): |
90 | 236 | self.ShowDialogImportDirectory() |
91 | 237 | |
238 | + # def OnShowDialogImportAnalyze(self, pubsub_evt): | |
239 | + # self.ShowDialogImportAnalyze() | |
240 | + | |
92 | 241 | def OnShowDialogOpenProject(self, pubsub_evt): |
93 | 242 | self.ShowDialogOpenProject() |
94 | 243 | |
... | ... | @@ -99,15 +248,24 @@ class Controller(): |
99 | 248 | def OnShowDialogCloseProject(self, pubsub_evt): |
100 | 249 | self.ShowDialogCloseProject() |
101 | 250 | |
102 | - def OnShowAnalyzeFile(self, pubsub_evt): | |
251 | + def OnShowImportAnalyzeFile(self, pubsub_evt): | |
103 | 252 | dirpath = dialog.ShowOpenAnalyzeDialog() |
104 | 253 | imagedata = analyze.ReadAnalyze(dirpath) |
105 | 254 | if imagedata: |
106 | 255 | self.CreateAnalyzeProject(imagedata) |
107 | - | |
108 | 256 | self.LoadProject() |
109 | 257 | ps.Publisher().sendMessage("Enable state project", True) |
110 | 258 | |
259 | + def OnShowExportAnalyzeFile(self, pubsub_evt): | |
260 | + dirpath = dialog.ShowSaveAnalyzeDialog() | |
261 | + proj = prj.Project() | |
262 | + name=dirpath.encode('utf-8') | |
263 | + libalign.libscnvtk.WriteVtkImageData(proj.imagedata,name) | |
264 | + wx.MessageBox(_("Written successfully!"), 'Info') | |
265 | + | |
266 | + | |
267 | + | |
268 | + | |
111 | 269 | |
112 | 270 | ########################### |
113 | 271 | |
... | ... | @@ -127,7 +285,8 @@ class Controller(): |
127 | 285 | dialog.ImportEmptyDirectory(dirpath) |
128 | 286 | elif dirpath: |
129 | 287 | self.StartImportPanel(dirpath) |
130 | - ps.Publisher().sendMessage("Load data to import panel", dirpath) | |
288 | + #ps.Publisher().sendMessage("Load data to import panel", dirpath) | |
289 | + | |
131 | 290 | |
132 | 291 | def ShowDialogOpenProject(self): |
133 | 292 | # Offer to save current project if necessary | ... | ... |
invesalius/gui/dialogs.py
... | ... | @@ -192,6 +192,34 @@ def ShowOpenAnalyzeDialog(): |
192 | 192 | os.chdir(current_dir) |
193 | 193 | return filepath |
194 | 194 | |
195 | +def ShowSaveAnalyzeDialog(): | |
196 | + # Default system path | |
197 | + current_dir = os.path.abspath(".") | |
198 | + dlg = wx.FileDialog(None, message=_("Export Analyze File..."), | |
199 | + defaultDir="", | |
200 | + defaultFile="", wildcard=WILDCARD_ANALYZE, | |
201 | + style=wx.SAVE|wx.CHANGE_DIR) | |
202 | + | |
203 | + # inv3 filter is default | |
204 | + dlg.SetFilterIndex(0) | |
205 | + | |
206 | + # Show the dialog and retrieve the user response. If it is the OK response, | |
207 | + # process the data. | |
208 | + filepath = None | |
209 | + try: | |
210 | + if dlg.ShowModal() == wx.ID_OK: | |
211 | + # This returns a Python list of files that were selected. | |
212 | + filepath = dlg.GetPath() | |
213 | + except(wx._core.PyAssertionError): #FIX: win64 | |
214 | + filepath = dlg.GetPath() | |
215 | + | |
216 | + # Destroy the dialog. Don't do this until you are done with it! | |
217 | + # BAD things can happen otherwise! | |
218 | + dlg.Destroy() | |
219 | + os.chdir(current_dir) | |
220 | + return filepath | |
221 | + | |
222 | + | |
195 | 223 | |
196 | 224 | def ShowImportDirDialog(): |
197 | 225 | current_dir = os.path.abspath(".") | ... | ... |
invesalius/gui/frame.py
... | ... | @@ -145,11 +145,13 @@ class Frame(wx.Frame): |
145 | 145 | t2 = LayoutToolBar(self) |
146 | 146 | t3 = ObjectToolBar(self) |
147 | 147 | t4 = SliceToolBar(self) |
148 | + t5 = ImageProcessingToolBar(self) | |
148 | 149 | else: |
149 | - t4 = ProjectToolBar(self) | |
150 | - t3 = LayoutToolBar(self) | |
151 | - t2 = ObjectToolBar(self) | |
152 | - t1 = SliceToolBar(self) | |
150 | + t5 = ProjectToolBar(self) | |
151 | + t4 = LayoutToolBar(self) | |
152 | + t3 = ObjectToolBar(self) | |
153 | + t2 = SliceToolBar(self) | |
154 | + t1 = ImageProcessingToolBar(self) | |
153 | 155 | |
154 | 156 | aui_manager.AddPane(t1, wx.aui.AuiPaneInfo(). |
155 | 157 | Name("General Features Toolbar"). |
... | ... | @@ -171,6 +173,11 @@ class Frame(wx.Frame): |
171 | 173 | ToolbarPane().Top().Floatable(False). |
172 | 174 | LeftDockable(False).RightDockable(False)) |
173 | 175 | |
176 | + aui_manager.AddPane(t5, wx.aui.AuiPaneInfo(). | |
177 | + Name("Image Processing Toolbar"). | |
178 | + ToolbarPane().Top().Floatable(False). | |
179 | + LeftDockable(False).RightDockable(False)) | |
180 | + | |
174 | 181 | aui_manager.Update() |
175 | 182 | self.aui_manager = aui_manager |
176 | 183 | |
... | ... | @@ -296,12 +303,32 @@ class Frame(wx.Frame): |
296 | 303 | self.ShowOpenProject() |
297 | 304 | elif id == const.ID_ANALYZE_IMPORT: |
298 | 305 | self.ShowAnalyzeImporter() |
306 | + elif id == const.ID_ANALYZE_EXPORT: | |
307 | + self.ShowAnalyzeExporter() | |
299 | 308 | elif id == const.ID_PROJECT_SAVE: |
300 | 309 | session = ses.Session() |
301 | 310 | if session.temp_item: |
302 | 311 | self.ShowSaveAsProject() |
303 | 312 | else: |
304 | 313 | self.SaveProject() |
314 | + elif id == const.ID_ALIGN: | |
315 | + self.AlignVolume() | |
316 | + elif id == const.ID_GAUSSIAN: | |
317 | + self.Tools_Gaussian() | |
318 | + elif id == const.ID_MEDIAN: | |
319 | + self.Tools_Median() | |
320 | + elif id == const.ID_MODE: | |
321 | + self.Tools_Mode() | |
322 | + elif id == const.ID_SOBEL: | |
323 | + self.Tools_Sobel() | |
324 | + elif id == const.ID_ERASEBG: | |
325 | + self.Tools_EraseBackground() | |
326 | + elif id == const.ID_ERASESUP: | |
327 | + self.Tools_EraseSupport() | |
328 | + elif id == const.ID_HISTEQ: | |
329 | + self.Tools_HistogramEqualization() | |
330 | + elif id == const.ID_INTERP: | |
331 | + self.Tools_Interpolation() | |
305 | 332 | elif id == const.ID_PROJECT_SAVE_AS: |
306 | 333 | self.ShowSaveAsProject() |
307 | 334 | elif id == const.ID_PROJECT_CLOSE: |
... | ... | @@ -326,6 +353,60 @@ class Frame(wx.Frame): |
326 | 353 | """ |
327 | 354 | dlg.ShowAboutDialog(self) |
328 | 355 | |
356 | + def AlignVolume(self): | |
357 | + """ | |
358 | + Align the image. | |
359 | + """ | |
360 | + ps.Publisher().sendMessage('Align volume') | |
361 | + | |
362 | + def Tools_Gaussian(self): | |
363 | + """ | |
364 | + Gaussian Smoothing. | |
365 | + """ | |
366 | + ps.Publisher().sendMessage('Tools gaussian') | |
367 | + | |
368 | + def Tools_Median(self): | |
369 | + """ | |
370 | + Median Filter | |
371 | + """ | |
372 | + ps.Publisher().sendMessage('Tools median') | |
373 | + | |
374 | + def Tools_Mode(self): | |
375 | + """ | |
376 | + Mode Filter | |
377 | + """ | |
378 | + ps.Publisher().sendMessage('Tools mode') | |
379 | + | |
380 | + def Tools_Sobel(self): | |
381 | + """ | |
382 | + Sobel Filter | |
383 | + """ | |
384 | + ps.Publisher().sendMessage('Tools sobel') | |
385 | + | |
386 | + def Tools_EraseBackground(self): | |
387 | + """ | |
388 | + Erase background | |
389 | + """ | |
390 | + ps.Publisher().sendMessage('Tools erase background') | |
391 | + | |
392 | + def Tools_EraseSupport(self): | |
393 | + """ | |
394 | + Erase support | |
395 | + """ | |
396 | + ps.Publisher().sendMessage('Tools erase support') | |
397 | + | |
398 | + def Tools_HistogramEqualization(self): | |
399 | + """ | |
400 | + Histogram Equalization | |
401 | + """ | |
402 | + ps.Publisher().sendMessage('Tools histogram equalization') | |
403 | + | |
404 | + def Tools_Interpolation(self): | |
405 | + """ | |
406 | + Interpolation | |
407 | + """ | |
408 | + ps.Publisher().sendMessage('Tools interpolation') | |
409 | + | |
329 | 410 | def SaveProject(self): |
330 | 411 | """ |
331 | 412 | Save project. |
... | ... | @@ -362,7 +443,13 @@ class Frame(wx.Frame): |
362 | 443 | """ |
363 | 444 | Show save as dialog. |
364 | 445 | """ |
365 | - ps.Publisher().sendMessage('Show analyze dialog', True) | |
446 | + ps.Publisher().sendMessage('Show analyze import dialog', True) | |
447 | + | |
448 | + def ShowAnalyzeExporter(self): | |
449 | + """ | |
450 | + Show save as dialog. | |
451 | + """ | |
452 | + ps.Publisher().sendMessage('Show analyze export dialog', True) | |
366 | 453 | |
367 | 454 | # ------------------------------------------------------------------ |
368 | 455 | # ------------------------------------------------------------------ |
... | ... | @@ -406,14 +493,19 @@ class MenuBar(wx.MenuBar): |
406 | 493 | # TODO: This definetely needs improvements... ;) |
407 | 494 | |
408 | 495 | #Import Others Files |
409 | - others_file_menu = wx.Menu() | |
410 | - others_file_menu.Append(const.ID_ANALYZE_IMPORT, "Analyze") | |
496 | + others_import_file_menu = wx.Menu() | |
497 | + others_import_file_menu.Append(const.ID_ANALYZE_IMPORT, "Analyze") | |
498 | + | |
499 | + #Import Others Files | |
500 | + others_export_file_menu = wx.Menu() | |
501 | + others_export_file_menu.Append(const.ID_ANALYZE_EXPORT, "Analyze") | |
411 | 502 | |
412 | 503 | # FILE |
413 | 504 | file_menu = wx.Menu() |
414 | 505 | app = file_menu.Append |
415 | 506 | app(const.ID_DICOM_IMPORT, _("Import DICOM...\tCtrl+I")) |
416 | - file_menu.AppendMenu(const.ID_IMPORT_OTHERS_FILES, _("Import Others Files"), others_file_menu) | |
507 | + file_menu.AppendMenu(const.ID_IMPORT_OTHERS_FILES, _("Import Other Files"), others_import_file_menu) | |
508 | + file_menu.AppendMenu(const.ID_EXPORT_OTHERS_FILES, _("Export Other Files"), others_export_file_menu) | |
417 | 509 | app(const.ID_PROJECT_OPEN, _("Open Project...\tCtrl+O")) |
418 | 510 | app(const.ID_PROJECT_SAVE, _("Save Project\tCtrl+S")) |
419 | 511 | app(const.ID_PROJECT_SAVE_AS, _("Save Project As...")) |
... | ... | @@ -461,7 +553,16 @@ class MenuBar(wx.MenuBar): |
461 | 553 | #app(const.ID_VIEW_3D_BACKGROUND, "3D Background Colour") |
462 | 554 | |
463 | 555 | # TOOLS |
464 | - #tools_menu = wx.Menu() | |
556 | + tools_menu = wx.Menu() | |
557 | + tools_menu.Append(const.ID_ALIGN, _("Symmetry Alignment")) | |
558 | + tools_menu.Append(const.ID_GAUSSIAN, _("Gaussian Smoothing")) | |
559 | + tools_menu.Append(const.ID_MEDIAN, _("Median Filter")) | |
560 | + tools_menu.Append(const.ID_MODE, _("Mode Filter")) | |
561 | + tools_menu.Append(const.ID_SOBEL, _("Sobel Filter")) | |
562 | + tools_menu.Append(const.ID_HISTEQ, _("Histogram Equalization")) | |
563 | + tools_menu.Append(const.ID_INTERP, _("Isotropic Interpolation")) | |
564 | + tools_menu.Append(const.ID_ERASEBG, _("Erase Background")) | |
565 | + tools_menu.Append(const.ID_ERASESUP, _("Erase Head Support")) | |
465 | 566 | |
466 | 567 | # OPTIONS |
467 | 568 | #options_menu = wx.Menu() |
... | ... | @@ -491,7 +592,7 @@ class MenuBar(wx.MenuBar): |
491 | 592 | self.Append(file_menu, _("File")) |
492 | 593 | #self.Append(file_edit, "Edit") |
493 | 594 | #self.Append(view_menu, "View") |
494 | - #self.Append(tools_menu, "Tools") | |
595 | + self.Append(tools_menu, "Tools") | |
495 | 596 | #self.Append(options_menu, "Options") |
496 | 597 | self.Append(help_menu, _("Help")) |
497 | 598 | |
... | ... | @@ -644,6 +745,8 @@ class TaskBarIcon(wx.TaskBarIcon): |
644 | 745 | def OnTaskBarActivate(self, evt): |
645 | 746 | pass |
646 | 747 | |
748 | + | |
749 | + | |
647 | 750 | # ------------------------------------------------------------------ |
648 | 751 | # ------------------------------------------------------------------ |
649 | 752 | # ------------------------------------------------------------------ |
... | ... | @@ -771,11 +874,11 @@ class ProjectToolBar(wx.ToolBar): |
771 | 874 | self.EnableTool(tool, True) |
772 | 875 | |
773 | 876 | |
774 | - | |
775 | 877 | # ------------------------------------------------------------------ |
776 | 878 | # ------------------------------------------------------------------ |
777 | 879 | # ------------------------------------------------------------------ |
778 | 880 | |
881 | + | |
779 | 882 | class ObjectToolBar(wx.ToolBar): |
780 | 883 | """ |
781 | 884 | Toolbar related to general object operations, including: zoom |
... | ... | @@ -1307,3 +1410,87 @@ class LayoutToolBar(wx.ToolBar): |
1307 | 1410 | ps.Publisher().sendMessage('Update AUI') |
1308 | 1411 | self.ontool_text = True |
1309 | 1412 | |
1413 | +# ------------------------------------------------------------------ | |
1414 | +# ------------------------------------------------------------------ | |
1415 | +# ------------------------------------------------------------------ | |
1416 | + | |
1417 | +class ImageProcessingToolBar(wx.ToolBar): | |
1418 | + """ | |
1419 | + Toolbar related to general project operations, including: import, | |
1420 | + open, save and saveas, among others. | |
1421 | + """ | |
1422 | + def __init__(self, parent): | |
1423 | + style = wx.TB_FLAT|wx.TB_NODIVIDER| wx.TB_DOCKABLE | |
1424 | + wx.ToolBar.__init__(self, parent, -1, wx.DefaultPosition, | |
1425 | + wx.DefaultSize, | |
1426 | + style) | |
1427 | + self.SetToolBitmapSize(wx.Size(32,32)) | |
1428 | + | |
1429 | + self.parent = parent | |
1430 | + | |
1431 | + # Used to enable/disable menu items if project is opened or | |
1432 | + # not. Eg. save should only be available if a project is open | |
1433 | + self.enable_items = [const.ID_ALIGN] | |
1434 | + | |
1435 | + self.__init_items() | |
1436 | + self.__bind_events() | |
1437 | + | |
1438 | + self.Realize() | |
1439 | + self.SetStateProjectClose() | |
1440 | + | |
1441 | + def __bind_events(self): | |
1442 | + """ | |
1443 | + Bind events related to pubsub. | |
1444 | + """ | |
1445 | + sub = ps.Publisher().subscribe | |
1446 | + sub(self._EnableState, "Enable state project") | |
1447 | + | |
1448 | + def __init_items(self): | |
1449 | + """ | |
1450 | + Add tools into toolbar. | |
1451 | + """ | |
1452 | + # Load bitmaps | |
1453 | + d = const.ICON_DIR | |
1454 | + if sys.platform == 'darwin': | |
1455 | + path = os.path.join(d, "ip_align_original.png") | |
1456 | + BMP_SAVE = wx.Bitmap(path, wx.BITMAP_TYPE_PNG) | |
1457 | + else: | |
1458 | + path = os.path.join(d, "ip_align.png") | |
1459 | + BMP_SAVE = wx.Bitmap(path, wx.BITMAP_TYPE_PNG) | |
1460 | + | |
1461 | + # Create tool items based on bitmaps | |
1462 | + self.AddLabelTool(const.ID_ALIGN, | |
1463 | + "", | |
1464 | + shortHelp = _("Symmetry Alignment"), | |
1465 | + bitmap=BMP_SAVE) | |
1466 | + | |
1467 | + | |
1468 | + def _EnableState(self, pubsub_evt): | |
1469 | + """ | |
1470 | + Based on given state, enable or disable menu items which | |
1471 | + depend if project is open or not. | |
1472 | + """ | |
1473 | + state = pubsub_evt.data | |
1474 | + if state: | |
1475 | + self.SetStateProjectOpen() | |
1476 | + else: | |
1477 | + self.SetStateProjectClose() | |
1478 | + | |
1479 | + def SetStateProjectClose(self): | |
1480 | + """ | |
1481 | + Disable menu items (e.g. save) when project is closed. | |
1482 | + """ | |
1483 | + for tool in self.enable_items: | |
1484 | + self.EnableTool(tool, False) | |
1485 | + | |
1486 | + def SetStateProjectOpen(self): | |
1487 | + """ | |
1488 | + Enable menu items (e.g. save) when project is opened. | |
1489 | + """ | |
1490 | + for tool in self.enable_items: | |
1491 | + self.EnableTool(tool, True) | |
1492 | + | |
1493 | + | |
1494 | +# ------------------------------------------------------------------ | |
1495 | +# ------------------------------------------------------------------ | |
1496 | +# ------------------------------------------------------------------ | ... | ... |
invesalius/gui/task_importer.py
... | ... | @@ -28,6 +28,7 @@ import constants as const |
28 | 28 | import gui.dialogs as dlg |
29 | 29 | |
30 | 30 | BTN_IMPORT_LOCAL = wx.NewId() |
31 | +#BTN_IMPORT_ANA = wx.NewId() | |
31 | 32 | BTN_IMPORT_PACS = wx.NewId() |
32 | 33 | BTN_OPEN_PROJECT = wx.NewId() |
33 | 34 | |
... | ... | @@ -61,8 +62,8 @@ class InnerTaskPanel(wx.Panel): |
61 | 62 | self.float_hyper_list = [] |
62 | 63 | |
63 | 64 | # Fixed hyperlink items |
64 | - tooltip = wx.ToolTip(_("Select DICOM or Analyze files to be reconstructed")) | |
65 | - link_import_local = hl.HyperLinkCtrl(self, -1, _("Import medical images...")) | |
65 | + tooltip = wx.ToolTip(_("Select DICOM to be reconstructed")) | |
66 | + link_import_local = hl.HyperLinkCtrl(self, -1, _("Import DICOM image...")) | |
66 | 67 | link_import_local.SetUnderlines(False, False, False) |
67 | 68 | link_import_local.SetColours("BLACK", "BLACK", "BLACK") |
68 | 69 | link_import_local.SetToolTip(tooltip) |
... | ... | @@ -70,6 +71,15 @@ class InnerTaskPanel(wx.Panel): |
70 | 71 | link_import_local.UpdateLink() |
71 | 72 | link_import_local.Bind(hl.EVT_HYPERLINK_LEFT, self.OnLinkImport) |
72 | 73 | |
74 | + #tooltip = wx.ToolTip(_("Select Analyze file to be reconstructed")) | |
75 | + #link_import_ana = hl.HyperLinkCtrl(self, -1, _("Import Analyze image...")) | |
76 | + #link_import_ana.SetUnderlines(False, False, False) | |
77 | + #link_import_ana.SetColours("BLACK", "BLACK", "BLACK") | |
78 | + #link_import_ana.SetToolTip(tooltip) | |
79 | + #link_import_ana.AutoBrowse(False) | |
80 | + #link_import_ana.UpdateLink() | |
81 | + #link_import_ana.Bind(hl.EVT_HYPERLINK_LEFT, self.OnLinkImportAnalyze) | |
82 | + | |
73 | 83 | #tooltip = wx.ToolTip("Import DICOM files from PACS server") |
74 | 84 | #link_import_pacs = hl.HyperLinkCtrl(self, -1,"Load from PACS server...") |
75 | 85 | #link_import_pacs.SetUnderlines(False, False, False) |
... | ... | @@ -105,6 +115,8 @@ class InnerTaskPanel(wx.Panel): |
105 | 115 | # style=button_style) |
106 | 116 | button_import_local = pbtn.PlateButton(self, BTN_IMPORT_LOCAL, "", |
107 | 117 | BMP_IMPORT, style=button_style) |
118 | + #button_import_ana = pbtn.PlateButton(self, BTN_IMPORT_ANA, "", | |
119 | + # BMP_IMPORT, style=button_style) | |
108 | 120 | button_open_proj = pbtn.PlateButton(self, BTN_OPEN_PROJECT, "", |
109 | 121 | BMP_OPEN_PROJECT, style=button_style) |
110 | 122 | |
... | ... | @@ -122,6 +134,8 @@ class InnerTaskPanel(wx.Panel): |
122 | 134 | #(button_import_pacs, 0, flag_button), |
123 | 135 | (link_import_local, 1, flag_link, 3), |
124 | 136 | (button_import_local, 0, flag_button), |
137 | + #(link_import_ana, 1, flag_link, 3), | |
138 | + #(button_import_ana, 0, flag_button), | |
125 | 139 | (link_open_proj, 1, flag_link, 3), |
126 | 140 | (button_open_proj, 0, flag_button) ]) |
127 | 141 | |
... | ... | @@ -202,6 +216,10 @@ class InnerTaskPanel(wx.Panel): |
202 | 216 | self.ImportDicom() |
203 | 217 | event.Skip() |
204 | 218 | |
219 | + def OnLinkImportAnalyze(self, event): | |
220 | + self.ImportAnalyze() | |
221 | + event.Skip() | |
222 | + | |
205 | 223 | def OnLinkImportPACS(self, event): |
206 | 224 | self.ImportPACS() |
207 | 225 | event.Skip() |
... | ... | @@ -219,6 +237,9 @@ class InnerTaskPanel(wx.Panel): |
219 | 237 | def ImportDicom(self): |
220 | 238 | ps.Publisher().sendMessage('Show import directory dialog') |
221 | 239 | |
240 | + def ImportAnalyze(self): | |
241 | + ps.Publisher().sendMessage('Show import analyze dialog') | |
242 | + | |
222 | 243 | def OpenProject(self, path=None): |
223 | 244 | if path: |
224 | 245 | ps.Publisher().sendMessage('Open recent project', path) |
... | ... | @@ -240,6 +261,8 @@ class InnerTaskPanel(wx.Panel): |
240 | 261 | |
241 | 262 | if id == BTN_IMPORT_LOCAL: |
242 | 263 | self.ImportDicom() |
264 | + #elif id == BTN_IMPORT_ANA: | |
265 | + # self.ImportAnalyze() | |
243 | 266 | elif id == BTN_IMPORT_PACS: |
244 | 267 | self.ImportPACS() |
245 | 268 | else: #elif id == BTN_OPEN_PROJECT: | ... | ... |
... | ... | @@ -0,0 +1,18 @@ |
1 | +#-------------------------------------------------------------------------- | |
2 | +# Software: InVesalius - Software de Reconstrucao 3D de Imagens Medicas | |
3 | +# Copyright: (C) 2001 Centro de Pesquisas Renato Archer | |
4 | +# Homepage: http://www.softwarepublico.gov.br | |
5 | +# Contact: invesalius@cti.gov.br | |
6 | +# License: GNU - GPL 2 (LICENSE.txt/LICENCA.txt) | |
7 | +#-------------------------------------------------------------------------- | |
8 | +# Este programa e software livre; voce pode redistribui-lo e/ou | |
9 | +# modifica-lo sob os termos da Licenca Publica Geral GNU, conforme | |
10 | +# publicada pela Free Software Foundation; de acordo com a versao 2 | |
11 | +# da Licenca. | |
12 | +# | |
13 | +# Este programa eh distribuido na expectativa de ser util, mas SEM | |
14 | +# QUALQUER GARANTIA; sem mesmo a garantia implicita de | |
15 | +# COMERCIALIZACAO ou de ADEQUACAO A QUALQUER PROPOSITO EM | |
16 | +# PARTICULAR. Consulte a Licenca Publica Geral GNU para obter mais | |
17 | +# detalhes. | |
18 | +#-------------------------------------------------------------------------- | ... | ... |
... | ... | @@ -0,0 +1,18 @@ |
1 | +#-------------------------------------------------------------------------- | |
2 | +# Software: InVesalius - Software de Reconstrucao 3D de Imagens Medicas | |
3 | +# Copyright: (C) 2001 Centro de Pesquisas Renato Archer | |
4 | +# Homepage: http://www.softwarepublico.gov.br | |
5 | +# Contact: invesalius@cti.gov.br | |
6 | +# License: GNU - GPL 2 (LICENSE.txt/LICENCA.txt) | |
7 | +#-------------------------------------------------------------------------- | |
8 | +# Este programa e software livre; voce pode redistribui-lo e/ou | |
9 | +# modifica-lo sob os termos da Licenca Publica Geral GNU, conforme | |
10 | +# publicada pela Free Software Foundation; de acordo com a versao 2 | |
11 | +# da Licenca. | |
12 | +# | |
13 | +# Este programa eh distribuido na expectativa de ser util, mas SEM | |
14 | +# QUALQUER GARANTIA; sem mesmo a garantia implicita de | |
15 | +# COMERCIALIZACAO ou de ADEQUACAO A QUALQUER PROPOSITO EM | |
16 | +# PARTICULAR. Consulte a Licenca Publica Geral GNU para obter mais | |
17 | +# detalhes. | |
18 | +#-------------------------------------------------------------------------- | ... | ... |
... | ... | @@ -0,0 +1,19 @@ |
1 | + | |
2 | + | |
3 | +from ..libift import libift as libift | |
4 | +from ..libscnvtk import libscnvtk as libscnvtk | |
5 | + | |
6 | + | |
7 | +def VolumeAlign(img): | |
8 | + scn = libscnvtk.VtkImageDataToScene(img) | |
9 | + print "VolumeAlign()" | |
10 | + scn2 = libift.MSP_Align(scn,None,0,1) | |
11 | + return libscnvtk.SceneToVtkImageData(scn2) | |
12 | + | |
13 | + | |
14 | + | |
15 | +def Interp(img): | |
16 | + scn = libscnvtk.VtkImageDataToScene(img) | |
17 | + scn2=libift.LinearInterp(scn,0,0,0) | |
18 | + return libscnvtk.SceneToVtkImageData(scn2) | |
19 | + | ... | ... |
... | ... | @@ -0,0 +1,25 @@ |
1 | + | |
2 | + | |
3 | +PROG=libift | |
4 | +#IFT_DIR=~/ift | |
5 | +#VTK_DIR=/hd2/lib/VTK | |
6 | + | |
7 | + | |
8 | +all: _${PROG}.so | |
9 | + | |
10 | +_${PROG}.so: ${PROG}.i ${PROG}.c | |
11 | + @echo "Generating wrappers..." | |
12 | + @swig -python ${PROG}.i | |
13 | + @echo "Compiling..." | |
14 | + @gcc -c ${PROG}.c ${PROG}_wrap.c -I/usr/include/python2.6 -I${OPF_DIR}/include -I${IFT_DIR}/include -L${IFT_DIR}/lib/ -lift -Wno-deprecated | |
15 | + @echo "Linking..." | |
16 | + @gcc -shared ${PROG}.o ${PROG}_wrap.o -o _${PROG}.so -L${IFT_DIR}/lib/ -lift | |
17 | + @echo "Done." | |
18 | + | |
19 | + | |
20 | +clean: | |
21 | + rm ${PROG}.o ${PROG}.py ${PROG}_wrap.c ${PROG}_wrap.o ${PROG}.py _${PROG}.so *.pyc *.obj *.pyd *.exp *.lib *~ | |
22 | + | |
23 | + | |
24 | + | |
25 | + | ... | ... |
... | ... | @@ -0,0 +1,18 @@ |
1 | +#-------------------------------------------------------------------------- | |
2 | +# Software: InVesalius - Software de Reconstrucao 3D de Imagens Medicas | |
3 | +# Copyright: (C) 2001 Centro de Pesquisas Renato Archer | |
4 | +# Homepage: http://www.softwarepublico.gov.br | |
5 | +# Contact: invesalius@cti.gov.br | |
6 | +# License: GNU - GPL 2 (LICENSE.txt/LICENCA.txt) | |
7 | +#-------------------------------------------------------------------------- | |
8 | +# Este programa e software livre; voce pode redistribui-lo e/ou | |
9 | +# modifica-lo sob os termos da Licenca Publica Geral GNU, conforme | |
10 | +# publicada pela Free Software Foundation; de acordo com a versao 2 | |
11 | +# da Licenca. | |
12 | +# | |
13 | +# Este programa eh distribuido na expectativa de ser util, mas SEM | |
14 | +# QUALQUER GARANTIA; sem mesmo a garantia implicita de | |
15 | +# COMERCIALIZACAO ou de ADEQUACAO A QUALQUER PROPOSITO EM | |
16 | +# PARTICULAR. Consulte a Licenca Publica Geral GNU para obter mais | |
17 | +# detalhes. | |
18 | +#-------------------------------------------------------------------------- | ... | ... |
... | ... | @@ -0,0 +1,115 @@ |
1 | + | |
2 | + | |
3 | +//extern "C" { | |
4 | + #include "ift.h" | |
5 | +//} | |
6 | + | |
7 | + | |
8 | + | |
9 | + | |
10 | + | |
11 | +// Prototypes | |
12 | + | |
13 | +void NewDestroyScene(Scene *scn); | |
14 | + | |
15 | + | |
16 | + | |
17 | + | |
18 | +void NewDestroyScene(Scene *scn) | |
19 | +{ | |
20 | + if(scn != NULL){ | |
21 | + if (scn->data != NULL) free(scn->data); | |
22 | + if (scn->tby != NULL) free(scn->tby); | |
23 | + if (scn->tbz != NULL) free(scn->tbz); | |
24 | + free(scn); | |
25 | + } | |
26 | +} | |
27 | + | |
28 | + | |
29 | +Scene* EraseBackground(Scene *scn) | |
30 | +{ | |
31 | + int otsu = (int)(Otsu3(scn)*0.8); // Get 80% of Otsu's threshold | |
32 | + int i,n = scn->xsize*scn->ysize*scn->zsize; | |
33 | + Scene *out = CopyScene(scn); | |
34 | + for (i=0; i < n; i++) { | |
35 | + if (out->data[i]<otsu) out->data[i]=0; | |
36 | + } | |
37 | + return out; | |
38 | +} | |
39 | + | |
40 | +Scene* EraseSupport(Scene *scn) | |
41 | +{ | |
42 | + // Check if RemoveBackground was already ran (workaround) | |
43 | + int c=0,i,n = scn->xsize*scn->ysize*scn->zsize; | |
44 | + Scene *scn2; | |
45 | + Scene *labels,*bin; | |
46 | + AdjRel3 *A; | |
47 | + int total[2000],p; | |
48 | + Voxel v; | |
49 | + int max; | |
50 | + Scene *out; | |
51 | + | |
52 | + for (i=0; i < n; i++) { | |
53 | + if (scn->data[i]==0) c++; // count zero voxels | |
54 | + } | |
55 | + if (c<(n*0.15)) | |
56 | + scn2 = EraseBackground(scn); | |
57 | + else | |
58 | + scn2 = CopyScene(scn); | |
59 | + | |
60 | + // Get max connected component | |
61 | + A=Spheric(1.5); | |
62 | + bin = Threshold3(scn2,1,50000); | |
63 | + labels = LabelBinComp3(bin,A); | |
64 | + DestroyAdjRel3(&A); | |
65 | + // Count labels | |
66 | + for (i=0;i<2000;i++) total[i]=0; | |
67 | + for (v.z=0; v.z < scn->zsize; v.z++) | |
68 | + for (v.y=0; v.y < scn->ysize; v.y++) | |
69 | + for (v.x=0; v.x < scn->xsize; v.x++) { | |
70 | + p = labels->tbz[v.z] + labels->tby[v.y] + v.x; | |
71 | + if (labels->data[p]<2000) total[labels->data[p]]++; | |
72 | + if (bin->data[p]==0) total[labels->data[p]]=0; // exclude background | |
73 | + } | |
74 | + DestroyScene(&bin); | |
75 | + max=0; | |
76 | + for (i=0;i<2000;i++) | |
77 | + if (total[i]>total[max]) max=i; | |
78 | + | |
79 | + // copy the maxcc to out | |
80 | + n = scn->xsize*scn->ysize*scn->zsize; | |
81 | + out = CreateScene(scn->xsize,scn->ysize,scn->zsize); | |
82 | + out->dx=scn->dx; | |
83 | + out->dy=scn->dy; | |
84 | + out->dz=scn->dz; | |
85 | + for (i=0; i < n; i++) { | |
86 | + if (labels->data[i]==max) out->data[i]=scn2->data[i]; | |
87 | + } | |
88 | + DestroyScene(&labels); | |
89 | + DestroyScene(&scn2); | |
90 | + return out; | |
91 | +} | |
92 | + | |
93 | + | |
94 | + | |
95 | +int ShiftScene(Scene *scn) | |
96 | +{ | |
97 | + int n,i, min = MinimumValue3(scn); | |
98 | + if (min<0) { | |
99 | + n = scn->xsize*scn->ysize*scn->zsize; | |
100 | + for (i=0; i < n; i++) | |
101 | + scn->data[i] += 1024; | |
102 | + return 1; | |
103 | + } | |
104 | + return 0; | |
105 | +} | |
106 | + | |
107 | +void UnShiftScene(Scene *scn, int flag) | |
108 | +{ | |
109 | + int i,n; | |
110 | + if (flag!=0) { | |
111 | + n = scn->xsize*scn->ysize*scn->zsize; | |
112 | + for (i=0; i < n; i++) | |
113 | + scn->data[i] -= 1024; | |
114 | + } | |
115 | +} | ... | ... |
... | ... | @@ -0,0 +1,83 @@ |
1 | + | |
2 | + | |
3 | +/* example.i */ | |
4 | +%module libift | |
5 | + | |
6 | +%{ | |
7 | +/* Put header files here or function declarations like below */ | |
8 | + | |
9 | +#include "ift.h" | |
10 | + | |
11 | +extern void NewDestroyScene(Scene *scn); | |
12 | +extern Scene* EraseBackground(Scene *scn); | |
13 | +extern Scene* EraseSupport(Scene *scn); | |
14 | +extern int ShiftScene(Scene *scn); | |
15 | +extern void UnShiftScene(Scene *scn, int flag); | |
16 | + | |
17 | +/* From ift library */ | |
18 | +extern float GetDx(Scene *scn); | |
19 | +extern float GetDy(Scene *scn); | |
20 | +extern float GetDz(Scene *scn); | |
21 | +extern int GetXSize(Scene *scn); | |
22 | +extern int GetYSize(Scene *scn); | |
23 | +extern int GetZSize(Scene *scn); | |
24 | +extern Scene *CreateScene(int xsize,int ysize,int zsize); | |
25 | +extern void SetDx(Scene *scn, float dx); | |
26 | +extern void SetDy(Scene *scn, float dy); | |
27 | +extern void SetDz(Scene *scn, float dz); | |
28 | +extern Scene* ReadScene(char *filename); | |
29 | +extern void WriteScene(Scene *scn, char *filename); | |
30 | +extern Scene* MSP_Align(Scene *in, Scene *mask, int input_ori, int quality); | |
31 | +extern Scene *LinearInterp(Scene *scn,float dx,float dy,float dz); | |
32 | +extern Kernel3 *NormalizeKernel3(Kernel3 *K); | |
33 | +extern Kernel3 *GaussianKernel3(AdjRel3 *A, float stddev); | |
34 | +extern Kernel3 *LaplacianKernel3(AdjRel3 *A, float stddev); | |
35 | +extern void DestroyKernel3(Kernel3 **K); | |
36 | +extern Scene *LinearFilter3(Scene *scn, Kernel3 *K); | |
37 | +extern Scene *SobelFilter3(Scene *scn); | |
38 | +extern Scene *MedianFilter3(Scene *scn, AdjRel3 *A); | |
39 | +extern Scene *ModeFilter3(Scene *scn, AdjRel3 *A); | |
40 | +extern AdjRel3 *Spheric(float r); | |
41 | +extern Scene *Equalize3(Scene *scn, int Imax); | |
42 | +extern int Otsu3(Scene *scn); | |
43 | + | |
44 | + | |
45 | + | |
46 | +%} | |
47 | + | |
48 | + | |
49 | + | |
50 | +#include "ift.h" | |
51 | + | |
52 | +extern void NewDestroyScene(Scene *scn); | |
53 | +extern Scene* EraseBackground(Scene *scn); | |
54 | +extern Scene* EraseSupport(Scene *scn); | |
55 | +extern int ShiftScene(Scene *scn); | |
56 | +extern void UnShiftScene(Scene *scn, int flag); | |
57 | + | |
58 | +/* From ift library */ | |
59 | +extern float GetDx(Scene *scn); | |
60 | +extern float GetDy(Scene *scn); | |
61 | +extern float GetDz(Scene *scn); | |
62 | +extern int GetXSize(Scene *scn); | |
63 | +extern int GetYSize(Scene *scn); | |
64 | +extern int GetZSize(Scene *scn); | |
65 | +extern Scene *CreateScene(int xsize,int ysize,int zsize); | |
66 | +extern void SetDx(Scene *scn, float dx); | |
67 | +extern void SetDy(Scene *scn, float dy); | |
68 | +extern void SetDz(Scene *scn, float dz); | |
69 | +extern Scene* ReadScene(char *filename); | |
70 | +extern void WriteScene(Scene *scn, char *filename); | |
71 | +extern Scene* MSP_Align(Scene *in, Scene *mask, int input_ori, int quality); | |
72 | +extern Scene *LinearInterp(Scene *scn,float dx,float dy,float dz); | |
73 | +extern Kernel3 *NormalizeKernel3(Kernel3 *K); | |
74 | +extern Kernel3 *GaussianKernel3(AdjRel3 *A, float stddev); | |
75 | +extern Kernel3 *LaplacianKernel3(AdjRel3 *A, float stddev); | |
76 | +extern void DestroyKernel3(Kernel3 **K); | |
77 | +extern Scene *LinearFilter3(Scene *scn, Kernel3 *K); | |
78 | +extern Scene *SobelFilter3(Scene *scn); | |
79 | +extern Scene *MedianFilter3(Scene *scn, AdjRel3 *A); | |
80 | +extern Scene *ModeFilter3(Scene *scn, AdjRel3 *A); | |
81 | +extern AdjRel3 *Spheric(float r); | |
82 | +extern Scene *Equalize3(Scene *scn, int Imax); | |
83 | + | ... | ... |
... | ... | @@ -0,0 +1,37 @@ |
1 | + | |
2 | +#---------------------------------------------------------------------- | |
3 | +# This is the Makefile to compile lib-ift with MS Visual C++ (cl.exe) | |
4 | +# using the GNU make or NMAKE. | |
5 | +# | |
6 | +# Instruction: Open the "Visual Studio Command Prompt" and type | |
7 | +# "C:\ift> make -f makefile.vc" or | |
8 | +# "C:\ift> nmake -f makefile.vc" | |
9 | +# | |
10 | +#---------------------------------------------------------------------- | |
11 | + | |
12 | +# Set these variables first | |
13 | +IFT_DIR="C:\ift" | |
14 | +PY_INC="C:\Python26\include" | |
15 | +PY_LIB="C:\Python26\libs\python26.lib" | |
16 | + | |
17 | + | |
18 | +PROG=libift | |
19 | + | |
20 | +all: _$(PROG).pyd | |
21 | + | |
22 | +_$(PROG).pyd: $(PROG).i $(PROG).c | |
23 | + @echo Generating wrappers... | |
24 | + @swig -python $(PROG).i | |
25 | + @echo Compiling... | |
26 | + @cl.exe /nologo -c $(PROG).c $(PROG)_wrap.c -I $(PY_INC) -I $(IFT_DIR)\include | |
27 | + @echo Linking... | |
28 | + @link.exe /nologo -dll $(PROG).obj $(PROG)_wrap.obj $(PY_LIB) $(IFT_DIR)\lib\libift.lib -out:_$(PROG).pyd | |
29 | + @echo Done. | |
30 | + | |
31 | + | |
32 | +clean: | |
33 | + del $(PROG).o $(PROG).py $(PROG)_wrap.c $(PROG)_wrap.o $(PROG).py _$(PROG).so *.pyc *.obj *.pyd *.exp *.lib *~ | |
34 | + | |
35 | + | |
36 | + | |
37 | + | ... | ... |
... | ... | @@ -0,0 +1,24 @@ |
1 | + | |
2 | + | |
3 | +PROG=scnvtk | |
4 | +#IFT_DIR=~/ift | |
5 | +#VTK_DIR=/hd2/lib/VTK | |
6 | + | |
7 | + | |
8 | +all: _${PROG}.so | |
9 | + | |
10 | +_${PROG}.so: ${PROG}.i ${PROG}.cxx | |
11 | + @echo "Generating wrappers..." | |
12 | + @swig -c++ -python ${PROG}.i | |
13 | + @echo "Compiling..." | |
14 | + @c++ -c ${PROG}.cxx ${PROG}_wrap.cxx -I/usr/include/python2.6 -I${OPF_DIR}/include -I${IFT_DIR}/include -L${IFT_DIR}/lib/ -lift -I${VTK_DIR} -I${VTK_DIR}/Common -I${VTK_DIR}/Utilities -I${VTK_DIR}/VolumeRendering -I${VTK_DIR}/Rendering -I${VTK_DIR}/Utilities/vtkalglib -I${VTK_DIR}/Infovis -I${VTK_DIR}/Geovis -I${VTK_DIR}/Views -I${VTK_DIR}/Hybrid -I${VTK_DIR}/Widgets -I${VTK_DIR}/Rendering/Testing/Cxx -I${VTK_DIR}/IO -I${VTK_DIR}/Imaging -I${VTK_DIR}/Graphics -I${VTK_DIR}/GenericFiltering -I${VTK_DIR}/Filtering -I${VTK_DIR}/Common/Testing/Cxx -I${VTK_DIR}/Utilities/vtklibproj4 -I${VTK_DIR}/Utilities/DICOMParser -I${VTK_DIR}/Utilities/vtkfreetype/include -I${VTK_DIR}/Utilities/vtknetcdf -I${VTK_DIR}/Utilities/vtkexodus2/include -I${VTK_DIR}/Utilities/MaterialLibrary -I${VTK_DIR}/Utilities/verdict -I/usr/include/tcl8.4 -Wno-deprecated | |
15 | + @echo "Linking..." | |
16 | + @c++ -shared ${PROG}.o ${PROG}_wrap.o -o _${PROG}.so -L${IFT_DIR}/lib/ -lift #-L${VTK_DIR}/bin -lvtkRendering -lift -lvtkGraphics -lvtkverdict -lvtkImaging -lvtkIO -lvtkFiltering -lvtkCommon -lpthread -lm -lvtkDICOMParser -lvtkNetCDF -lvtkmetaio -lvtksqlite -lvtkpng -lvtktiff -lvtkzlib -lvtkjpeg -lvtkexpat -lvtksys -ldl -lvtkftgl -lvtkfreetype -lGL -lOSMesa -lXt -lSM -lICE -lX11 -lXext | |
17 | + @echo "Done." | |
18 | + | |
19 | +clean: | |
20 | + rm ${PROG}.o ${PROG}.py ${PROG}_wrap.cxx ${PROG}_wrap.o ${PROG}.py _${PROG}.so *.pyc *.obj *.exp *.pyd *.lib *~ | |
21 | + | |
22 | + | |
23 | + | |
24 | + | ... | ... |
... | ... | @@ -0,0 +1,18 @@ |
1 | +#-------------------------------------------------------------------------- | |
2 | +# Software: InVesalius - Software de Reconstrucao 3D de Imagens Medicas | |
3 | +# Copyright: (C) 2001 Centro de Pesquisas Renato Archer | |
4 | +# Homepage: http://www.softwarepublico.gov.br | |
5 | +# Contact: invesalius@cti.gov.br | |
6 | +# License: GNU - GPL 2 (LICENSE.txt/LICENCA.txt) | |
7 | +#-------------------------------------------------------------------------- | |
8 | +# Este programa e software livre; voce pode redistribui-lo e/ou | |
9 | +# modifica-lo sob os termos da Licenca Publica Geral GNU, conforme | |
10 | +# publicada pela Free Software Foundation; de acordo com a versao 2 | |
11 | +# da Licenca. | |
12 | +# | |
13 | +# Este programa eh distribuido na expectativa de ser util, mas SEM | |
14 | +# QUALQUER GARANTIA; sem mesmo a garantia implicita de | |
15 | +# COMERCIALIZACAO ou de ADEQUACAO A QUALQUER PROPOSITO EM | |
16 | +# PARTICULAR. Consulte a Licenca Publica Geral GNU para obter mais | |
17 | +# detalhes. | |
18 | +#-------------------------------------------------------------------------- | ... | ... |
... | ... | @@ -0,0 +1,63 @@ |
1 | + | |
2 | + | |
3 | + | |
4 | +import scnvtk | |
5 | +import vtk | |
6 | +from ..libift import libift as libift | |
7 | + | |
8 | + | |
9 | + | |
10 | +def Interp(img): | |
11 | + scn = VtkImageDataToScene(img) | |
12 | + scn2=libift.LinearInterp(scn,0,0,0) | |
13 | + libift.NewDestroyScene(scn) | |
14 | + return SceneToVtkImageData(scn2) | |
15 | + | |
16 | + | |
17 | +def SceneToVtkImageData(scn): | |
18 | + dx = libift.GetDx(scn) | |
19 | + dy = libift.GetDy(scn) | |
20 | + dz = libift.GetDz(scn) | |
21 | + xsize = libift.GetXSize(scn) | |
22 | + ysize = libift.GetYSize(scn) | |
23 | + zsize = libift.GetZSize(scn) | |
24 | + img = vtk.vtkImageData() | |
25 | + img.SetSpacing(dx,dy,dz) | |
26 | + img.SetOrigin(0,0,0) | |
27 | + img.SetDimensions(xsize,ysize,zsize) | |
28 | + img.SetScalarTypeToUnsignedShort() | |
29 | + img.SetNumberOfScalarComponents(1) | |
30 | + img.AllocateScalars() | |
31 | + scnvtk.CopyImageBufferScnToVtk(img.GetScalarPointer(),scn) | |
32 | + return img | |
33 | + | |
34 | +def VtkImageDataToScene(img): | |
35 | + d = img.GetSpacing() | |
36 | + dx=d[0] | |
37 | + dy=d[1] | |
38 | + dz=d[2] | |
39 | + d = img.GetDimensions() | |
40 | + xsize=d[0] | |
41 | + ysize=d[1] | |
42 | + zsize=d[2] | |
43 | + scn=libift.CreateScene(xsize,ysize,zsize) | |
44 | + libift.SetDx(scn,dx) | |
45 | + libift.SetDy(scn,dy) | |
46 | + libift.SetDz(scn,dz) | |
47 | + scnvtk.CopyImageBufferVtkToScn(scn,img.GetScalarPointer()) | |
48 | + return scn | |
49 | + | |
50 | + | |
51 | + | |
52 | +def WriteVtkImageData(img,filename): | |
53 | + scn = VtkImageDataToScene(img) | |
54 | + libift.WriteScene(scn,filename) | |
55 | + libift.NewDestroyScene(scn) | |
56 | + | |
57 | +def ReadVtkImageData(filename): | |
58 | + scn = libift.ReadScene(filename) | |
59 | + img=SceneToVtkImageData(scn) | |
60 | + libift.NewDestroyScene(scn) | |
61 | + return img | |
62 | + | |
63 | + | ... | ... |
... | ... | @@ -0,0 +1,36 @@ |
1 | + | |
2 | +#---------------------------------------------------------------------- | |
3 | +# This is the Makefile to compile lib-ift with MS Visual C++ (cl.exe) | |
4 | +# using the GNU make or NMAKE. | |
5 | +# | |
6 | +# Instruction: Open the "Visual Studio Command Prompt" and type | |
7 | +# "C:\ift> make -f makefile.vc" or | |
8 | +# "C:\ift> nmake -f makefile.vc" | |
9 | +# | |
10 | +#---------------------------------------------------------------------- | |
11 | + | |
12 | +# Set these variables first | |
13 | +IFT_DIR="C:\ift" | |
14 | +PY_INC="C:\Python26\include" | |
15 | +PY_LIB="C:\Python26\libs\python26.lib" | |
16 | +VTK_INC="C:\Arquivos de programas\VTK\include\vtk-5.4" | |
17 | + | |
18 | +PROG=scnvtk | |
19 | + | |
20 | +all: _$(PROG).pyd | |
21 | + | |
22 | +_$(PROG).pyd: $(PROG).i $(PROG).cxx | |
23 | + @echo Generating wrappers... | |
24 | + @swig -c++ -python $(PROG).i | |
25 | + @echo Compiling... | |
26 | + @cl.exe /nologo /EHsc -c $(PROG).cxx $(PROG)_wrap.cxx -I $(PY_INC) -I $(VTK_INC) -I $(IFT_DIR)\include | |
27 | + @echo Linking... | |
28 | + @link.exe /nologo -dll $(PROG).obj $(PROG)_wrap.obj $(PY_LIB) $(IFT_DIR)\lib\libift.lib -out:_$(PROG).pyd | |
29 | + @echo Done. | |
30 | + | |
31 | +clean: | |
32 | + del $(PROG).o $(PROG).py $(PROG)_wrap.c $(PROG)_wrap.o $(PROG).py _$(PROG).so *.pyc *.obj *.pyd *.exp *.lib *~ | |
33 | + | |
34 | + | |
35 | + | |
36 | + | ... | ... |
... | ... | @@ -0,0 +1,86 @@ |
1 | + | |
2 | +#include "vtkImageData.h" | |
3 | + | |
4 | + | |
5 | +extern "C" { | |
6 | + #include "ift.h" | |
7 | +} | |
8 | + | |
9 | + | |
10 | +// Prototypes | |
11 | + | |
12 | + | |
13 | +char *PointerToString(void *ptr, const char *type); | |
14 | +void *StringToPointer(char *ptrText, int len, const char *type); | |
15 | +void CopyImageBufferScnToVtk(char *ptrvtk, Scene *scn); | |
16 | +void CopyImageBufferVtkToScn(Scene *scn, char *ptrvtk); | |
17 | + | |
18 | + | |
19 | + | |
20 | + | |
21 | + | |
22 | +//#if defined ( _MSC_VER ) | |
23 | +//# define vtkConvertPtrToLong(x) ((long)(PtrToUlong(x))) | |
24 | +//#else | |
25 | +# define vtkConvertPtrToLong(x) ((long)(x)) | |
26 | +//#endif | |
27 | + | |
28 | +//-------------------------------------------------------------------- | |
29 | +// mangle a void pointer into a SWIG-style string | |
30 | +char *PointerToString(void *ptr, const char *type) | |
31 | +{ | |
32 | + static char ptrText[128]; | |
33 | + sprintf(ptrText,"_%*.*lx_%s",2*(int)sizeof(void *),2*(int)sizeof(void *), | |
34 | + vtkConvertPtrToLong(ptr),type); | |
35 | + return ptrText; | |
36 | +} | |
37 | + | |
38 | +//-------------------------------------------------------------------- | |
39 | +// unmangle a void pointer from a SWIG-style string | |
40 | +void *StringToPointer(char *ptrText, int len, const char *type) | |
41 | +{ | |
42 | + int i; | |
43 | + void *ptr; | |
44 | + char typeCheck[128]; | |
45 | + if (len < 128) { | |
46 | + i = sscanf(ptrText,"_%lx_%s",(long *)&ptr,typeCheck); | |
47 | + if (strcmp(type,typeCheck) == 0) { | |
48 | + // sucessfully unmangle | |
49 | + return ptr; | |
50 | + } | |
51 | + } | |
52 | + return NULL; | |
53 | +} | |
54 | + | |
55 | + | |
56 | + | |
57 | +void CopyImageBufferScnToVtk(char *ptrvtk, Scene *scn) { | |
58 | + int i; | |
59 | + int n = scn->xsize*scn->ysize*scn->zsize; | |
60 | + short int *ptr = (short int *) StringToPointer(ptrvtk,strlen(ptrvtk),"void_p"); | |
61 | + if (ptr==NULL) { | |
62 | + printf("CopyImageBufferScnToVtk() error! Null Pointer!\n"); | |
63 | + return; | |
64 | + } | |
65 | + for (i=0;i<n;i++) | |
66 | + *(ptr+i)=(short int) scn->data[i]; | |
67 | +} | |
68 | + | |
69 | + | |
70 | +void CopyImageBufferVtkToScn(Scene *scn, char *ptrvtk) { | |
71 | + int i; | |
72 | + int n = scn->xsize*scn->ysize*scn->zsize; | |
73 | + short int *ptr = (short int *) StringToPointer(ptrvtk,strlen(ptrvtk),"void_p"); | |
74 | + if (ptr==NULL) { | |
75 | + printf("CopyImageBufferVtkToScn() error! Null Pointer!\n"); | |
76 | + return; | |
77 | + } | |
78 | + for (i=0;i<n;i++) | |
79 | + scn->data[i] = (int) *(ptr+i); | |
80 | +} | |
81 | + | |
82 | + | |
83 | + | |
84 | + | |
85 | + | |
86 | + | ... | ... |
... | ... | @@ -0,0 +1,33 @@ |
1 | + | |
2 | + | |
3 | +/* example.i */ | |
4 | +%module scnvtk | |
5 | + | |
6 | +%{ | |
7 | +/* Put header files here or function declarations like below */ | |
8 | + | |
9 | +extern "C" { | |
10 | + #include "ift.h" | |
11 | +} | |
12 | +#include "vtkImageData.h" | |
13 | + | |
14 | +extern char *PointerToString(void *ptr, const char *type); | |
15 | +extern void *StringToPointer(char *ptrText, int len, const char *type); | |
16 | +extern void CopyImageBufferScnToVtk(char *ptrvtk, Scene *scn); | |
17 | +extern void CopyImageBufferVtkToScn(Scene *scn, char *ptrvtk); | |
18 | + | |
19 | +%} | |
20 | + | |
21 | + | |
22 | +extern "C" { | |
23 | + #include "ift.h" | |
24 | +} | |
25 | +#include "vtkImageData.h" | |
26 | + | |
27 | +extern char *PointerToString(void *ptr, const char *type); | |
28 | +extern void *StringToPointer(char *ptrText, int len, const char *type); | |
29 | +extern void CopyImageBufferScnToVtk(char *ptrvtk, Scene *scn); | |
30 | +extern void CopyImageBufferVtkToScn(Scene *scn, char *ptrvtk); | |
31 | + | |
32 | + | |
33 | + | ... | ... |