[Paraview] Programmable filter VTK/numpy
Cory Quammen
cory.quammen at kitware.com
Wed Oct 25 09:08:12 EDT 2017
You should change 'array_name' to 'MetaImage'. Sorry I didn't make it clear
that 'array_name' is just a placeholder for whatever name your array has.
Cory
On Wed, Oct 25, 2017 at 7:46 AM, Edoardo Pasca <edo.paskino at gmail.com>
wrote:
> Hallo Cory and all,
>
> I've spent a few minutes trying to find out where my script crashes:
>
> 1) I load a MetaImage and the scalars are named 'MetaImage'
>
> 2) Paraview crashes if I use inData = dsa.WrapDataObject(inputs[0])
>
> B = inData.PointData['array_name'] # best practice is to name the array
>
>
> 3) If I use the outData = dsa.WrapDataObject(output)
>
> outData.PointData.append(A,'new_array_name')
>
>
> the output contains nothing. It says type Uniform Rectilinear Grid but there is no point inside.
>
>
> Thanks
>
>
> Edo
>
>
> On Fri, Oct 20, 2017 at 3:48 PM, Cory Quammen <cory.quammen at kitware.com>
> wrote:
>
>> On Thu, Oct 19, 2017 at 11:02 AM, Edoardo Pasca <edo.paskino at gmail.com>
>> wrote:
>>
>>> Hi Cory,
>>>
>>> thanks for your reply. I'd love to simplify the code like that but there
>>> are 2 issues with that programmable filter
>>>
>>> 1) I miss information on the input and output variables. Where are
>>> defined?
>>>
>>
>> It's a bit complicated to select them in the user interface, but it is
>> possible. There was a related discussion on the mailing list recently on
>> how to do this: http://paraview.markmail.org/thread/j4ynkclxcucpqoa5
>>
>> In the worst case, you can hard-code the array names if they don't
>> change. Relying on the active scalar attribute is old-style VTK and may go
>> away someday in the not-too-near future. Or you could just keep your
>> original code for defining array B.
>>
>>
>>> 2) Paraview crashes. Paraview for windows 5.4.1 and 5.3.0 (official
>>> kitware build)
>>>
>>> It seems a memory access problem.
>>>
>>
>> To debug, I suggest writing your Programmable Filter script a few lines
>> at a time to determine which line causes the crash.
>>
>> HTH,
>> Cory
>>
>>
>>> Edo
>>>
>>> On Thu, Oct 19, 2017 at 2:52 PM, Cory Quammen <cory.quammen at kitware.com>
>>> wrote:
>>>
>>>> Hi Edo,
>>>>
>>>> Documentation for the VTK/Numpy adapter can be found here:
>>>>
>>>> https://www.paraview.org/ParaView/Doc/Nightly/www/py-doc/par
>>>> aview.vtk.numpy_interface.html?highlight=numpy_interface#num
>>>> py-interface-package
>>>>
>>>> You will likely be interested in the dataset_adapter module that
>>>> provides a convenient way to wrap VTK data objects in a Python class that
>>>> provides easy read/write access to VTK data arrays as Numpy arrays.
>>>>
>>>> You could simplify your code quite a bit using this adapter as in the
>>>> following:
>>>>
>>>> import numpy
>>>>
>>>> from vtk.util import numpy_support, vtkImageImportFromArray
>>>>
>>>> import vtk.numpy_interface.dataset_adapter as dsa
>>>>
>>>>
>>>> inData = dsa.WrapDataObject(inputs[0])
>>>>
>>>> B = inData.PointData['array_name'] # best practice is to name the array
>>>>
>>>>
>>>> #B = numpy_support.vtk_to_numpy(
>>>>
>>>> # inputs[0].GetPointData().GetScalars())
>>>>
>>>>
>>>> ifLarger = lambda x,M: x if x<=M else 0
>>>>
>>>> fgt = numpy.frompyfunc(ifLarger,2,1)
>>>>
>>>> #A = fgt(B,int(2**16*0.8))
>>>>
>>>>
>>>> ifSmaller = lambda x,M: x if x>M else 0
>>>>
>>>> flt = numpy.frompyfunc(ifSmaller,2,1)
>>>>
>>>> #A = flt(B,int(2**16*0.3))
>>>>
>>>>
>>>> ifBetween = lambda x,m,M: ifSmaller(x,m) if x<=M else 0
>>>>
>>>> fbetw = numpy.frompyfunc(ifBetween,3,1)
>>>>
>>>>
>>>> A = fbetw(B,int(2**16*0.3), int(2**16*0.95))
>>>>
>>>>
>>>> outData = dsa.WrapDataObject(output)
>>>>
>>>> outData.PointData.append(A,'new_array_name')
>>>>
>>>>
>>>> #A = numpy.asarray(A,dtype=uint16)
>>>>
>>>> #dims = inputs[0].GetDimensions()
>>>>
>>>> #A = numpy.reshape(A, (dims[2],dims[1],dims[0]), order='C')
>>>>
>>>> #A = numpy.ascontiguousarray(A)
>>>>
>>>> #importer = vtkImageImportFromArray.vtkImageImportFromArray()
>>>>
>>>> #importer.SetArray(A)
>>>>
>>>> #importer.SetDataSpacing(inputs[0].GetSpacing())
>>>>
>>>> #importer.SetDataOrigin(inputs[0].GetOrigin())
>>>>
>>>> #importer.Update()
>>>>
>>>>
>>>> #output.DeepCopy(importer.GetOutput())
>>>>
>>>>
>>>> Hope that helps,
>>>>
>>>> Cory
>>>>
>>>> On Tue, Oct 17, 2017 at 10:38 AM, Edoardo Pasca <edo.paskino at gmail.com>
>>>> wrote:
>>>>
>>>>> Hi there,
>>>>>
>>>>> In my programmable filter I want to use numpy to perform some
>>>>> operations on the pixels (in this case a simple thresholding). I've come up
>>>>> with this solution which works. I'm wondering if there are other ways to do
>>>>> the conversion from numpy array to vtkImageData.
>>>>>
>>>>> in the following code I get a numpy array out of the input
>>>>> vtkImageData as B. Then I do something on the content an store the result
>>>>> in a numpy array, A.
>>>>>
>>>>> Then I convert the numpy array to a vtkImageData with
>>>>> vtkImageImportFromArray importer class.
>>>>> Finally I copy the importer output to the output of the programmable
>>>>> filter.
>>>>>
>>>>> Thanks for any suggestions
>>>>>
>>>>> Edo
>>>>>
>>>>> import numpy
>>>>>
>>>>> from vtk.util import numpy_support, vtkImageImportFromArray
>>>>>
>>>>> import vtk.numpy_interface.dataset_adapter as dsa
>>>>>
>>>>>
>>>>> B = numpy_support.vtk_to_numpy(
>>>>>
>>>>> inputs[0].GetPointData().GetScalars())
>>>>>
>>>>>
>>>>> ifLarger = lambda x,M: x if x<=M else 0
>>>>>
>>>>> fgt = numpy.frompyfunc(ifLarger,2,1)
>>>>>
>>>>> #A = fgt(B,int(2**16*0.8))
>>>>>
>>>>>
>>>>> ifSmaller = lambda x,M: x if x>M else 0
>>>>>
>>>>> flt = numpy.frompyfunc(ifSmaller,2,1)
>>>>>
>>>>> #A = flt(B,int(2**16*0.3))
>>>>>
>>>>>
>>>>> ifBetween = lambda x,m,M: ifSmaller(x,m) if x<=M else 0
>>>>>
>>>>> fbetw = numpy.frompyfunc(ifBetween,3,1)
>>>>>
>>>>>
>>>>> A = fbetw(B,int(2**16*0.3), int(2**16*0.95))
>>>>>
>>>>>
>>>>>
>>>>> A = numpy.asarray(A,dtype=uint16)
>>>>>
>>>>> dims = inputs[0].GetDimensions()
>>>>>
>>>>> A = numpy.reshape(A, (dims[2],dims[1],dims[0]), order='C')
>>>>>
>>>>> A = numpy.ascontiguousarray(A)
>>>>>
>>>>> importer = vtkImageImportFromArray.vtkImageImportFromArray()
>>>>>
>>>>> importer.SetArray(A)
>>>>>
>>>>> importer.SetDataSpacing(inputs[0].GetSpacing())
>>>>>
>>>>> importer.SetDataOrigin(inputs[0].GetOrigin())
>>>>>
>>>>> importer.Update()
>>>>>
>>>>>
>>>>> output.DeepCopy(importer.GetOutput())
>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> Edo
>>>>> I know you think you understand what you thought I said, but I'm not
>>>>> sure you realize that what you heard is not what I meant (prob. Alan
>>>>> Greenspan)
>>>>> :wq
>>>>>
>>>>> _______________________________________________
>>>>> Powered by www.kitware.com
>>>>>
>>>>> Visit other Kitware open-source projects at
>>>>> http://www.kitware.com/opensource/opensource.html
>>>>>
>>>>> Please keep messages on-topic and check the ParaView Wiki at:
>>>>> http://paraview.org/Wiki/ParaView
>>>>>
>>>>> Search the list archives at: http://markmail.org/search/?q=ParaView
>>>>>
>>>>> Follow this link to subscribe/unsubscribe:
>>>>> http://public.kitware.com/mailman/listinfo/paraview
>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>> Cory Quammen
>>>> Staff R&D Engineer
>>>> Kitware, Inc.
>>>>
>>>
>>>
>>>
>>> --
>>> Edo
>>> I know you think you understand what you thought I said, but I'm not
>>> sure you realize that what you heard is not what I meant (prob. Alan
>>> Greenspan)
>>> :wq
>>>
>>
>>
>>
>> --
>> Cory Quammen
>> Staff R&D Engineer
>> Kitware, Inc.
>>
>
>
>
> --
> Edo
> I know you think you understand what you thought I said, but I'm not sure
> you realize that what you heard is not what I meant (prob. Alan Greenspan)
> :wq
>
--
Cory Quammen
Staff R&D Engineer
Kitware, Inc.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/paraview/attachments/20171025/9cd93d7a/attachment.html>
More information about the ParaView
mailing list