From cr at neuro.ma.uni-heidelberg.de Wed Mar 1 08:12:59 2017 From: cr at neuro.ma.uni-heidelberg.de (Chr. Rossmanith) Date: Wed, 1 Mar 2017 14:12:59 +0100 Subject: [ITK-users] Patch for ApproximateSignedDistanceMapImageFilter Message-ID: For binary images with 0 for background and 1 for objects with an integer input pixel type there is a problem representing the average of 0 and 1 = 0.5 with the input pixel type. The output pixel type is required to be a floating pixel type (filter documentation), so it should be safe to change the type of levelSetValue to OutputPixelType. Regards, Christina -------------- next part -------------- A non-text attachment was scrubbed... Name: 0001-BUG-calculate-levelSetValue-for-IsoContourFilter-wit.patch Type: text/x-patch Size: 1430 bytes Desc: not available URL: From francois.budin at kitware.com Wed Mar 1 08:42:54 2017 From: francois.budin at kitware.com (Francois Budin) Date: Wed, 1 Mar 2017 08:42:54 -0500 Subject: [ITK-users] Patch for ApproximateSignedDistanceMapImageFilter In-Reply-To: References: Message-ID: Hello Christina, Thanks for the patch. Do you mind submitting it on Gerrit? This will simplify the review process. If you do not already have a user account on Gerrit, you can follow the instructions available here [1]. It will also help to keep track of your own contributions, and will make potential future contributions easy. Thanks for helping, Francois [1] https://itk.org/Wiki/ITK/Git/Develop On Wed, Mar 1, 2017 at 8:12 AM, Chr. Rossmanith < cr at neuro.ma.uni-heidelberg.de> wrote: > For binary images with 0 for background and 1 for objects with an integer > input pixel type there is a problem representing the average of 0 and 1 = > 0.5 with the input pixel type. The output pixel type is required to be a > floating pixel type (filter documentation), so it should be safe to change > the type of levelSetValue to OutputPixelType. > > Regards, > Christina > > > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From cr at neuro.ma.uni-heidelberg.de Wed Mar 1 08:47:18 2017 From: cr at neuro.ma.uni-heidelberg.de (Chr. Rossmanith) Date: Wed, 1 Mar 2017 14:47:18 +0100 Subject: [ITK-users] Patch for ApproximateSignedDistanceMapImageFilter In-Reply-To: References: Message-ID: <547d4adb-84e8-403f-acdc-ff0738c8b825@neuro.ma.uni-heidelberg.de> I'm behind a firewall and authentication fails. I can login into gerrit, so it is not a wrong password. The wiki [1] told me to send the patch to the ML because something is currently out of order... [1] https://itk.org/Wiki/ITK/Git/Account#Gerrit Christina On 01.03.2017 14:42, Francois Budin wrote: > Hello Christina, > > Thanks for the patch. Do you mind submitting it on Gerrit? This will > simplify the review process. If you do not already have a user account > on Gerrit, you can follow the instructions available here [1]. It will > also help to keep track of your own contributions, and will make > potential future contributions easy. > > Thanks for helping, > Francois > > [1] https://itk.org/Wiki/ITK/Git/Develop > > On Wed, Mar 1, 2017 at 8:12 AM, Chr. Rossmanith > > > wrote: > > For binary images with 0 for background and 1 for objects with an > integer input pixel type there is a problem representing the > average of 0 and 1 = 0.5 with the input pixel type. The output > pixel type is required to be a floating pixel type (filter > documentation), so it should be safe to change the type of > levelSetValue to OutputPixelType. > > Regards, > Christina > > > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From bakkari.abdelkhalek at hotmail.fr Thu Mar 2 09:15:09 2017 From: bakkari.abdelkhalek at hotmail.fr (Abdelkhalek Bakkari) Date: Thu, 2 Mar 2017 14:15:09 +0000 Subject: [ITK-users] ITK version Message-ID: Dear Insight users, I would like to ask about the version of ITK which matches with VTK 7.1.0. Thank you in advance. Kind regards, Abdelkhalek Bakkari Ph.D candidate in Computer Science Institute of Applied Computer Science Lodz University of Technology, Poland -------------- next part -------------- An HTML attachment was scrubbed... URL: From dzenanz at gmail.com Thu Mar 2 09:35:45 2017 From: dzenanz at gmail.com (=?UTF-8?B?RMW+ZW5hbiBadWtpxIc=?=) Date: Thu, 2 Mar 2017 09:35:45 -0500 Subject: [ITK-users] ITK version In-Reply-To: References: Message-ID: Hi Abdelkhalek, there is no "matching" between versions of ITK and VTK. There is only compatibility. And probably all recent versions of ITK should be compatible with VTK 7.1 - probably entire 4.x series of ITK. I did not check this though. Regards, D?enan On Thu, Mar 2, 2017 at 9:15 AM, Abdelkhalek Bakkari < bakkari.abdelkhalek at hotmail.fr> wrote: > Dear Insight users, > > > I would like to ask about the version of ITK which matches with VTK 7.1.0. > > > Thank you in advance. > > > Kind regards, > > > Abdelkhalek Bakkari > Ph.D candidate in Computer Science > Institute of Applied Computer Science > Lodz University of Technology, Poland > > > > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From Gordian.Kabelitz at medma.uni-heidelberg.de Thu Mar 2 11:24:19 2017 From: Gordian.Kabelitz at medma.uni-heidelberg.de (Kabelitz, Gordian) Date: Thu, 2 Mar 2017 16:24:19 +0000 Subject: [ITK-users] ITK Image data pointer and GPU algorithms Message-ID: Hello, i want to copy my image data on the GPU. Therefore I need to retrieve my image data from the itk::Image class. The method that seems suitable is GetBufferPointer. Hence, I know the size of my image and the pixel type I could get a pointer to the image data. I cant use itk::GPUImage because my algorithm is not implemented in ITK. My idea is to get the data pointer, do my computation and My code looks like: // get float pointer to image data ImageType::Pointer image = reader->GetOutput(); Image->Update(); float* data = image.GetBufferPointer(); // copy image data to gpu gpu_dev->setVoxels(dimension, voxelSize, data); [...] My setVoxels() method is at the end of this mail. When I try to access the memory on the gpu where the data should be stored (at least in my imagination) I get an error. The error occurs at the checking line for the data input. I read [1] and tried the suggested methods. But I want to work directly on the data and don't want to make any copy. But couldn't get any closer to a solution. My questions are: 1. Is there a good way to retrieve my image data other than suggested in [1] (less copying)? 2. Is it error-prone to change the image data without using itk? 3. Can I work directly on the itk::image data without making a copy? [1]: https://itk.org/CourseWare/Training/GettingStarted-V.pdf Thank you. Sincerely, Gordian bool CProjection::setVoxels( const int* dimension, const float* voxelSize, const float* data) { // check input std::cout << "CUDA: Dimension:" << dimension[0] << ", " << dimension[1] << ", " << dimension[2] << "\n"; std::cout << "CUDA: Spacing:" << voxelSize[0] << ", " << voxelSize[1] << ", " << voxelSize[2] << "\n"; std::cout << "CUDA: Data (3 values):" << data[0] << ", " << data[10] << ", " << data[100] << std::endl; cudaExtent volumeSize = make_cudaExtent(dimension[0], dimension[1], dimension[2]); volArray_dev = 0; // create 3D array const cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc(); DS_ERROR_CHECK(cudaMalloc3DArray(&volArray_dev, &channelDesc, volumeSize)); // copy data to 3D array cudaMemcpy3DParms copyParams = { 0 }; copyParams.srcPtr = make_cudaPitchedPtr((void*)data, volumeSize.width * sizeof(float), volumeSize.width, volumeSize.height); copyParams.dstArray = volArray_dev; copyParams.extent = volumeSize; copyParams.kind = cudaMemcpyHostToDevice; DS_ERROR_CHECK(cudaMemcpy3D(©Params)); // set texture parameters tex_vox.normalized = false; //do not access with normalized texture coordinates //use point access tex_vox.filterMode = cudaFilterModePoint; // clamp texture edges for out of boundary access tex_vox.addressMode[0] = cudaAddressModeClamp; tex_vox.addressMode[1] = cudaAddressModeClamp; tex_vox.addressMode[2] = cudaAddressModeClamp; // bind array to 3D texture DS_ERROR_CHECK(cudaBindTextureToArray(tex_vox, volArray_dev, channelDesc)); //Set volume information on host and dev for (int i = 0; i < 3; i++) { volDimension_host[i] = dimension[i]; voxSize_host[i] = voxelSize[i]; } DS_ERROR_CHECK(cudaMemcpyToSymbol(dc_voxDim, volDimension_host, 3 * sizeof(int))); DS_ERROR_CHECK(cudaMemcpyToSymbol(dc_voxSize, voxSize_host, 3 * sizeof(float))); voxelsSet = true; return voxelsSet; //on success } From dzenanz at gmail.com Thu Mar 2 15:24:14 2017 From: dzenanz at gmail.com (=?UTF-8?B?RMW+ZW5hbiBadWtpxIc=?=) Date: Thu, 2 Mar 2017 15:24:14 -0500 Subject: [ITK-users] ITK Image data pointer and GPU algorithms In-Reply-To: References: Message-ID: Hi Gordian, 1. Using GetBufferPointer is the right way to access raw pixel data for your case. 2. Not using ITK is more error prone way of manipulating image data. 3. I remember that with more recent versions of CUDA you have unified memory architecture, hence you can using the pointer given by GetBufferPointer to access pixel data. I don't remember whether this implies slower access (you have to account for latency of PCIe bus) or it implicitly copies the data to GPU. Regards, D?enan On Thu, Mar 2, 2017 at 11:24 AM, Kabelitz, Gordian < Gordian.Kabelitz at medma.uni-heidelberg.de> wrote: > Hello, > > i want to copy my image data on the GPU. Therefore I need to retrieve my > image data from the itk::Image class. The method that seems suitable is > GetBufferPointer. Hence, I know the size of my image and the pixel type I > could get a pointer to the image data. > I cant use itk::GPUImage because my algorithm is not implemented in ITK. > My idea is to get the data pointer, do my computation and > My code looks like: > > // get float pointer to image data > ImageType::Pointer image = reader->GetOutput(); > Image->Update(); > > float* data = image.GetBufferPointer(); > // copy image data to gpu > gpu_dev->setVoxels(dimension, voxelSize, data); > [...] > > My setVoxels() method is at the end of this mail. > > When I try to access the memory on the gpu where the data should be stored > (at least in my imagination) I get an error. > The error occurs at the checking line for the data input. > > I read [1] and tried the suggested methods. But I want to work directly > on the data and don't want to make any copy. > But couldn't get any closer to a solution. > > My questions are: > 1. Is there a good way to retrieve my image data other than suggested in > [1] (less copying)? > 2. Is it error-prone to change the image data without using itk? > 3. Can I work directly on the itk::image data without making a copy? > > [1]: https://itk.org/CourseWare/Training/GettingStarted-V.pdf > > Thank you. > Sincerely, > Gordian > > > bool CProjection::setVoxels( const int* dimension, const float* voxelSize, > const float* data) > { > // check input > std::cout << "CUDA: Dimension:" << dimension[0] << ", " << > dimension[1] << ", " << dimension[2] << "\n"; > std::cout << "CUDA: Spacing:" << voxelSize[0] << ", " << > voxelSize[1] << ", " << voxelSize[2] << "\n"; > std::cout << "CUDA: Data (3 values):" << data[0] << ", " << > data[10] << ", " << data[100] << std::endl; > > cudaExtent volumeSize = make_cudaExtent(dimension[0], > dimension[1], dimension[2]); > volArray_dev = 0; > > // create 3D array > const cudaChannelFormatDesc channelDesc = > cudaCreateChannelDesc(); > DS_ERROR_CHECK(cudaMalloc3DArray(&volArray_dev, &channelDesc, > volumeSize)); > > // copy data to 3D array > cudaMemcpy3DParms copyParams = { 0 }; > copyParams.srcPtr = make_cudaPitchedPtr((void*)data, > volumeSize.width * sizeof(float), volumeSize.width, volumeSize.height); > copyParams.dstArray = volArray_dev; > copyParams.extent = volumeSize; > copyParams.kind = cudaMemcpyHostToDevice; > > DS_ERROR_CHECK(cudaMemcpy3D(©Params)); > > // set texture parameters > tex_vox.normalized = false; //do not access with normalized > texture coordinates > > //use point access > tex_vox.filterMode = cudaFilterModePoint; > // clamp texture edges for out of boundary access > tex_vox.addressMode[0] = cudaAddressModeClamp; > tex_vox.addressMode[1] = cudaAddressModeClamp; > tex_vox.addressMode[2] = cudaAddressModeClamp; > > // bind array to 3D texture > DS_ERROR_CHECK(cudaBindTextureToArray(tex_vox, volArray_dev, > channelDesc)); > > //Set volume information on host and dev > for (int i = 0; i < 3; i++) { > volDimension_host[i] = dimension[i]; > voxSize_host[i] = voxelSize[i]; > } > > DS_ERROR_CHECK(cudaMemcpyToSymbol(dc_voxDim, volDimension_host, 3 > * sizeof(int))); > DS_ERROR_CHECK(cudaMemcpyToSymbol(dc_voxSize, voxSize_host, 3 * > sizeof(float))); > > voxelsSet = true; > return voxelsSet; //on success > } > > > > > > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > -------------- next part -------------- An HTML attachment was scrubbed... URL: From cr at neuro.ma.uni-heidelberg.de Fri Mar 3 10:32:07 2017 From: cr at neuro.ma.uni-heidelberg.de (Chr. Rossmanith) Date: Fri, 3 Mar 2017 16:32:07 +0100 Subject: [ITK-users] ExtractSliceImageFilter & image orientation Message-ID: Hi, I'd like to extract a sagittal slice from a 3d image volume. The application should be quite flexible and thus be able to process axial, coronal and sagittal image volumes. This is my mini pipeline: OrientImageFilter -> ExtractImageFilter The problem is that I keep getting the slice rotated 90? and flipped. ITK snap renderes the volume correctly with correct orientation labels. I've attached the source code and the input data volume. Of course I could rotate and flip the slice back, but that's not very elegant... Any hints what is going wrong here? Regards, Christina Ro?manith -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: beabhdepikfmaign.png Type: image/png Size: 21822 bytes Desc: not available URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: omnoblnnkjmeooia.png Type: image/png Size: 3110 bytes Desc: not available URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: CCmanually.nii.gz Type: application/gzip Size: 15226 bytes Desc: not available URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: ExtractTest.cxx Type: text/x-c++src Size: 2231 bytes Desc: not available URL: From matt.mccormick at kitware.com Fri Mar 3 10:38:06 2017 From: matt.mccormick at kitware.com (Matt McCormick) Date: Fri, 3 Mar 2017 10:38:06 -0500 Subject: [ITK-users] ExtractSliceImageFilter & image orientation In-Reply-To: References: Message-ID: Hello Christina, One option may be to call SetDirectionCollapseToStrategy on ExtractImageFilter: https://itk.org/Doxygen/html/classitk_1_1ExtractImageFilter.html#a5b3bcfa552d8ad7cf509e32209aadc13 This approach addresses the Image Direction matrix. Another option is to use FlipImageFilter: https://itk.org/Doxygen/html/classitk_1_1FlipImageFilter.html instead of OrientImageFilter. Hope this helps, Matt On Fri, Mar 3, 2017 at 10:32 AM, Chr. Rossmanith < cr at neuro.ma.uni-heidelberg.de> wrote: > Hi, > > I'd like to extract a sagittal slice from a 3d image volume. The > application should be quite flexible and thus be able to process axial, > coronal and sagittal image volumes. > > This is my mini pipeline: OrientImageFilter -> ExtractImageFilter > > The problem is that I keep getting the slice rotated 90? and flipped. ITK > snap renderes the volume correctly with correct orientation labels. I've > attached the source code and the input data volume. Of course I could > rotate and flip the slice back, but that's not very elegant... > > Any hints what is going wrong here? > > Regards, > > Christina Ro?manith > > > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > > -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: omnoblnnkjmeooia.png Type: image/png Size: 3110 bytes Desc: not available URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: beabhdepikfmaign.png Type: image/png Size: 21822 bytes Desc: not available URL: From wangtao_ at sjtu.edu.cn Sat Mar 4 03:32:36 2017 From: wangtao_ at sjtu.edu.cn (wangtaoiz) Date: Sat, 4 Mar 2017 01:32:36 -0700 (MST) Subject: [ITK-users] How to use SimplITK with its example? Where is the test data? Message-ID: <1488616356546-37948.post@n7.nabble.com> Hello everyone, I have built SimpleITK successfully and want to test is with its examples (e.g. ImageRegistrationMethodBSpline1), I found the test data downloaded from the net is in a mass, also when I use my own image data(3D volume), the program stop and do nothing when it start to read the data. I wondered if I download the wrong data? Can somebody give me a way? -- View this message in context: http://itk-users.7.n7.nabble.com/How-to-use-SimplITK-with-its-example-Where-is-the-test-data-tp37948.html Sent from the ITK - Users mailing list archive at Nabble.com. From zivrafael.yaniv at nih.gov Sat Mar 4 09:29:09 2017 From: zivrafael.yaniv at nih.gov (Yaniv, Ziv Rafael (NIH/NLM/LHC) [C]) Date: Sat, 4 Mar 2017 14:29:09 +0000 Subject: [ITK-users] How to use SimplITK with its example? Where is the test data? In-Reply-To: <1488616356546-37948.post@n7.nabble.com> References: <1488616356546-37948.post@n7.nabble.com> Message-ID: Welcome to SimpleITK. If you are working in Python or R I would suggest going over the set of Jupyter notebooks we developed, illustrating the functionality of the toolkit. Repository and instructions can be found here: https://github.com/InsightSoftwareConsortium/SimpleITK-Notebooks The data used in these examples is automagically downloaded from the online repositories. regards Ziv On 3/4/17, 3:32 AM, "wangtaoiz" wrote: Hello everyone, I have built SimpleITK successfully and want to test is with its examples (e.g. ImageRegistrationMethodBSpline1), I found the test data downloaded from the net is in a mass, also when I use my own image data(3D volume), the program stop and do nothing when it start to read the data. I wondered if I download the wrong data? Can somebody give me a way? -- View this message in context: http://itk-users.7.n7.nabble.com/How-to-use-SimplITK-with-its-example-Where-is-the-test-data-tp37948.html Sent from the ITK - Users mailing list archive at Nabble.com. _____________________________________ Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Kitware offers ITK Training Courses, for more information visit: http://www.kitware.com/products/protraining.php Please keep messages on-topic and check the ITK FAQ at: http://www.itk.org/Wiki/ITK_FAQ Follow this link to subscribe/unsubscribe: http://public.kitware.com/mailman/listinfo/insight-users From ChrRossmanith at gmx.de Sat Mar 4 11:57:20 2017 From: ChrRossmanith at gmx.de (=?UTF-8?Q?Christina_Ro=C3=9Fmanith?=) Date: Sat, 4 Mar 2017 09:57:20 -0700 (MST) Subject: [ITK-users] ExtractSliceImageFilter & image orientation In-Reply-To: References: Message-ID: <1488646640343-7589661.post@n2.nabble.com> Hi Matt, SetDirectionCollapseToGuess() and SetDirectionCollapseToIdentity() both lead to the same bad oriented slice, SetDirectionCollapseToSubmatrix() throws an exception with error message "Invalid submatrix extracted for collapsed direction." But SetUseImageDirection( true ) and SetDesiredCoordinateOrientationToSagittal() on the OrientImageFilter in combination with SetDirectionCollapseToSubmatrix() on the ExtractImageFilter did the trick. Regards, Christina -- View this message in context: http://itk-insight-users.2283740.n2.nabble.com/ITK-users-ExtractSliceImageFilter-image-orientation-tp7589657p7589661.html Sent from the ITK Insight Users mailing list archive at Nabble.com. From fisidoro at ethz.ch Sun Mar 5 17:14:02 2017 From: fisidoro at ethz.ch (D'Isidoro Fabio) Date: Sun, 5 Mar 2017 22:14:02 +0000 Subject: [ITK-users] 3D image centre Message-ID: <50B858FB5F53124F9E32314E5C1B4094446F7376@MBX212.d.ethz.ch> Hi, since the image origin is defined in the middle of the "first" voxel and not at the very corner of the CT scan, I would calculate the image centre as: img_centre[0] = origin[0] + spacing[0] * static_cast(size[0]) / 2.0 - spacing[0] / 2.; Is that right? Thank you -------------- next part -------------- An HTML attachment was scrubbed... URL: From dzenanz at gmail.com Sun Mar 5 18:48:46 2017 From: dzenanz at gmail.com (=?UTF-8?B?RMW+ZW5hbiBadWtpxIc=?=) Date: Sun, 5 Mar 2017 18:48:46 -0500 Subject: [ITK-users] 3D image centre In-Reply-To: <50B858FB5F53124F9E32314E5C1B4094446F7376@MBX212.d.ethz.ch> References: <50B858FB5F53124F9E32314E5C1B4094446F7376@MBX212.d.ethz.ch> Message-ID: Hi Fabio, that sound right. Regards, D?enan On Sun, Mar 5, 2017 at 5:14 PM, D'Isidoro Fabio wrote: > Hi, > > > > since the image origin is defined in the middle of the ?first? voxel and > not at the very corner of the CT scan, I would calculate the image centre > as: > > > > img_centre[0] = origin[0] + spacing[0] * > static_cast(size[0]) / 2.0 - spacing[0] / 2.; > > > > Is that right? > > > > Thank you > > > > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From blowekamp at mail.nih.gov Mon Mar 6 08:54:55 2017 From: blowekamp at mail.nih.gov (Lowekamp, Bradley (NIH/NLM/LHC) [C]) Date: Mon, 6 Mar 2017 13:54:55 +0000 Subject: [ITK-users] 3D image centre In-Reply-To: References: <50B858FB5F53124F9E32314E5C1B4094446F7376@MBX212.d.ethz.ch> Message-ID: <380186F4-DC27-4354-8470-A4CF5F4536EF@mail.nih.gov> You are missing that application of your image?s orientation/direction cosine matrix. I?d recommend computing the center index (as a ContinuousIndex type), and then using the Image::TransformContinuousIndexToPhysicalPoint[1] method. HTH, Brad [1] https://itk.org/Doxygen/html/classitk_1_1ImageBase.html#ad3965f819b7d61e34605dc0331df0751 On Mar 5, 2017, at 6:48 PM, D?enan Zuki? > wrote: Hi Fabio, that sound right. Regards, D?enan On Sun, Mar 5, 2017 at 5:14 PM, D'Isidoro Fabio > wrote: Hi, since the image origin is defined in the middle of the ?first? voxel and not at the very corner of the CT scan, I would calculate the image centre as: img_centre[0] = origin[0] + spacing[0] * static_cast(size[0]) / 2.0 - spacing[0] / 2.; Is that right? Thank you _____________________________________ Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Kitware offers ITK Training Courses, for more information visit: http://www.kitware.com/products/protraining.php Please keep messages on-topic and check the ITK FAQ at: http://www.itk.org/Wiki/ITK_FAQ Follow this link to subscribe/unsubscribe: http://public.kitware.com/mailman/listinfo/insight-users _____________________________________ Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Kitware offers ITK Training Courses, for more information visit: http://www.kitware.com/products/protraining.php Please keep messages on-topic and check the ITK FAQ at: http://www.itk.org/Wiki/ITK_FAQ Follow this link to subscribe/unsubscribe: http://public.kitware.com/mailman/listinfo/insight-users -------------- next part -------------- An HTML attachment was scrubbed... URL: From blowekamp at mail.nih.gov Mon Mar 6 09:27:17 2017 From: blowekamp at mail.nih.gov (Lowekamp, Bradley (NIH/NLM/LHC) [C]) Date: Mon, 6 Mar 2017 14:27:17 +0000 Subject: [ITK-users] [ITK] How to use SimplITK with its example? Where is the test data? In-Reply-To: References: <1488616356546-37948.post@n7.nabble.com> Message-ID: Hi, There is a FAQ question which can help: Where is the Test Data? https://itk.org/Wiki/SimpleITK/FAQ#Where_is_the_Test_Data.3F Brad > On Mar 4, 2017, at 9:29 AM, Yaniv, Ziv Rafael (NIH/NLM/LHC) [C] wrote: > > Welcome to SimpleITK. > > If you are working in Python or R I would suggest going over the set of Jupyter notebooks we developed, illustrating the functionality of the toolkit. > Repository and instructions can be found here: https://github.com/InsightSoftwareConsortium/SimpleITK-Notebooks > The data used in these examples is automagically downloaded from the online repositories. > > regards > Ziv > > On 3/4/17, 3:32 AM, "wangtaoiz" wrote: > > Hello everyone, I have built SimpleITK successfully and want to test is with > its examples (e.g. ImageRegistrationMethodBSpline1), I found the test data > downloaded from the net is in a mass, also when I use my own image data(3D > volume), the program stop and do nothing when it start to read the data. I > wondered if I download the wrong data? Can somebody give me a way? > > > > -- > View this message in context: http://itk-users.7.n7.nabble.com/How-to-use-SimplITK-with-its-example-Where-is-the-test-data-tp37948.html > Sent from the ITK - Users mailing list archive at Nabble.com. > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > > > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > _______________________________________________ > Community mailing list > Community at itk.org > http://public.kitware.com/mailman/listinfo/community From asertyuio at yahoo.fr Mon Mar 6 11:47:05 2017 From: asertyuio at yahoo.fr (asertyuio) Date: Mon, 6 Mar 2017 17:47:05 +0100 Subject: [ITK-users] transfer 2D histogram data to itk::image Message-ID: Hi all, I need to calculate an histogram of an image that have 2 or 3 values per pixel, (resulting in a nbin x nbin "matrix" for example in the case of 2 values per pixel) I see that I can use the itk::Statistics::Histogram filter to calculate multidimensional histograms. However, I need to process this histogram using functions that can be applied to itk::image objects (e.g. morphological operations). So the question is, can I convert the output of the Histogram filter to a itk::image ? Best would be not to duplicate memory of course. Is there a clean way of doing that ? Thanks for your help ! Yann From matt.mccormick at kitware.com Mon Mar 6 11:58:15 2017 From: matt.mccormick at kitware.com (Matt McCormick) Date: Mon, 6 Mar 2017 11:58:15 -0500 Subject: [ITK-users] transfer 2D histogram data to itk::image In-Reply-To: References: Message-ID: Hi Yann, HistogramToImageFilter may be what you are looking for: https://itk.org/Doxygen/html/classitk_1_1HistogramToImageFilter.html HTH, Matt On Mon, Mar 6, 2017 at 11:47 AM, asertyuio via Insight-users wrote: > Hi all, > > I need to calculate an histogram of an image that have 2 or 3 values per > pixel, (resulting in a nbin x nbin "matrix" for example in the case of 2 > values per pixel) > I see that I can use the itk::Statistics::Histogram filter to calculate > multidimensional histograms. > > However, I need to process this histogram using functions that can be > applied to itk::image objects (e.g. morphological operations). > So the question is, can I convert the output of the Histogram filter to > a itk::image ? Best would be not to duplicate memory of course. > > Is there a clean way of doing that ? > > Thanks for your help ! > Yann > > > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users From asertyuio at yahoo.fr Mon Mar 6 12:04:08 2017 From: asertyuio at yahoo.fr (asertyuio) Date: Mon, 6 Mar 2017 18:04:08 +0100 Subject: [ITK-users] transfer 2D histogram data to itk::image In-Reply-To: References: Message-ID: Haha, I should have found this one... Many thanks Matt! Le 06/03/2017 ? 17:58, Matt McCormick a ?crit : > Hi Yann, > > HistogramToImageFilter may be what you are looking for: > > https://itk.org/Doxygen/html/classitk_1_1HistogramToImageFilter.html > > HTH, > Matt > > On Mon, Mar 6, 2017 at 11:47 AM, asertyuio via Insight-users > wrote: >> Hi all, >> >> I need to calculate an histogram of an image that have 2 or 3 values per >> pixel, (resulting in a nbin x nbin "matrix" for example in the case of 2 >> values per pixel) >> I see that I can use the itk::Statistics::Histogram filter to calculate >> multidimensional histograms. >> >> However, I need to process this histogram using functions that can be >> applied to itk::image objects (e.g. morphological operations). >> So the question is, can I convert the output of the Histogram filter to >> a itk::image ? Best would be not to duplicate memory of course. >> >> Is there a clean way of doing that ? >> >> Thanks for your help ! >> Yann >> >> >> _____________________________________ >> Powered by www.kitware.com >> >> Visit other Kitware open-source projects at >> http://www.kitware.com/opensource/opensource.html >> >> Kitware offers ITK Training Courses, for more information visit: >> http://www.kitware.com/products/protraining.php >> >> Please keep messages on-topic and check the ITK FAQ at: >> http://www.itk.org/Wiki/ITK_FAQ >> >> Follow this link to subscribe/unsubscribe: >> http://public.kitware.com/mailman/listinfo/insight-users From bakkari.abdelkhalek at hotmail.fr Tue Mar 7 09:31:10 2017 From: bakkari.abdelkhalek at hotmail.fr (Abdelkhalek Bakkari) Date: Tue, 7 Mar 2017 14:31:10 +0000 Subject: [ITK-users] Loading and reading NIFTI images Message-ID: Dear Insight users, I trying to use ITK and Qt to load nifti image. Could you help me please ? Thank you in advance. Best regards, Abdelkhalek Bakkari Ph.D candidate in Computer Science Institute of Applied Computer Science Lodz University of Technology, Poland -------------- next part -------------- An HTML attachment was scrubbed... URL: From francois.budin at kitware.com Tue Mar 7 09:46:13 2017 From: francois.budin at kitware.com (Francois Budin) Date: Tue, 7 Mar 2017 09:46:13 -0500 Subject: [ITK-users] Loading and reading NIFTI images In-Reply-To: References: Message-ID: Hello Abdelkhalek, Using the itkImageFileReader filter should allow you to open any format that ITK support, including NIFTI, thanks to the factory mechanism in ITK. You can find an example here [1]. Hope this helps, Francois [1] https://itk.org/ITKExamples/src/IO/ImageBase/ReadAnImage/Documentation.html On Tue, Mar 7, 2017 at 9:31 AM, Abdelkhalek Bakkari < bakkari.abdelkhalek at hotmail.fr> wrote: > Dear Insight users, > > > I trying to use ITK and Qt to load nifti image. Could you help me please ? > > > Thank you in advance. > > > Best regards, > > > Abdelkhalek Bakkari > Ph.D candidate in Computer Science > Institute of Applied Computer Science > Lodz University of Technology, Poland > > > > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From bakkari.abdelkhalek at hotmail.fr Tue Mar 7 10:04:10 2017 From: bakkari.abdelkhalek at hotmail.fr (Abdelkhalek Bakkari) Date: Tue, 7 Mar 2017 15:04:10 +0000 Subject: [ITK-users] Loading and reading NIFTI images In-Reply-To: References: , Message-ID: Hello Francois, Thank you for your prompt answer. I will glad if you could recommend me some ways for NIFTI image loading. Best regards, Abdelkhalek Bakkari Ph.D candidate in Computer Science Institute of Applied Computer Science Lodz University of Technology, Poland ________________________________ From: Francois Budin Sent: 07 March 2017 15:46 To: Abdelkhalek Bakkari Cc: insight-users Subject: Re: [ITK-users] Loading and reading NIFTI images Hello Abdelkhalek, Using the itkImageFileReader filter should allow you to open any format that ITK support, including NIFTI, thanks to the factory mechanism in ITK. You can find an example here [1]. Hope this helps, Francois [1] https://itk.org/ITKExamples/src/IO/ImageBase/ReadAnImage/Documentation.html Read An Image ? v4.12.0 - ITK itk.org Synopsis? This examples demonstrates how to read an image file into an itk::Image. The file type is determined by the extension of the specified filename. On Tue, Mar 7, 2017 at 9:31 AM, Abdelkhalek Bakkari > wrote: Dear Insight users, I trying to use ITK and Qt to load nifti image. Could you help me please ? Thank you in advance. Best regards, Abdelkhalek Bakkari Ph.D candidate in Computer Science Institute of Applied Computer Science Lodz University of Technology, Poland _____________________________________ Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Kitware offers ITK Training Courses, for more information visit: http://www.kitware.com/products/protraining.php Please keep messages on-topic and check the ITK FAQ at: http://www.itk.org/Wiki/ITK_FAQ Follow this link to subscribe/unsubscribe: http://public.kitware.com/mailman/listinfo/insight-users -------------- next part -------------- An HTML attachment was scrubbed... URL: From matimontg at gmail.com Tue Mar 7 20:34:58 2017 From: matimontg at gmail.com (Matias Montroull) Date: Wed, 08 Mar 2017 01:34:58 +0000 Subject: [ITK-users] SimpleITK not saving Origin when creating new images? Message-ID: Hi, I have this simple code that creates blank images and I set the origin to 256 256, however, the resulting image doesn't seem to have the Origin set to what I specify, or at least I don't see it in the image tags.. for (int i = 0; i < 160; i++) { itk.simple.Image image = new itk.simple.Image(512, 512, itk.simple.PixelIDValueEnum.sitkInt16); image.SetOrigin(new VectorDouble(new Double[] {256,256,0})); itk.simple.ImageFileWriter writer_usuario = new ImageFileWriter(); writer_usuario.SetFileName("C:/temp/" + i + ".dcm"); writer_usuario.Execute(image); } any clue? Thanks, ? -- Matias -------------- next part -------------- An HTML attachment was scrubbed... URL: From tejas.rox at gmail.com Tue Mar 7 21:24:20 2017 From: tejas.rox at gmail.com (Tejas) Date: Tue, 7 Mar 2017 19:24:20 -0700 (MST) Subject: [ITK-users] ITK 4.11 build issue In-Reply-To: References: <1487680154437-37926.post@n7.nabble.com> <1487754290631-37928.post@n7.nabble.com> Message-ID: <1488939860479-7589673.post@n2.nabble.com> I got the same errors. I applied the patch in the following link ; i.e., comment out the 'ITK_OVERRIDE' on lines 76 and 77 in itkGPUImageToImageFilter.h. I had also found errors with the graft() function in itkGPUImage.h. The same fixed worked for me; I commented out 'ITK_OVERRIDE' on line 179. -- View this message in context: http://itk-insight-users.2283740.n2.nabble.com/ITK-users-ITK-4-11-build-issue-tp7589633p7589673.html Sent from the ITK Insight Users mailing list archive at Nabble.com. From francois.budin at kitware.com Wed Mar 8 11:39:52 2017 From: francois.budin at kitware.com (Francois Budin) Date: Wed, 8 Mar 2017 11:39:52 -0500 Subject: [ITK-users] ITK 4.11 build issue In-Reply-To: <1488939860479-7589673.post@n2.nabble.com> References: <1487680154437-37926.post@n7.nabble.com> <1487754290631-37928.post@n7.nabble.com> <1488939860479-7589673.post@n2.nabble.com> Message-ID: Thanks Tejas for reporting this issue. I missed a couple extra ITK_OVERRIDE on the first patch I wrote to solve that issue. I merged more patches after to solve that problem. It should work now with the latest version of ITK (both on the master and release branches). You can give it a try by cloning the most recent version of ITK: git clone https://github.com/InsightSoftwareConsortium/ITK.git You can also try the release branch: cd ITK git checkout origin/release -b release Let me know if you have problems with either of these versions. Francois On Tue, Mar 7, 2017 at 9:24 PM, Tejas wrote: > I got the same errors. I applied the patch in the following link > ; i.e., comment out > the 'ITK_OVERRIDE' on lines 76 and 77 in itkGPUImageToImageFilter.h. > > I had also found errors with the graft() function in itkGPUImage.h. The > same > fixed worked for me; I commented out 'ITK_OVERRIDE' on line 179. > > > > -- > View this message in context: http://itk-insight-users. > 2283740.n2.nabble.com/ITK-users-ITK-4-11-build-issue- > tp7589633p7589673.html > Sent from the ITK Insight Users mailing list archive at Nabble.com. > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > -------------- next part -------------- An HTML attachment was scrubbed... URL: From tejas.rox at gmail.com Wed Mar 8 13:21:22 2017 From: tejas.rox at gmail.com (Tejas Sudharshan Mathai) Date: Wed, 8 Mar 2017 13:21:22 -0500 Subject: [ITK-users] ITK 4.11 build issue In-Reply-To: References: <1487680154437-37926.post@n7.nabble.com> <1487754290631-37928.post@n7.nabble.com> <1488939860479-7589673.post@n2.nabble.com> Message-ID: I checked out the latest version, and compiled it successfully. I'll keep you posted if I find any other errors. Thanks, Tejas On Wed, Mar 8, 2017 at 11:39 AM, Francois Budin wrote: > Thanks Tejas for reporting this issue. I missed a couple extra > ITK_OVERRIDE on the first patch I wrote to solve that issue. I merged more > patches after to solve that problem. It should work now with the latest > version of ITK (both on the master and release branches). > > You can give it a try by cloning the most recent version of ITK: > git clone https://github.com/InsightSoftwareConsortium/ITK.git > > You can also try the release branch: > cd ITK > git checkout origin/release -b release > > Let me know if you have problems with either of these versions. > Francois > > On Tue, Mar 7, 2017 at 9:24 PM, Tejas wrote: > >> I got the same errors. I applied the patch in the following link >> ; i.e., comment >> out >> the 'ITK_OVERRIDE' on lines 76 and 77 in itkGPUImageToImageFilter.h. >> >> I had also found errors with the graft() function in itkGPUImage.h. The >> same >> fixed worked for me; I commented out 'ITK_OVERRIDE' on line 179. >> >> >> >> -- >> View this message in context: http://itk-insight-users.22837 >> 40.n2.nabble.com/ITK-users-ITK-4-11-build-issue-tp7589633p7589673.html >> Sent from the ITK Insight Users mailing list archive at Nabble.com. >> _____________________________________ >> Powered by www.kitware.com >> >> Visit other Kitware open-source projects at >> http://www.kitware.com/opensource/opensource.html >> >> Kitware offers ITK Training Courses, for more information visit: >> http://www.kitware.com/products/protraining.php >> >> Please keep messages on-topic and check the ITK FAQ at: >> http://www.itk.org/Wiki/ITK_FAQ >> >> Follow this link to subscribe/unsubscribe: >> http://public.kitware.com/mailman/listinfo/insight-users >> > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From francois.budin at kitware.com Wed Mar 8 13:46:30 2017 From: francois.budin at kitware.com (Francois Budin) Date: Wed, 8 Mar 2017 13:46:30 -0500 Subject: [ITK-users] ITK 4.11 build issue In-Reply-To: References: <1487680154437-37926.post@n7.nabble.com> <1487754290631-37928.post@n7.nabble.com> <1488939860479-7589673.post@n2.nabble.com> Message-ID: Thank you for your help. Francois On Wed, Mar 8, 2017 at 1:21 PM, Tejas Sudharshan Mathai wrote: > I checked out the latest version, and compiled it successfully. I'll keep > you posted if I find any other errors. > > Thanks, > Tejas > > On Wed, Mar 8, 2017 at 11:39 AM, Francois Budin < > francois.budin at kitware.com> wrote: > >> Thanks Tejas for reporting this issue. I missed a couple extra >> ITK_OVERRIDE on the first patch I wrote to solve that issue. I merged more >> patches after to solve that problem. It should work now with the latest >> version of ITK (both on the master and release branches). >> >> You can give it a try by cloning the most recent version of ITK: >> git clone https://github.com/InsightSoftwareConsortium/ITK.git >> >> You can also try the release branch: >> cd ITK >> git checkout origin/release -b release >> >> Let me know if you have problems with either of these versions. >> Francois >> >> On Tue, Mar 7, 2017 at 9:24 PM, Tejas wrote: >> >>> I got the same errors. I applied the patch in the following link >>> ; i.e., comment >>> out >>> the 'ITK_OVERRIDE' on lines 76 and 77 in itkGPUImageToImageFilter.h. >>> >>> I had also found errors with the graft() function in itkGPUImage.h. The >>> same >>> fixed worked for me; I commented out 'ITK_OVERRIDE' on line 179. >>> >>> >>> >>> -- >>> View this message in context: http://itk-insight-users.22837 >>> 40.n2.nabble.com/ITK-users-ITK-4-11-build-issue-tp7589633p7589673.html >>> Sent from the ITK Insight Users mailing list archive at Nabble.com. >>> _____________________________________ >>> Powered by www.kitware.com >>> >>> Visit other Kitware open-source projects at >>> http://www.kitware.com/opensource/opensource.html >>> >>> Kitware offers ITK Training Courses, for more information visit: >>> http://www.kitware.com/products/protraining.php >>> >>> Please keep messages on-topic and check the ITK FAQ at: >>> http://www.itk.org/Wiki/ITK_FAQ >>> >>> Follow this link to subscribe/unsubscribe: >>> http://public.kitware.com/mailman/listinfo/insight-users >>> >> >> > -------------- next part -------------- An HTML attachment was scrubbed... URL: From francois.budin at kitware.com Wed Mar 8 14:27:08 2017 From: francois.budin at kitware.com (Francois Budin) Date: Wed, 8 Mar 2017 14:27:08 -0500 Subject: [ITK-users] SimpleITK not saving Origin when creating new images? In-Reply-To: References: Message-ID: Hello Matias, There are currently some limitations with what ITK can write in DICOM images. If you do not need to save a DICOM, you could save your image in a different format such at Nifti (.nii.gz), Meta (.mha), or NRRD (.nrrd), and the new origin will be saved. Hope this helps, Francois On Tue, Mar 7, 2017 at 8:34 PM, Matias Montroull wrote: > Hi, > > I have this simple code that creates blank images and I set the origin to > 256 256, however, the resulting image doesn't seem to have the Origin set > to what I specify, or at least I don't see it in the image tags.. > > for (int i = 0; i < 160; i++) > { > itk.simple.Image image = new itk.simple.Image(512, 512, > itk.simple.PixelIDValueEnum.sitkInt16); > image.SetOrigin(new VectorDouble(new Double[] > {256,256,0})); > > itk.simple.ImageFileWriter writer_usuario = new > ImageFileWriter(); > writer_usuario.SetFileName("C:/temp/" + i + ".dcm"); > writer_usuario.Execute(image); > } > > any clue? > > Thanks, > ? > -- > Matias > > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From scapegoat.sarthak at gmail.com Wed Mar 8 15:11:59 2017 From: scapegoat.sarthak at gmail.com (Sarthak P) Date: Wed, 8 Mar 2017 15:11:59 -0500 Subject: [ITK-users] Writing a DICOM file while preserving input image properties Message-ID: Hello All, I am trying to write a DICOM image but I want to preserve the properties from the input image (origin, direction, spacing, etc.). The ITK examples do not show how to do this properly and anything I have done with the dicom tags hasn't worked. Any help would be much appreciated. Here is what I have so far: ////////// const std::string dataDir = argv[1]; const std::string inputFile = dataDir + "/inputImage.nii.gz"; const std::string outputDir = dataDir + "/test/"; using ImageTypeToRead = itk::Image< float, 3 >; using ImageTypeToWrite = itk::Image< short, 3 >; auto inputImage = cbica::ReadImageWithOrientFix< itk::Image< float, 3 > >(inputFile); auto imageToWrite = inputImage; auto dicomIO = itk::GDCMImageIO::New(); auto seriesWriter = itk::ImageSeriesWriter< ImageTypeToWrite, itk::Image >::New(); auto namesGenerator = itk::NumericSeriesFileNames::New(); auto start = imageToWrite->GetLargestPossibleRegion().GetIndex(); auto size = imageToWrite->GetLargestPossibleRegion().GetSize(); namesGenerator->SetSeriesFormat((outputDir + "/image%03d.dcm").c_str()); namesGenerator->SetStartIndex(start[2]); namesGenerator->SetEndIndex(start[2] + size[2] - 1); namesGenerator->SetIncrementIndex(1); auto castFilter = itk::CastImageFilter::New(); castFilter->SetInput(imageToWrite); castFilter->Update(); seriesWriter->SetInput(castFilter->GetOutput()); seriesWriter->SetImageIO(dicomIO); seriesWriter->SetFileNames(namesGenerator->GetFileNames()); typename itk::ImageSeriesReader< ImageTypeToRead >::DictionaryArrayType outputArray; // this doesn't work at all - was kind of hoping it would do the heavy lifting for me //dicomIO->SetOrigin(0, imageToWrite->GetOrigin()[0]); //dicomIO->SetOrigin(1, imageToWrite->GetOrigin()[1]); //dicomIO->SetOrigin(2, imageToWrite->GetOrigin()[2]); //dicomIO->SetSpacing(0, imageToWrite->GetSpacing()[0]); //dicomIO->SetSpacing(1, imageToWrite->GetSpacing()[1]); //dicomIO->SetSpacing(2, imageToWrite->GetSpacing()[2]); //dicomIO->SetDimensions(0, imageToWrite->GetLargestPossibleRegion().GetSize()[0]); //dicomIO->SetDimensions(1, imageToWrite->GetLargestPossibleRegion().GetSize()[1]); //dicomIO->SetDimensions(2, imageToWrite->GetLargestPossibleRegion().GetSize()[2]); // this doesn't work at all for (size_t i = 0; i < imageToWrite->GetLargestPossibleRegion().GetSize()[2]; i++) { auto dict = new itk::ImageSeriesReader< ImageTypeToRead >::DictionaryType; typename ImageTypeToWrite::PointType position; typename ImageTypeToWrite::IndexType index; index[0] = 0; index[1] = 0; index[2] = i; imageToWrite->TransformIndexToPhysicalPoint(index, position); // tags extracted from dicom lookup http://dicomlookup.com/lookup.asp itk::EncapsulateMetaData(*dict, "0020|0032", std::to_string(position[0]) + "\\" + std::to_string(position[1]) + "\\" + std::to_string(position[2])); // patient position itk::EncapsulateMetaData(*dict, "0018|5100", std::to_string(position[0]) + "\\" + std::to_string(position[1]) + "\\" + std::to_string(position[2])); itk::EncapsulateMetaData(*dict, "2020|0010", std::to_string(position[0]) + "\\" + std::to_string(position[1]) + "\\" + std::to_string(position[2])); itk::EncapsulateMetaData(*dict, "0018|5101", std::to_string(position[0]) + "\\" + std::to_string(position[1]) + "\\" + std::to_string(position[2])); itk::EncapsulateMetaData(*dict, "0018|0050", std::to_string(imageToWrite->GetSpacing()[2])); // Slice Thickness itk::EncapsulateMetaData(*dict, "0018|0088", std::to_string(imageToWrite->GetSpacing()[2])); // Spacing Between Slices itk::EncapsulateMetaData(*dict, "0008|0008", "DERIVED\\SECONDARY"); // Image Type itk::EncapsulateMetaData(*dict, "0008|0064", "DV"); // Conversion Type outputArray.push_back(dict); } seriesWriter->SetMetaDataDictionaryArray(&outputArray); // no dictionary information present without seriesReader try { seriesWriter->Write(); } catch (itk::ExceptionObject &e) { std::cerr << "Error occurred while trying to write the image '" << outputDir << "': " << e.what() << "\n"; exit(EXIT_FAILURE); } ////////// Thanks a ton, Sarthak -------------- next part -------------- An HTML attachment was scrubbed... URL: From matimontg at gmail.com Wed Mar 8 18:13:26 2017 From: matimontg at gmail.com (Matias Montroull) Date: Wed, 08 Mar 2017 23:13:26 +0000 Subject: [ITK-users] SimpleITK not saving Origin when creating new images? In-Reply-To: References: Message-ID: Thank you, I will try the mha format. I need the individual dcm though. I'm not sure if SimpleITK has a method to extract the dcm files from the mha and keep the origin of each file once I save it? El mi?., 8 de mar. de 2017 a la(s) 16:27, Francois Budin < francois.budin at kitware.com> escribi?: > Hello Matias, > > There are currently some limitations with what ITK can write in DICOM > images. If you do not need to save a DICOM, you could save your image in a > different format such at Nifti (.nii.gz), Meta (.mha), or NRRD (.nrrd), and > the new origin will be saved. > > Hope this helps, > Francois > > On Tue, Mar 7, 2017 at 8:34 PM, Matias Montroull > wrote: > > Hi, > > I have this simple code that creates blank images and I set the origin to > 256 256, however, the resulting image doesn't seem to have the Origin set > to what I specify, or at least I don't see it in the image tags.. > > for (int i = 0; i < 160; i++) > { > itk.simple.Image image = new itk.simple.Image(512, 512, > itk.simple.PixelIDValueEnum.sitkInt16); > image.SetOrigin(new VectorDouble(new Double[] > {256,256,0})); > > itk.simple.ImageFileWriter writer_usuario = new > ImageFileWriter(); > writer_usuario.SetFileName("C:/temp/" + i + ".dcm"); > writer_usuario.Execute(image); > } > > any clue? > > Thanks, > ? > -- > Matias > > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > > > -- Matias -------------- next part -------------- An HTML attachment was scrubbed... URL: From matt.mccormick at kitware.com Thu Mar 9 09:20:49 2017 From: matt.mccormick at kitware.com (Matt McCormick) Date: Thu, 9 Mar 2017 09:20:49 -0500 Subject: [ITK-users] Writing a DICOM file while preserving input image properties In-Reply-To: References: Message-ID: Hi Sarthak, DICOM export requires improved typing to produce a valid set of tags. This work has been started here: https://github.com/KitwareMedical/ITKDICOM but the implementation is in initial stages. I would be happy to provide guidance if you would like to move it forward. Thanks, Matt On Wed, Mar 8, 2017 at 3:11 PM, Sarthak P wrote: > Hello All, > > I am trying to write a DICOM image but I want to preserve the properties > from the input image (origin, direction, spacing, etc.). The ITK examples do > not show how to do this properly and anything I have done with the dicom > tags hasn't worked. Any help would be much appreciated. > > Here is what I have so far: > > ////////// > const std::string dataDir = argv[1]; > const std::string inputFile = dataDir + "/inputImage.nii.gz"; > const std::string outputDir = dataDir + "/test/"; > > using ImageTypeToRead = itk::Image< float, 3 >; > using ImageTypeToWrite = itk::Image< short, 3 >; > auto inputImage = cbica::ReadImageWithOrientFix< itk::Image< float, 3 > >>(inputFile); > auto imageToWrite = inputImage; > > auto dicomIO = itk::GDCMImageIO::New(); > > auto seriesWriter = itk::ImageSeriesWriter< ImageTypeToWrite, > itk::Image >::New(); > > auto namesGenerator = itk::NumericSeriesFileNames::New(); > auto start = imageToWrite->GetLargestPossibleRegion().GetIndex(); > auto size = imageToWrite->GetLargestPossibleRegion().GetSize(); > namesGenerator->SetSeriesFormat((outputDir + "/image%03d.dcm").c_str()); > namesGenerator->SetStartIndex(start[2]); > namesGenerator->SetEndIndex(start[2] + size[2] - 1); > namesGenerator->SetIncrementIndex(1); > > auto castFilter = itk::CastImageFilter ImageTypeToWrite>::New(); > castFilter->SetInput(imageToWrite); > castFilter->Update(); > > seriesWriter->SetInput(castFilter->GetOutput()); > seriesWriter->SetImageIO(dicomIO); > seriesWriter->SetFileNames(namesGenerator->GetFileNames()); > > typename itk::ImageSeriesReader< ImageTypeToRead >::DictionaryArrayType > outputArray; > > // this doesn't work at all - was kind of hoping it would do the heavy > lifting for me > //dicomIO->SetOrigin(0, imageToWrite->GetOrigin()[0]); > //dicomIO->SetOrigin(1, imageToWrite->GetOrigin()[1]); > //dicomIO->SetOrigin(2, imageToWrite->GetOrigin()[2]); > //dicomIO->SetSpacing(0, imageToWrite->GetSpacing()[0]); > //dicomIO->SetSpacing(1, imageToWrite->GetSpacing()[1]); > //dicomIO->SetSpacing(2, imageToWrite->GetSpacing()[2]); > //dicomIO->SetDimensions(0, > imageToWrite->GetLargestPossibleRegion().GetSize()[0]); > //dicomIO->SetDimensions(1, > imageToWrite->GetLargestPossibleRegion().GetSize()[1]); > //dicomIO->SetDimensions(2, > imageToWrite->GetLargestPossibleRegion().GetSize()[2]); > // this doesn't work at all > > for (size_t i = 0; i < > imageToWrite->GetLargestPossibleRegion().GetSize()[2]; i++) > { > auto dict = new itk::ImageSeriesReader< ImageTypeToRead >>::DictionaryType; > typename ImageTypeToWrite::PointType position; > typename ImageTypeToWrite::IndexType index; > index[0] = 0; > index[1] = 0; > index[2] = i; > imageToWrite->TransformIndexToPhysicalPoint(index, position); > // tags extracted from dicom lookup http://dicomlookup.com/lookup.asp > itk::EncapsulateMetaData(*dict, "0020|0032", > std::to_string(position[0]) + "\\" + std::to_string(position[1]) + "\\" + > std::to_string(position[2])); // patient position > itk::EncapsulateMetaData(*dict, "0018|5100", > std::to_string(position[0]) + "\\" + std::to_string(position[1]) + "\\" + > std::to_string(position[2])); > itk::EncapsulateMetaData(*dict, "2020|0010", > std::to_string(position[0]) + "\\" + std::to_string(position[1]) + "\\" + > std::to_string(position[2])); > itk::EncapsulateMetaData(*dict, "0018|5101", > std::to_string(position[0]) + "\\" + std::to_string(position[1]) + "\\" + > std::to_string(position[2])); > itk::EncapsulateMetaData(*dict, "0018|0050", > std::to_string(imageToWrite->GetSpacing()[2])); // Slice Thickness > itk::EncapsulateMetaData(*dict, "0018|0088", > std::to_string(imageToWrite->GetSpacing()[2])); // Spacing Between Slices > itk::EncapsulateMetaData(*dict, "0008|0008", > "DERIVED\\SECONDARY"); // Image Type > itk::EncapsulateMetaData(*dict, "0008|0064", "DV"); // > Conversion Type > > outputArray.push_back(dict); > } > > seriesWriter->SetMetaDataDictionaryArray(&outputArray); // no dictionary > information present without seriesReader > > try > { > seriesWriter->Write(); > } > catch (itk::ExceptionObject &e) > { > std::cerr << "Error occurred while trying to write the image '" << > outputDir << "': " << e.what() << "\n"; > exit(EXIT_FAILURE); > } > > ////////// > > Thanks a ton, > Sarthak > > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > From scapegoat.sarthak at gmail.com Thu Mar 9 09:30:52 2017 From: scapegoat.sarthak at gmail.com (Sarthak P) Date: Thu, 9 Mar 2017 09:30:52 -0500 Subject: [ITK-users] Writing a DICOM file while preserving input image properties In-Reply-To: References: Message-ID: Hi Matt, Thanks for the response. I don't think I am having issues with writing into the tags since I am able to read the correct information I am writing (for instance, the tag "0020|0032" is always populated with the physical coordinate of the specific slice in a correct manner both during writing and reading). In an example, the slice thickness should be "2" and the separation between the dicom slices is "2", which is correct. But when ITK is reading this collection, it keeps the slice thickness at "1". I am seeing the same behavior in other applications as well (ITK-SNAP, etc.). Could there be some tag I am missing to write? Since my last post, I tried writing only to the tag "0020|0032"; the output dictionary array gets populated properly but the file is still not written as expected. I am using ITK 4.11, BTW. Best, Sarthak On Thu, Mar 9, 2017 at 9:20 AM, Matt McCormick wrote: > Hi Sarthak, > > DICOM export requires improved typing to produce a valid set of tags. > This work has been started here: > > https://github.com/KitwareMedical/ITKDICOM > > but the implementation is in initial stages. I would be happy to > provide guidance if you would like to move it forward. > > Thanks, > Matt > > On Wed, Mar 8, 2017 at 3:11 PM, Sarthak P > wrote: > > Hello All, > > > > I am trying to write a DICOM image but I want to preserve the properties > > from the input image (origin, direction, spacing, etc.). The ITK > examples do > > not show how to do this properly and anything I have done with the dicom > > tags hasn't worked. Any help would be much appreciated. > > > > Here is what I have so far: > > > > ////////// > > const std::string dataDir = argv[1]; > > const std::string inputFile = dataDir + "/inputImage.nii.gz"; > > const std::string outputDir = dataDir + "/test/"; > > > > using ImageTypeToRead = itk::Image< float, 3 >; > > using ImageTypeToWrite = itk::Image< short, 3 >; > > auto inputImage = cbica::ReadImageWithOrientFix< itk::Image< float, 3 > > >>(inputFile); > > auto imageToWrite = inputImage; > > > > auto dicomIO = itk::GDCMImageIO::New(); > > > > auto seriesWriter = itk::ImageSeriesWriter< ImageTypeToWrite, > > itk::Image >::New(); > > > > auto namesGenerator = itk::NumericSeriesFileNames::New(); > > auto start = imageToWrite->GetLargestPossibleRegion().GetIndex(); > > auto size = imageToWrite->GetLargestPossibleRegion().GetSize(); > > namesGenerator->SetSeriesFormat((outputDir + > "/image%03d.dcm").c_str()); > > namesGenerator->SetStartIndex(start[2]); > > namesGenerator->SetEndIndex(start[2] + size[2] - 1); > > namesGenerator->SetIncrementIndex(1); > > > > auto castFilter = itk::CastImageFilter > ImageTypeToWrite>::New(); > > castFilter->SetInput(imageToWrite); > > castFilter->Update(); > > > > seriesWriter->SetInput(castFilter->GetOutput()); > > seriesWriter->SetImageIO(dicomIO); > > seriesWriter->SetFileNames(namesGenerator->GetFileNames()); > > > > typename itk::ImageSeriesReader< ImageTypeToRead >::DictionaryArrayType > > outputArray; > > > > // this doesn't work at all - was kind of hoping it would do the heavy > > lifting for me > > //dicomIO->SetOrigin(0, imageToWrite->GetOrigin()[0]); > > //dicomIO->SetOrigin(1, imageToWrite->GetOrigin()[1]); > > //dicomIO->SetOrigin(2, imageToWrite->GetOrigin()[2]); > > //dicomIO->SetSpacing(0, imageToWrite->GetSpacing()[0]); > > //dicomIO->SetSpacing(1, imageToWrite->GetSpacing()[1]); > > //dicomIO->SetSpacing(2, imageToWrite->GetSpacing()[2]); > > //dicomIO->SetDimensions(0, > > imageToWrite->GetLargestPossibleRegion().GetSize()[0]); > > //dicomIO->SetDimensions(1, > > imageToWrite->GetLargestPossibleRegion().GetSize()[1]); > > //dicomIO->SetDimensions(2, > > imageToWrite->GetLargestPossibleRegion().GetSize()[2]); > > // this doesn't work at all > > > > for (size_t i = 0; i < > > imageToWrite->GetLargestPossibleRegion().GetSize()[2]; i++) > > { > > auto dict = new itk::ImageSeriesReader< ImageTypeToRead > >>::DictionaryType; > > typename ImageTypeToWrite::PointType position; > > typename ImageTypeToWrite::IndexType index; > > index[0] = 0; > > index[1] = 0; > > index[2] = i; > > imageToWrite->TransformIndexToPhysicalPoint(index, position); > > // tags extracted from dicom lookup http://dicomlookup.com/lookup. > asp > > itk::EncapsulateMetaData(*dict, "0020|0032", > > std::to_string(position[0]) + "\\" + std::to_string(position[1]) + "\\" + > > std::to_string(position[2])); // patient position > > itk::EncapsulateMetaData(*dict, "0018|5100", > > std::to_string(position[0]) + "\\" + std::to_string(position[1]) + "\\" + > > std::to_string(position[2])); > > itk::EncapsulateMetaData(*dict, "2020|0010", > > std::to_string(position[0]) + "\\" + std::to_string(position[1]) + "\\" + > > std::to_string(position[2])); > > itk::EncapsulateMetaData(*dict, "0018|5101", > > std::to_string(position[0]) + "\\" + std::to_string(position[1]) + "\\" + > > std::to_string(position[2])); > > itk::EncapsulateMetaData(*dict, "0018|0050", > > std::to_string(imageToWrite->GetSpacing()[2])); // Slice Thickness > > itk::EncapsulateMetaData(*dict, "0018|0088", > > std::to_string(imageToWrite->GetSpacing()[2])); // Spacing Between > Slices > > itk::EncapsulateMetaData(*dict, "0008|0008", > > "DERIVED\\SECONDARY"); // Image Type > > itk::EncapsulateMetaData(*dict, "0008|0064", "DV"); // > > Conversion Type > > > > outputArray.push_back(dict); > > } > > > > seriesWriter->SetMetaDataDictionaryArray(&outputArray); // no > dictionary > > information present without seriesReader > > > > try > > { > > seriesWriter->Write(); > > } > > catch (itk::ExceptionObject &e) > > { > > std::cerr << "Error occurred while trying to write the image '" << > > outputDir << "': " << e.what() << "\n"; > > exit(EXIT_FAILURE); > > } > > > > ////////// > > > > Thanks a ton, > > Sarthak > > > > _____________________________________ > > Powered by www.kitware.com > > > > Visit other Kitware open-source projects at > > http://www.kitware.com/opensource/opensource.html > > > > Kitware offers ITK Training Courses, for more information visit: > > http://www.kitware.com/products/protraining.php > > > > Please keep messages on-topic and check the ITK FAQ at: > > http://www.itk.org/Wiki/ITK_FAQ > > > > Follow this link to subscribe/unsubscribe: > > http://public.kitware.com/mailman/listinfo/insight-users > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From matt.mccormick at kitware.com Thu Mar 9 09:47:03 2017 From: matt.mccormick at kitware.com (Matt McCormick) Date: Thu, 9 Mar 2017 09:47:03 -0500 Subject: [ITK-users] Writing a DICOM file while preserving input image properties In-Reply-To: References: Message-ID: HI Sarthak, The slice thickness is different from the spacing between slices. In DICOM, slice thickness is related to the point spread function of the imaging system and slice spacing is related to digital sampling. Hope this helps, Matt On Thu, Mar 9, 2017 at 9:30 AM, Sarthak P wrote: > Hi Matt, > > Thanks for the response. > > I don't think I am having issues with writing into the tags since I am able > to read the correct information I am writing (for instance, the tag > "0020|0032" is always populated with the physical coordinate of the specific > slice in a correct manner both during writing and reading). In an example, > the slice thickness should be "2" and the separation between the dicom > slices is "2", which is correct. But when ITK is reading this collection, it > keeps the slice thickness at "1". I am seeing the same behavior in other > applications as well (ITK-SNAP, etc.). > > Could there be some tag I am missing to write? Since my last post, I tried > writing only to the tag "0020|0032"; the output dictionary array gets > populated properly but the file is still not written as expected. I am using > ITK 4.11, BTW. > > Best, > Sarthak > > On Thu, Mar 9, 2017 at 9:20 AM, Matt McCormick > wrote: >> >> Hi Sarthak, >> >> DICOM export requires improved typing to produce a valid set of tags. >> This work has been started here: >> >> https://github.com/KitwareMedical/ITKDICOM >> >> but the implementation is in initial stages. I would be happy to >> provide guidance if you would like to move it forward. >> >> Thanks, >> Matt >> >> On Wed, Mar 8, 2017 at 3:11 PM, Sarthak P >> wrote: >> > Hello All, >> > >> > I am trying to write a DICOM image but I want to preserve the properties >> > from the input image (origin, direction, spacing, etc.). The ITK >> > examples do >> > not show how to do this properly and anything I have done with the dicom >> > tags hasn't worked. Any help would be much appreciated. >> > >> > Here is what I have so far: >> > >> > ////////// >> > const std::string dataDir = argv[1]; >> > const std::string inputFile = dataDir + "/inputImage.nii.gz"; >> > const std::string outputDir = dataDir + "/test/"; >> > >> > using ImageTypeToRead = itk::Image< float, 3 >; >> > using ImageTypeToWrite = itk::Image< short, 3 >; >> > auto inputImage = cbica::ReadImageWithOrientFix< itk::Image< float, 3 >> > > >> >>(inputFile); >> > auto imageToWrite = inputImage; >> > >> > auto dicomIO = itk::GDCMImageIO::New(); >> > >> > auto seriesWriter = itk::ImageSeriesWriter< ImageTypeToWrite, >> > itk::Image >::New(); >> > >> > auto namesGenerator = itk::NumericSeriesFileNames::New(); >> > auto start = imageToWrite->GetLargestPossibleRegion().GetIndex(); >> > auto size = imageToWrite->GetLargestPossibleRegion().GetSize(); >> > namesGenerator->SetSeriesFormat((outputDir + >> > "/image%03d.dcm").c_str()); >> > namesGenerator->SetStartIndex(start[2]); >> > namesGenerator->SetEndIndex(start[2] + size[2] - 1); >> > namesGenerator->SetIncrementIndex(1); >> > >> > auto castFilter = itk::CastImageFilter> > ImageTypeToWrite>::New(); >> > castFilter->SetInput(imageToWrite); >> > castFilter->Update(); >> > >> > seriesWriter->SetInput(castFilter->GetOutput()); >> > seriesWriter->SetImageIO(dicomIO); >> > seriesWriter->SetFileNames(namesGenerator->GetFileNames()); >> > >> > typename itk::ImageSeriesReader< ImageTypeToRead >> > >::DictionaryArrayType >> > outputArray; >> > >> > // this doesn't work at all - was kind of hoping it would do the heavy >> > lifting for me >> > //dicomIO->SetOrigin(0, imageToWrite->GetOrigin()[0]); >> > //dicomIO->SetOrigin(1, imageToWrite->GetOrigin()[1]); >> > //dicomIO->SetOrigin(2, imageToWrite->GetOrigin()[2]); >> > //dicomIO->SetSpacing(0, imageToWrite->GetSpacing()[0]); >> > //dicomIO->SetSpacing(1, imageToWrite->GetSpacing()[1]); >> > //dicomIO->SetSpacing(2, imageToWrite->GetSpacing()[2]); >> > //dicomIO->SetDimensions(0, >> > imageToWrite->GetLargestPossibleRegion().GetSize()[0]); >> > //dicomIO->SetDimensions(1, >> > imageToWrite->GetLargestPossibleRegion().GetSize()[1]); >> > //dicomIO->SetDimensions(2, >> > imageToWrite->GetLargestPossibleRegion().GetSize()[2]); >> > // this doesn't work at all >> > >> > for (size_t i = 0; i < >> > imageToWrite->GetLargestPossibleRegion().GetSize()[2]; i++) >> > { >> > auto dict = new itk::ImageSeriesReader< ImageTypeToRead >> >>::DictionaryType; >> > typename ImageTypeToWrite::PointType position; >> > typename ImageTypeToWrite::IndexType index; >> > index[0] = 0; >> > index[1] = 0; >> > index[2] = i; >> > imageToWrite->TransformIndexToPhysicalPoint(index, position); >> > // tags extracted from dicom lookup >> > http://dicomlookup.com/lookup.asp >> > itk::EncapsulateMetaData(*dict, "0020|0032", >> > std::to_string(position[0]) + "\\" + std::to_string(position[1]) + "\\" >> > + >> > std::to_string(position[2])); // patient position >> > itk::EncapsulateMetaData(*dict, "0018|5100", >> > std::to_string(position[0]) + "\\" + std::to_string(position[1]) + "\\" >> > + >> > std::to_string(position[2])); >> > itk::EncapsulateMetaData(*dict, "2020|0010", >> > std::to_string(position[0]) + "\\" + std::to_string(position[1]) + "\\" >> > + >> > std::to_string(position[2])); >> > itk::EncapsulateMetaData(*dict, "0018|5101", >> > std::to_string(position[0]) + "\\" + std::to_string(position[1]) + "\\" >> > + >> > std::to_string(position[2])); >> > itk::EncapsulateMetaData(*dict, "0018|0050", >> > std::to_string(imageToWrite->GetSpacing()[2])); // Slice Thickness >> > itk::EncapsulateMetaData(*dict, "0018|0088", >> > std::to_string(imageToWrite->GetSpacing()[2])); // Spacing Between >> > Slices >> > itk::EncapsulateMetaData(*dict, "0008|0008", >> > "DERIVED\\SECONDARY"); // Image Type >> > itk::EncapsulateMetaData(*dict, "0008|0064", "DV"); // >> > Conversion Type >> > >> > outputArray.push_back(dict); >> > } >> > >> > seriesWriter->SetMetaDataDictionaryArray(&outputArray); // no >> > dictionary >> > information present without seriesReader >> > >> > try >> > { >> > seriesWriter->Write(); >> > } >> > catch (itk::ExceptionObject &e) >> > { >> > std::cerr << "Error occurred while trying to write the image '" << >> > outputDir << "': " << e.what() << "\n"; >> > exit(EXIT_FAILURE); >> > } >> > >> > ////////// >> > >> > Thanks a ton, >> > Sarthak >> > >> > _____________________________________ >> > Powered by www.kitware.com >> > >> > Visit other Kitware open-source projects at >> > http://www.kitware.com/opensource/opensource.html >> > >> > Kitware offers ITK Training Courses, for more information visit: >> > http://www.kitware.com/products/protraining.php >> > >> > Please keep messages on-topic and check the ITK FAQ at: >> > http://www.itk.org/Wiki/ITK_FAQ >> > >> > Follow this link to subscribe/unsubscribe: >> > http://public.kitware.com/mailman/listinfo/insight-users >> > > > From scapegoat.sarthak at gmail.com Thu Mar 9 10:25:09 2017 From: scapegoat.sarthak at gmail.com (Sarthak P) Date: Thu, 9 Mar 2017 10:25:09 -0500 Subject: [ITK-users] Writing a DICOM file while preserving input image properties In-Reply-To: References: Message-ID: Hi Matt, Yes I do know that. I have tried to put the spacing information from the itk::Image using various combinations with the tags 0018|0088 (slice thickness) and 0018|0050 (spacing between slices) but to no avail. Thanks for your help, Sarthak On Thu, Mar 9, 2017 at 9:47 AM, Matt McCormick wrote: > HI Sarthak, > > The slice thickness is different from the spacing between slices. In > DICOM, slice thickness is related to the point spread function of the > imaging system and slice spacing is related to digital sampling. > > Hope this helps, > Matt > > On Thu, Mar 9, 2017 at 9:30 AM, Sarthak P > wrote: > > Hi Matt, > > > > Thanks for the response. > > > > I don't think I am having issues with writing into the tags since I am > able > > to read the correct information I am writing (for instance, the tag > > "0020|0032" is always populated with the physical coordinate of the > specific > > slice in a correct manner both during writing and reading). In an > example, > > the slice thickness should be "2" and the separation between the dicom > > slices is "2", which is correct. But when ITK is reading this > collection, it > > keeps the slice thickness at "1". I am seeing the same behavior in other > > applications as well (ITK-SNAP, etc.). > > > > Could there be some tag I am missing to write? Since my last post, I > tried > > writing only to the tag "0020|0032"; the output dictionary array gets > > populated properly but the file is still not written as expected. I am > using > > ITK 4.11, BTW. > > > > Best, > > Sarthak > > > > On Thu, Mar 9, 2017 at 9:20 AM, Matt McCormick < > matt.mccormick at kitware.com> > > wrote: > >> > >> Hi Sarthak, > >> > >> DICOM export requires improved typing to produce a valid set of tags. > >> This work has been started here: > >> > >> https://github.com/KitwareMedical/ITKDICOM > >> > >> but the implementation is in initial stages. I would be happy to > >> provide guidance if you would like to move it forward. > >> > >> Thanks, > >> Matt > >> > >> On Wed, Mar 8, 2017 at 3:11 PM, Sarthak P > >> wrote: > >> > Hello All, > >> > > >> > I am trying to write a DICOM image but I want to preserve the > properties > >> > from the input image (origin, direction, spacing, etc.). The ITK > >> > examples do > >> > not show how to do this properly and anything I have done with the > dicom > >> > tags hasn't worked. Any help would be much appreciated. > >> > > >> > Here is what I have so far: > >> > > >> > ////////// > >> > const std::string dataDir = argv[1]; > >> > const std::string inputFile = dataDir + "/inputImage.nii.gz"; > >> > const std::string outputDir = dataDir + "/test/"; > >> > > >> > using ImageTypeToRead = itk::Image< float, 3 >; > >> > using ImageTypeToWrite = itk::Image< short, 3 >; > >> > auto inputImage = cbica::ReadImageWithOrientFix< itk::Image< float, > 3 > >> > > > >> >>(inputFile); > >> > auto imageToWrite = inputImage; > >> > > >> > auto dicomIO = itk::GDCMImageIO::New(); > >> > > >> > auto seriesWriter = itk::ImageSeriesWriter< ImageTypeToWrite, > >> > itk::Image >::New(); > >> > > >> > auto namesGenerator = itk::NumericSeriesFileNames::New(); > >> > auto start = imageToWrite->GetLargestPossibleRegion().GetIndex(); > >> > auto size = imageToWrite->GetLargestPossibleRegion().GetSize(); > >> > namesGenerator->SetSeriesFormat((outputDir + > >> > "/image%03d.dcm").c_str()); > >> > namesGenerator->SetStartIndex(start[2]); > >> > namesGenerator->SetEndIndex(start[2] + size[2] - 1); > >> > namesGenerator->SetIncrementIndex(1); > >> > > >> > auto castFilter = itk::CastImageFilter >> > ImageTypeToWrite>::New(); > >> > castFilter->SetInput(imageToWrite); > >> > castFilter->Update(); > >> > > >> > seriesWriter->SetInput(castFilter->GetOutput()); > >> > seriesWriter->SetImageIO(dicomIO); > >> > seriesWriter->SetFileNames(namesGenerator->GetFileNames()); > >> > > >> > typename itk::ImageSeriesReader< ImageTypeToRead > >> > >::DictionaryArrayType > >> > outputArray; > >> > > >> > // this doesn't work at all - was kind of hoping it would do the > heavy > >> > lifting for me > >> > //dicomIO->SetOrigin(0, imageToWrite->GetOrigin()[0]); > >> > //dicomIO->SetOrigin(1, imageToWrite->GetOrigin()[1]); > >> > //dicomIO->SetOrigin(2, imageToWrite->GetOrigin()[2]); > >> > //dicomIO->SetSpacing(0, imageToWrite->GetSpacing()[0]); > >> > //dicomIO->SetSpacing(1, imageToWrite->GetSpacing()[1]); > >> > //dicomIO->SetSpacing(2, imageToWrite->GetSpacing()[2]); > >> > //dicomIO->SetDimensions(0, > >> > imageToWrite->GetLargestPossibleRegion().GetSize()[0]); > >> > //dicomIO->SetDimensions(1, > >> > imageToWrite->GetLargestPossibleRegion().GetSize()[1]); > >> > //dicomIO->SetDimensions(2, > >> > imageToWrite->GetLargestPossibleRegion().GetSize()[2]); > >> > // this doesn't work at all > >> > > >> > for (size_t i = 0; i < > >> > imageToWrite->GetLargestPossibleRegion().GetSize()[2]; i++) > >> > { > >> > auto dict = new itk::ImageSeriesReader< ImageTypeToRead > >> >>::DictionaryType; > >> > typename ImageTypeToWrite::PointType position; > >> > typename ImageTypeToWrite::IndexType index; > >> > index[0] = 0; > >> > index[1] = 0; > >> > index[2] = i; > >> > imageToWrite->TransformIndexToPhysicalPoint(index, position); > >> > // tags extracted from dicom lookup > >> > http://dicomlookup.com/lookup.asp > >> > itk::EncapsulateMetaData(*dict, "0020|0032", > >> > std::to_string(position[0]) + "\\" + std::to_string(position[1]) + > "\\" > >> > + > >> > std::to_string(position[2])); // patient position > >> > itk::EncapsulateMetaData(*dict, "0018|5100", > >> > std::to_string(position[0]) + "\\" + std::to_string(position[1]) + > "\\" > >> > + > >> > std::to_string(position[2])); > >> > itk::EncapsulateMetaData(*dict, "2020|0010", > >> > std::to_string(position[0]) + "\\" + std::to_string(position[1]) + > "\\" > >> > + > >> > std::to_string(position[2])); > >> > itk::EncapsulateMetaData(*dict, "0018|5101", > >> > std::to_string(position[0]) + "\\" + std::to_string(position[1]) + > "\\" > >> > + > >> > std::to_string(position[2])); > >> > itk::EncapsulateMetaData(*dict, "0018|0050", > >> > std::to_string(imageToWrite->GetSpacing()[2])); // Slice Thickness > >> > itk::EncapsulateMetaData(*dict, "0018|0088", > >> > std::to_string(imageToWrite->GetSpacing()[2])); // Spacing Between > >> > Slices > >> > itk::EncapsulateMetaData(*dict, "0008|0008", > >> > "DERIVED\\SECONDARY"); // Image Type > >> > itk::EncapsulateMetaData(*dict, "0008|0064", "DV"); > // > >> > Conversion Type > >> > > >> > outputArray.push_back(dict); > >> > } > >> > > >> > seriesWriter->SetMetaDataDictionaryArray(&outputArray); // no > >> > dictionary > >> > information present without seriesReader > >> > > >> > try > >> > { > >> > seriesWriter->Write(); > >> > } > >> > catch (itk::ExceptionObject &e) > >> > { > >> > std::cerr << "Error occurred while trying to write the image '" << > >> > outputDir << "': " << e.what() << "\n"; > >> > exit(EXIT_FAILURE); > >> > } > >> > > >> > ////////// > >> > > >> > Thanks a ton, > >> > Sarthak > >> > > >> > _____________________________________ > >> > Powered by www.kitware.com > >> > > >> > Visit other Kitware open-source projects at > >> > http://www.kitware.com/opensource/opensource.html > >> > > >> > Kitware offers ITK Training Courses, for more information visit: > >> > http://www.kitware.com/products/protraining.php > >> > > >> > Please keep messages on-topic and check the ITK FAQ at: > >> > http://www.itk.org/Wiki/ITK_FAQ > >> > > >> > Follow this link to subscribe/unsubscribe: > >> > http://public.kitware.com/mailman/listinfo/insight-users > >> > > > > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From scapegoat.sarthak at gmail.com Thu Mar 9 10:26:47 2017 From: scapegoat.sarthak at gmail.com (Sarthak P) Date: Thu, 9 Mar 2017 10:26:47 -0500 Subject: [ITK-users] Writing a DICOM file while preserving input image properties In-Reply-To: References: Message-ID: So the thing is that even the origin isn't picked up when reading the DICOM image (it is always 0,0,0) so I am guessing I am doing something wrong when writing into the tag 0020|0032 itself. Once that is rectified, the spacing information (should) correct itself. Best, Sarthak On Thu, Mar 9, 2017 at 10:25 AM, Sarthak P wrote: > Hi Matt, > > Yes I do know that. I have tried to put the spacing information from the > itk::Image using various combinations with the tags 0018|0088 (slice > thickness) and 0018|0050 (spacing between slices) but to no avail. > > Thanks for your help, > Sarthak > > On Thu, Mar 9, 2017 at 9:47 AM, Matt McCormick > wrote: > >> HI Sarthak, >> >> The slice thickness is different from the spacing between slices. In >> DICOM, slice thickness is related to the point spread function of the >> imaging system and slice spacing is related to digital sampling. >> >> Hope this helps, >> Matt >> >> On Thu, Mar 9, 2017 at 9:30 AM, Sarthak P >> wrote: >> > Hi Matt, >> > >> > Thanks for the response. >> > >> > I don't think I am having issues with writing into the tags since I am >> able >> > to read the correct information I am writing (for instance, the tag >> > "0020|0032" is always populated with the physical coordinate of the >> specific >> > slice in a correct manner both during writing and reading). In an >> example, >> > the slice thickness should be "2" and the separation between the dicom >> > slices is "2", which is correct. But when ITK is reading this >> collection, it >> > keeps the slice thickness at "1". I am seeing the same behavior in other >> > applications as well (ITK-SNAP, etc.). >> > >> > Could there be some tag I am missing to write? Since my last post, I >> tried >> > writing only to the tag "0020|0032"; the output dictionary array gets >> > populated properly but the file is still not written as expected. I am >> using >> > ITK 4.11, BTW. >> > >> > Best, >> > Sarthak >> > >> > On Thu, Mar 9, 2017 at 9:20 AM, Matt McCormick < >> matt.mccormick at kitware.com> >> > wrote: >> >> >> >> Hi Sarthak, >> >> >> >> DICOM export requires improved typing to produce a valid set of tags. >> >> This work has been started here: >> >> >> >> https://github.com/KitwareMedical/ITKDICOM >> >> >> >> but the implementation is in initial stages. I would be happy to >> >> provide guidance if you would like to move it forward. >> >> >> >> Thanks, >> >> Matt >> >> >> >> On Wed, Mar 8, 2017 at 3:11 PM, Sarthak P > > >> >> wrote: >> >> > Hello All, >> >> > >> >> > I am trying to write a DICOM image but I want to preserve the >> properties >> >> > from the input image (origin, direction, spacing, etc.). The ITK >> >> > examples do >> >> > not show how to do this properly and anything I have done with the >> dicom >> >> > tags hasn't worked. Any help would be much appreciated. >> >> > >> >> > Here is what I have so far: >> >> > >> >> > ////////// >> >> > const std::string dataDir = argv[1]; >> >> > const std::string inputFile = dataDir + "/inputImage.nii.gz"; >> >> > const std::string outputDir = dataDir + "/test/"; >> >> > >> >> > using ImageTypeToRead = itk::Image< float, 3 >; >> >> > using ImageTypeToWrite = itk::Image< short, 3 >; >> >> > auto inputImage = cbica::ReadImageWithOrientFix< itk::Image< >> float, 3 >> >> > > >> >> >>(inputFile); >> >> > auto imageToWrite = inputImage; >> >> > >> >> > auto dicomIO = itk::GDCMImageIO::New(); >> >> > >> >> > auto seriesWriter = itk::ImageSeriesWriter< ImageTypeToWrite, >> >> > itk::Image >::New(); >> >> > >> >> > auto namesGenerator = itk::NumericSeriesFileNames::New(); >> >> > auto start = imageToWrite->GetLargestPossibleRegion().GetIndex(); >> >> > auto size = imageToWrite->GetLargestPossibleRegion().GetSize(); >> >> > namesGenerator->SetSeriesFormat((outputDir + >> >> > "/image%03d.dcm").c_str()); >> >> > namesGenerator->SetStartIndex(start[2]); >> >> > namesGenerator->SetEndIndex(start[2] + size[2] - 1); >> >> > namesGenerator->SetIncrementIndex(1); >> >> > >> >> > auto castFilter = itk::CastImageFilter> >> > ImageTypeToWrite>::New(); >> >> > castFilter->SetInput(imageToWrite); >> >> > castFilter->Update(); >> >> > >> >> > seriesWriter->SetInput(castFilter->GetOutput()); >> >> > seriesWriter->SetImageIO(dicomIO); >> >> > seriesWriter->SetFileNames(namesGenerator->GetFileNames()); >> >> > >> >> > typename itk::ImageSeriesReader< ImageTypeToRead >> >> > >::DictionaryArrayType >> >> > outputArray; >> >> > >> >> > // this doesn't work at all - was kind of hoping it would do the >> heavy >> >> > lifting for me >> >> > //dicomIO->SetOrigin(0, imageToWrite->GetOrigin()[0]); >> >> > //dicomIO->SetOrigin(1, imageToWrite->GetOrigin()[1]); >> >> > //dicomIO->SetOrigin(2, imageToWrite->GetOrigin()[2]); >> >> > //dicomIO->SetSpacing(0, imageToWrite->GetSpacing()[0]); >> >> > //dicomIO->SetSpacing(1, imageToWrite->GetSpacing()[1]); >> >> > //dicomIO->SetSpacing(2, imageToWrite->GetSpacing()[2]); >> >> > //dicomIO->SetDimensions(0, >> >> > imageToWrite->GetLargestPossibleRegion().GetSize()[0]); >> >> > //dicomIO->SetDimensions(1, >> >> > imageToWrite->GetLargestPossibleRegion().GetSize()[1]); >> >> > //dicomIO->SetDimensions(2, >> >> > imageToWrite->GetLargestPossibleRegion().GetSize()[2]); >> >> > // this doesn't work at all >> >> > >> >> > for (size_t i = 0; i < >> >> > imageToWrite->GetLargestPossibleRegion().GetSize()[2]; i++) >> >> > { >> >> > auto dict = new itk::ImageSeriesReader< ImageTypeToRead >> >> >>::DictionaryType; >> >> > typename ImageTypeToWrite::PointType position; >> >> > typename ImageTypeToWrite::IndexType index; >> >> > index[0] = 0; >> >> > index[1] = 0; >> >> > index[2] = i; >> >> > imageToWrite->TransformIndexToPhysicalPoint(index, position); >> >> > // tags extracted from dicom lookup >> >> > http://dicomlookup.com/lookup.asp >> >> > itk::EncapsulateMetaData(*dict, "0020|0032", >> >> > std::to_string(position[0]) + "\\" + std::to_string(position[1]) + >> "\\" >> >> > + >> >> > std::to_string(position[2])); // patient position >> >> > itk::EncapsulateMetaData(*dict, "0018|5100", >> >> > std::to_string(position[0]) + "\\" + std::to_string(position[1]) + >> "\\" >> >> > + >> >> > std::to_string(position[2])); >> >> > itk::EncapsulateMetaData(*dict, "2020|0010", >> >> > std::to_string(position[0]) + "\\" + std::to_string(position[1]) + >> "\\" >> >> > + >> >> > std::to_string(position[2])); >> >> > itk::EncapsulateMetaData(*dict, "0018|5101", >> >> > std::to_string(position[0]) + "\\" + std::to_string(position[1]) + >> "\\" >> >> > + >> >> > std::to_string(position[2])); >> >> > itk::EncapsulateMetaData(*dict, "0018|0050", >> >> > std::to_string(imageToWrite->GetSpacing()[2])); // Slice Thickness >> >> > itk::EncapsulateMetaData(*dict, "0018|0088", >> >> > std::to_string(imageToWrite->GetSpacing()[2])); // Spacing Between >> >> > Slices >> >> > itk::EncapsulateMetaData(*dict, "0008|0008", >> >> > "DERIVED\\SECONDARY"); // Image Type >> >> > itk::EncapsulateMetaData(*dict, "0008|0064", >> "DV"); // >> >> > Conversion Type >> >> > >> >> > outputArray.push_back(dict); >> >> > } >> >> > >> >> > seriesWriter->SetMetaDataDictionaryArray(&outputArray); // no >> >> > dictionary >> >> > information present without seriesReader >> >> > >> >> > try >> >> > { >> >> > seriesWriter->Write(); >> >> > } >> >> > catch (itk::ExceptionObject &e) >> >> > { >> >> > std::cerr << "Error occurred while trying to write the image '" >> << >> >> > outputDir << "': " << e.what() << "\n"; >> >> > exit(EXIT_FAILURE); >> >> > } >> >> > >> >> > ////////// >> >> > >> >> > Thanks a ton, >> >> > Sarthak >> >> > >> >> > _____________________________________ >> >> > Powered by www.kitware.com >> >> > >> >> > Visit other Kitware open-source projects at >> >> > http://www.kitware.com/opensource/opensource.html >> >> > >> >> > Kitware offers ITK Training Courses, for more information visit: >> >> > http://www.kitware.com/products/protraining.php >> >> > >> >> > Please keep messages on-topic and check the ITK FAQ at: >> >> > http://www.itk.org/Wiki/ITK_FAQ >> >> > >> >> > Follow this link to subscribe/unsubscribe: >> >> > http://public.kitware.com/mailman/listinfo/insight-users >> >> > >> > >> > >> > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From matimontg at gmail.com Thu Mar 9 10:43:34 2017 From: matimontg at gmail.com (Matias) Date: Thu, 9 Mar 2017 08:43:34 -0700 (MST) Subject: [ITK-users] DICOM writer loses slice spacing In-Reply-To: References: Message-ID: <1489074214992-37974.post@n7.nabble.com> Hi, was this ever fixed? Thanks! -- View this message in context: http://itk-users.7.n7.nabble.com/DICOM-writer-loses-slice-spacing-tp31951p37974.html Sent from the ITK - Users mailing list archive at Nabble.com. From matimontg at gmail.com Thu Mar 9 10:50:24 2017 From: matimontg at gmail.com (Matias) Date: Thu, 9 Mar 2017 08:50:24 -0700 (MST) Subject: [ITK-users] Slice Spacing changing when writting series? Message-ID: <1489074624236-37975.post@n7.nabble.com> Hi, I have a DCM serie that I read, do some Eurler rotation and then save using the SeriesWritter. For some reason, the slicespacing is always 1mm, despite the fact that the original series have its slice spacing set to 2mm This causes the Saggital and Coronal views to "be flatted". Any ideas why this is happening? Here's my code: #include "itkImage.h" #include "itkImageFileReader.h" #include "itkImageFileWriter.h" #include "itkResampleImageFilter.h" #include "itkAffineTransform.h" #include "itkEuler3DTransform.hxx" #include "itkGDCMImageIO.h" int main( int argc, char * argv[] ) { if( argc < 3 ) { std::cerr << "Usage: " << std::endl; std::cerr << argv[0] << " inputImageFile outputImageFile" << std::endl; return EXIT_FAILURE; } const unsigned int Dimension = 3; //imagen 3D typedef signed short InputPixelType; typedef signed short OutputPixelType; typedef itk::Image < InputPixelType, Dimension > InputImageType; typedef itk::Image < OutputPixelType, Dimension > OutputImageType; typedef itk::ImageFileReader < InputImageType > ReaderType; typedef itk::ImageFileWriter < OutputImageType > WriterType; typedef itk::GDCMImageIO ImageIOTypeGDCM; ReaderType::Pointer reader = ReaderType::New(); //lo que lee WriterType::Pointer writer = WriterType::New(); //lo que escribe reader->SetFileName( argv[1] ); //primer argumento writer->SetFileName( argv[2] ); //segundo argumento ImageIOTypeGDCM::Pointer gdcmImageIO = ImageIOTypeGDCM::New(); reader->SetImageIO( gdcmImageIO ); reader->Update(); reader->UpdateOutputInformation(); //Sin esto gdcmImageIO no puede leer tags double intercept = gdcmImageIO->GetRescaleIntercept(); std::cout << "Rescale Intercept value: " << intercept << std::endl; std::cout << "rescale slope: " << gdcmImageIO->GetRescaleSlope() << std::endl; std::cout << "use compression: " << gdcmImageIO->GetUseCompression() << std::endl; //const double angleInDegrees = atof( argv[3] ); //angulo de rotaci?n typedef itk::ResampleImageFilter FilterType; //Filtro FilterType::Pointer filter = FilterType::New(); typedef itk::Euler3DTransform< double > TransformType; //TransformType = Euler TransformType::Pointer transform = TransformType::New(); typedef itk::LinearInterpolateImageFunction InterpolatorType; InterpolatorType::Pointer interpolator = InterpolatorType::New(); filter->SetInterpolator( interpolator ); filter->SetDefaultPixelValue(intercept); //Pixel por defecto de lo que queda fuera de la imagen cuando se rota const InputImageType * inputImage = reader->GetOutput(); const InputImageType::SpacingType & spacing = inputImage->GetSpacing(); const InputImageType::PointType & origin = inputImage->GetOrigin(); InputImageType::SizeType size =inputImage->GetLargestPossibleRegion().GetSize(); filter->SetOutputOrigin( origin ); filter->SetOutputSpacing( spacing ); filter->SetOutputDirection( inputImage->GetDirection() ); filter->SetSize( size ); filter->SetInput( reader->GetOutput() ); writer->SetInput( filter->GetOutput() ); writer->UseInputMetaDataDictionaryOff(); writer->SetImageIO(gdcmImageIO); /*TransformType::OutputVectorType translation1; const double imageCenterX = origin[0] + spacing[0] * size[0] / 2.0; const double imageCenterY = origin[1] + spacing[1] * size[1] / 2.0; translation1[0] = -imageCenterX; translation1[1] = -imageCenterY; translation1[2] = 0;*/ //transform->Translate( translation1 ); //std::cout << "imageCenterX = " << imageCenterX << std::endl; //std::cout << "imageCenterY = " << imageCenterY << std::endl; // const double degreesToRadians = std::atan(1.0) / 45.0; // const double angle = angleInDegrees * degreesToRadians; transform->SetRotation(-0.0060, 0.0124, -0.0144); //Radianes XYZ /*TransformType::OutputVectorType translation2; translation2[0] = imageCenterX; translation2[1] = imageCenterY; transform->Translate( translation2, false );*/ filter->SetTransform( transform ); try { writer->Update(); } catch( itk::ExceptionObject & excep ) { std::cerr << "Exception caught !" << std::endl; std::cerr << excep << std::endl; } // Software Guide : EndCodeSnippet return EXIT_SUCCESS; } -- View this message in context: http://itk-users.7.n7.nabble.com/Slice-Spacing-changing-when-writting-series-tp37975.html Sent from the ITK - Users mailing list archive at Nabble.com. From scapegoat.sarthak at gmail.com Thu Mar 9 10:54:06 2017 From: scapegoat.sarthak at gmail.com (Sarthak P) Date: Thu, 9 Mar 2017 10:54:06 -0500 Subject: [ITK-users] Writing a DICOM file while preserving input image properties In-Reply-To: References: Message-ID: Found recorded bugs related to this: https://issues.itk.org/jira/browse/ITK-3176 (spacing) https://issues.itk.org/jira/browse/ITK-3407 (origin) Guess we wait and watch. Thanks a ton for your help, Sarthak On Thu, Mar 9, 2017 at 10:26 AM, Sarthak P wrote: > So the thing is that even the origin isn't picked up when reading the > DICOM image (it is always 0,0,0) so I am guessing I am doing something > wrong when writing into the tag 0020|0032 itself. Once that is rectified, > the spacing information (should) correct itself. > > Best, > Sarthak > > > On Thu, Mar 9, 2017 at 10:25 AM, Sarthak P > wrote: > >> Hi Matt, >> >> Yes I do know that. I have tried to put the spacing information from the >> itk::Image using various combinations with the tags 0018|0088 (slice >> thickness) and 0018|0050 (spacing between slices) but to no avail. >> >> Thanks for your help, >> Sarthak >> >> On Thu, Mar 9, 2017 at 9:47 AM, Matt McCormick < >> matt.mccormick at kitware.com> wrote: >> >>> HI Sarthak, >>> >>> The slice thickness is different from the spacing between slices. In >>> DICOM, slice thickness is related to the point spread function of the >>> imaging system and slice spacing is related to digital sampling. >>> >>> Hope this helps, >>> Matt >>> >>> On Thu, Mar 9, 2017 at 9:30 AM, Sarthak P >>> wrote: >>> > Hi Matt, >>> > >>> > Thanks for the response. >>> > >>> > I don't think I am having issues with writing into the tags since I am >>> able >>> > to read the correct information I am writing (for instance, the tag >>> > "0020|0032" is always populated with the physical coordinate of the >>> specific >>> > slice in a correct manner both during writing and reading). In an >>> example, >>> > the slice thickness should be "2" and the separation between the dicom >>> > slices is "2", which is correct. But when ITK is reading this >>> collection, it >>> > keeps the slice thickness at "1". I am seeing the same behavior in >>> other >>> > applications as well (ITK-SNAP, etc.). >>> > >>> > Could there be some tag I am missing to write? Since my last post, I >>> tried >>> > writing only to the tag "0020|0032"; the output dictionary array gets >>> > populated properly but the file is still not written as expected. I am >>> using >>> > ITK 4.11, BTW. >>> > >>> > Best, >>> > Sarthak >>> > >>> > On Thu, Mar 9, 2017 at 9:20 AM, Matt McCormick < >>> matt.mccormick at kitware.com> >>> > wrote: >>> >> >>> >> Hi Sarthak, >>> >> >>> >> DICOM export requires improved typing to produce a valid set of tags. >>> >> This work has been started here: >>> >> >>> >> https://github.com/KitwareMedical/ITKDICOM >>> >> >>> >> but the implementation is in initial stages. I would be happy to >>> >> provide guidance if you would like to move it forward. >>> >> >>> >> Thanks, >>> >> Matt >>> >> >>> >> On Wed, Mar 8, 2017 at 3:11 PM, Sarthak P < >>> scapegoat.sarthak at gmail.com> >>> >> wrote: >>> >> > Hello All, >>> >> > >>> >> > I am trying to write a DICOM image but I want to preserve the >>> properties >>> >> > from the input image (origin, direction, spacing, etc.). The ITK >>> >> > examples do >>> >> > not show how to do this properly and anything I have done with the >>> dicom >>> >> > tags hasn't worked. Any help would be much appreciated. >>> >> > >>> >> > Here is what I have so far: >>> >> > >>> >> > ////////// >>> >> > const std::string dataDir = argv[1]; >>> >> > const std::string inputFile = dataDir + "/inputImage.nii.gz"; >>> >> > const std::string outputDir = dataDir + "/test/"; >>> >> > >>> >> > using ImageTypeToRead = itk::Image< float, 3 >; >>> >> > using ImageTypeToWrite = itk::Image< short, 3 >; >>> >> > auto inputImage = cbica::ReadImageWithOrientFix< itk::Image< >>> float, 3 >>> >> > > >>> >> >>(inputFile); >>> >> > auto imageToWrite = inputImage; >>> >> > >>> >> > auto dicomIO = itk::GDCMImageIO::New(); >>> >> > >>> >> > auto seriesWriter = itk::ImageSeriesWriter< ImageTypeToWrite, >>> >> > itk::Image >::New(); >>> >> > >>> >> > auto namesGenerator = itk::NumericSeriesFileNames::New(); >>> >> > auto start = imageToWrite->GetLargestPossibleRegion().GetIndex(); >>> >> > auto size = imageToWrite->GetLargestPossibleRegion().GetSize(); >>> >> > namesGenerator->SetSeriesFormat((outputDir + >>> >> > "/image%03d.dcm").c_str()); >>> >> > namesGenerator->SetStartIndex(start[2]); >>> >> > namesGenerator->SetEndIndex(start[2] + size[2] - 1); >>> >> > namesGenerator->SetIncrementIndex(1); >>> >> > >>> >> > auto castFilter = itk::CastImageFilter>> >> > ImageTypeToWrite>::New(); >>> >> > castFilter->SetInput(imageToWrite); >>> >> > castFilter->Update(); >>> >> > >>> >> > seriesWriter->SetInput(castFilter->GetOutput()); >>> >> > seriesWriter->SetImageIO(dicomIO); >>> >> > seriesWriter->SetFileNames(namesGenerator->GetFileNames()); >>> >> > >>> >> > typename itk::ImageSeriesReader< ImageTypeToRead >>> >> > >::DictionaryArrayType >>> >> > outputArray; >>> >> > >>> >> > // this doesn't work at all - was kind of hoping it would do the >>> heavy >>> >> > lifting for me >>> >> > //dicomIO->SetOrigin(0, imageToWrite->GetOrigin()[0]); >>> >> > //dicomIO->SetOrigin(1, imageToWrite->GetOrigin()[1]); >>> >> > //dicomIO->SetOrigin(2, imageToWrite->GetOrigin()[2]); >>> >> > //dicomIO->SetSpacing(0, imageToWrite->GetSpacing()[0]); >>> >> > //dicomIO->SetSpacing(1, imageToWrite->GetSpacing()[1]); >>> >> > //dicomIO->SetSpacing(2, imageToWrite->GetSpacing()[2]); >>> >> > //dicomIO->SetDimensions(0, >>> >> > imageToWrite->GetLargestPossibleRegion().GetSize()[0]); >>> >> > //dicomIO->SetDimensions(1, >>> >> > imageToWrite->GetLargestPossibleRegion().GetSize()[1]); >>> >> > //dicomIO->SetDimensions(2, >>> >> > imageToWrite->GetLargestPossibleRegion().GetSize()[2]); >>> >> > // this doesn't work at all >>> >> > >>> >> > for (size_t i = 0; i < >>> >> > imageToWrite->GetLargestPossibleRegion().GetSize()[2]; i++) >>> >> > { >>> >> > auto dict = new itk::ImageSeriesReader< ImageTypeToRead >>> >> >>::DictionaryType; >>> >> > typename ImageTypeToWrite::PointType position; >>> >> > typename ImageTypeToWrite::IndexType index; >>> >> > index[0] = 0; >>> >> > index[1] = 0; >>> >> > index[2] = i; >>> >> > imageToWrite->TransformIndexToPhysicalPoint(index, position); >>> >> > // tags extracted from dicom lookup >>> >> > http://dicomlookup.com/lookup.asp >>> >> > itk::EncapsulateMetaData(*dict, "0020|0032", >>> >> > std::to_string(position[0]) + "\\" + std::to_string(position[1]) + >>> "\\" >>> >> > + >>> >> > std::to_string(position[2])); // patient position >>> >> > itk::EncapsulateMetaData(*dict, "0018|5100", >>> >> > std::to_string(position[0]) + "\\" + std::to_string(position[1]) + >>> "\\" >>> >> > + >>> >> > std::to_string(position[2])); >>> >> > itk::EncapsulateMetaData(*dict, "2020|0010", >>> >> > std::to_string(position[0]) + "\\" + std::to_string(position[1]) + >>> "\\" >>> >> > + >>> >> > std::to_string(position[2])); >>> >> > itk::EncapsulateMetaData(*dict, "0018|5101", >>> >> > std::to_string(position[0]) + "\\" + std::to_string(position[1]) + >>> "\\" >>> >> > + >>> >> > std::to_string(position[2])); >>> >> > itk::EncapsulateMetaData(*dict, "0018|0050", >>> >> > std::to_string(imageToWrite->GetSpacing()[2])); // Slice Thickness >>> >> > itk::EncapsulateMetaData(*dict, "0018|0088", >>> >> > std::to_string(imageToWrite->GetSpacing()[2])); // Spacing Between >>> >> > Slices >>> >> > itk::EncapsulateMetaData(*dict, "0008|0008", >>> >> > "DERIVED\\SECONDARY"); // Image Type >>> >> > itk::EncapsulateMetaData(*dict, "0008|0064", >>> "DV"); // >>> >> > Conversion Type >>> >> > >>> >> > outputArray.push_back(dict); >>> >> > } >>> >> > >>> >> > seriesWriter->SetMetaDataDictionaryArray(&outputArray); // no >>> >> > dictionary >>> >> > information present without seriesReader >>> >> > >>> >> > try >>> >> > { >>> >> > seriesWriter->Write(); >>> >> > } >>> >> > catch (itk::ExceptionObject &e) >>> >> > { >>> >> > std::cerr << "Error occurred while trying to write the image '" >>> << >>> >> > outputDir << "': " << e.what() << "\n"; >>> >> > exit(EXIT_FAILURE); >>> >> > } >>> >> > >>> >> > ////////// >>> >> > >>> >> > Thanks a ton, >>> >> > Sarthak >>> >> > >>> >> > _____________________________________ >>> >> > Powered by www.kitware.com >>> >> > >>> >> > Visit other Kitware open-source projects at >>> >> > http://www.kitware.com/opensource/opensource.html >>> >> > >>> >> > Kitware offers ITK Training Courses, for more information visit: >>> >> > http://www.kitware.com/products/protraining.php >>> >> > >>> >> > Please keep messages on-topic and check the ITK FAQ at: >>> >> > http://www.itk.org/Wiki/ITK_FAQ >>> >> > >>> >> > Follow this link to subscribe/unsubscribe: >>> >> > http://public.kitware.com/mailman/listinfo/insight-users >>> >> > >>> > >>> > >>> >> >> > -------------- next part -------------- An HTML attachment was scrubbed... URL: From matt.mccormick at kitware.com Thu Mar 9 12:00:04 2017 From: matt.mccormick at kitware.com (Matt McCormick) Date: Thu, 9 Mar 2017 12:00:04 -0500 Subject: [ITK-users] DICOM writer loses slice spacing In-Reply-To: <1489074214992-37974.post@n7.nabble.com> References: <1489074214992-37974.post@n7.nabble.com> Message-ID: Hi Matias, This requires improved DICOM image typing to generate images with correct tags corresponding to each type. This work has started here: https://github.com/KitwareMedical/ITKDICOM but additional effort is required to move it forward. Contributions are welcome. Thanks, Matt On Thu, Mar 9, 2017 at 10:43 AM, Matias wrote: > Hi, was this ever fixed? Thanks! > > > > -- > View this message in context: http://itk-users.7.n7.nabble.com/DICOM-writer-loses-slice-spacing-tp31951p37974.html > Sent from the ITK - Users mailing list archive at Nabble.com. > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users From jhlegarreta at vicomtech.org Fri Mar 10 08:56:11 2017 From: jhlegarreta at vicomtech.org (Jon Haitz Legarreta) Date: Fri, 10 Mar 2017 14:56:11 +0100 Subject: [ITK-users] Patch for ApproximateSignedDistanceMapImageFilter In-Reply-To: <547d4adb-84e8-403f-acdc-ff0738c8b825@neuro.ma.uni-heidelberg.de> References: <547d4adb-84e8-403f-acdc-ff0738c8b825@neuro.ma.uni-heidelberg.de> Message-ID: Patch file applied: http://review.source.kitware.com/#/c/22149/ Let's see what the robots say. Thanks Christina. JON HAITZ -- On 1 March 2017 at 14:47, Chr. Rossmanith wrote: > I'm behind a firewall and authentication fails. I can login into gerrit, > so it is not a wrong password. The wiki [1] told me to send the patch to > the ML because something is currently out of order... > > [1] https://itk.org/Wiki/ITK/Git/Account#Gerrit > > Christina > > > > On 01.03.2017 14:42, Francois Budin wrote: > > Hello Christina, > > Thanks for the patch. Do you mind submitting it on Gerrit? This will > simplify the review process. If you do not already have a user account on > Gerrit, you can follow the instructions available here [1]. It will also > help to keep track of your own contributions, and will make potential > future contributions easy. > > Thanks for helping, > Francois > > [1] https://itk.org/Wiki/ITK/Git/Develop > > On Wed, Mar 1, 2017 at 8:12 AM, Chr. Rossmanith < > cr at neuro.ma.uni-heidelberg.de> wrote: > >> For binary images with 0 for background and 1 for objects with an integer >> input pixel type there is a problem representing the average of 0 and 1 = >> 0.5 with the input pixel type. The output pixel type is required to be a >> floating pixel type (filter documentation), so it should be safe to change >> the type of levelSetValue to OutputPixelType. >> >> Regards, >> Christina >> >> >> _____________________________________ >> Powered by www.kitware.com >> >> Visit other Kitware open-source projects at >> http://www.kitware.com/opensource/opensource.html >> >> Kitware offers ITK Training Courses, for more information visit: >> http://www.kitware.com/products/protraining.php >> >> Please keep messages on-topic and check the ITK FAQ at: >> http://www.itk.org/Wiki/ITK_FAQ >> >> Follow this link to subscribe/unsubscribe: >> http://public.kitware.com/mailman/listinfo/insight-users >> >> > > > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From emilianoberonich at gmail.com Fri Mar 10 11:19:06 2017 From: emilianoberonich at gmail.com (Emiliano Beronich) Date: Fri, 10 Mar 2017 13:19:06 -0300 Subject: [ITK-users] Limitations on GDCMImageIO Message-ID: Hi everyone, While using the GDCMImageIO class to write a Dicom Image, I found some limitations so I modified the class to correct them. The limitations I found are: 1) Can't write a sequence or even less Sequence inside Sequences. 2) Can't write arrays of unsigned short (Example: (0054,0010) EnergyWindowVector, (0054,0020) DetectorVector, (0054,0080) SliceVector). In order to pass the data the array of unsigned short I'm using a std::vector. The sequences are stored in a Dictionary. Attached is the class modified. I would be great to include these changes in future versions or improve GDCMImageIO class to correct these limitations. HTH, Emiliano Beronich -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- /*========================================================================= * * Copyright Insight Software Consortium * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0.txt * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * *=========================================================================*/ /*========================================================================= * * Portions of this file are subject to the VTK Toolkit Version 3 copyright. * * Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen * * For complete copyright, license and disclaimer of warranty information * please refer to the NOTICE file at the top of the ITK source tree. * *=========================================================================*/ #include "itkVersion.h" #include "itkGDCMImageIO.h" #include "itkIOCommon.h" #include "itkArray.h" #include "itkByteSwapper.h" #include "vnl/vnl_cross.h" #include "itkMetaDataObject.h" #include "itksys/SystemTools.hxx" #include "itksys/Base64.h" #include "gdcmImageHelper.h" #include "gdcmFileExplicitFilter.h" #include "gdcmImageChangeTransferSyntax.h" #include "gdcmDataSetHelper.h" #include "gdcmStringFilter.h" #include "gdcmImageApplyLookupTable.h" #include "gdcmImageChangePlanarConfiguration.h" #include "gdcmRescaler.h" #include "gdcmImageReader.h" #include "gdcmImageWriter.h" #include "gdcmUIDGenerator.h" #include "gdcmAttribute.h" #include "gdcmGlobal.h" #include namespace itk { class InternalHeader { public: InternalHeader():m_Header(0) {} ~InternalHeader() { delete m_Header; } gdcm::File *m_Header; }; GDCMImageIO::GDCMImageIO() { this->m_DICOMHeader = new InternalHeader; this->SetNumberOfDimensions(3); //needed for getting the 3 coordinates of // the origin, even if it is a 2D slice. m_ByteOrder = LittleEndian; //default m_FileType = Binary; //default...always true m_RescaleSlope = 1.0; m_RescaleIntercept = 0.0; // UIDPrefix is the ITK root id tacked with a ".1" // allowing to designate a subspace of the id space for ITK generated DICOM m_UIDPrefix = "1.2.826.0.1.3680043.2.1125." "1"; // Purely internal use, no user access: m_StudyInstanceUID = ""; m_SeriesInstanceUID = ""; m_FrameOfReferenceInstanceUID = ""; m_KeepOriginalUID = false; m_LoadPrivateTags = false; m_InternalComponentType = UNKNOWNCOMPONENTTYPE; // by default assume that images will be 2D. // This number is updated according the information // received through the MetaDataDictionary m_GlobalNumberOfDimensions = 2; // By default use JPEG2000. For legacy system, one should prefer JPEG since // JPEG2000 was only recently added to the DICOM standard m_CompressionType = JPEG2000; } GDCMImageIO::~GDCMImageIO() { delete this->m_DICOMHeader; } bool GDCMImageIO::OpenGDCMFileForReading(std::ifstream & os, const char *filename) { // Make sure that we have a file to if ( *filename == 0 ) { itkExceptionMacro(<< "A FileName must be specified."); } // Close file from any previous image if ( os.is_open() ) { os.close(); } // Open the new file for reading itkDebugMacro(<< "Initialize: opening file " << filename); // Actually open the file os.open(filename, std::ios::in | std::ios::binary); if ( os.fail() ) { return false; } return true; } bool GDCMImageIO::OpenGDCMFileForWriting(std::ofstream & os, const char *filename) { // Make sure that we have a file to if ( *filename == 0 ) { itkExceptionMacro(<< "A FileName must be specified."); } // Close file from any previous image if ( os.is_open() ) { os.close(); } // Open the new file for writing itkDebugMacro(<< "Initialize: opening file " << filename); // Actually open the file os.open(filename, std::ios::out | std::ios::binary); if ( os.fail() ) { itkExceptionMacro( << "Could not open file: " << filename << " for writing." << std::endl << "Reason: " << itksys::SystemTools::GetLastSystemError() ); } return true; } // This method will only test if the header looks like a // GDCM image file. bool GDCMImageIO::CanReadFile(const char *filename) { std::ifstream file; std::string fname(filename); if ( fname == "" ) { itkDebugMacro(<< "No filename specified."); return false; } //Check for file existence: if ( !this->OpenGDCMFileForReading(file, filename) ) { return false; } // // sniff for the DICM signature first at 128 // then at zero, and if either place has it then // ask GDCM to try reading it. // // There isn't a definitive way to check for DICOM files; // This was actually cribbed from DICOMParser in VTK bool dicomsig(false); for(long int off = 128; off >= 0; off -= 128) { file.seekg(off,std::ios_base::beg); if(file.fail() || file.eof()) { return false; } char buf[5]; file.read(buf,4); if(file.fail()) { return false; } buf[4] = '\0'; std::string sig(buf); if(sig == "DICM") { dicomsig = true; } } if(!dicomsig) { file.seekg(0,std::ios_base::beg); unsigned short groupNo; file.read(reinterpret_cast(&groupNo),sizeof(unsigned short)); ByteSwapper::SwapFromSystemToLittleEndian(&groupNo); if(groupNo == 0x0002 || groupNo == 0x0008) { dicomsig = true; } } if(dicomsig) { // Check to see if its a valid dicom file gdcm is able to parse: // We are parsing the header one time here: gdcm::ImageReader reader; reader.SetFileName(filename); if ( reader.Read() ) { return true; } } return false; } void GDCMImageIO::Read(void *pointer) { const char *filename = m_FileName.c_str(); itkAssertInDebugAndIgnoreInReleaseMacro( gdcm::ImageHelper::GetForceRescaleInterceptSlope() ); gdcm::ImageReader reader; reader.SetFileName(filename); if ( !reader.Read() ) { itkExceptionMacro(<< "Cannot read requested file"); return; } gdcm::Image & image = reader.GetImage(); #ifndef NDEBUG gdcm::PixelFormat pixeltype_debug = image.GetPixelFormat(); itkAssertInDebugAndIgnoreInReleaseMacro(image.GetNumberOfDimensions() == 2 || image.GetNumberOfDimensions() == 3); #endif SizeValueType len = image.GetBufferLength(); // I think ITK only allow RGB image by pixel (and not by plane) if ( image.GetPlanarConfiguration() == 1 ) { gdcm::ImageChangePlanarConfiguration icpc; icpc.SetInput(image); icpc.SetPlanarConfiguration(0); icpc.Change(); image = icpc.GetOutput(); } gdcm::PhotometricInterpretation pi = image.GetPhotometricInterpretation(); if ( pi == gdcm::PhotometricInterpretation::PALETTE_COLOR ) { gdcm::ImageApplyLookupTable ialut; ialut.SetInput(image); ialut.Apply(); image = ialut.GetOutput(); len *= 3; } if ( !image.GetBuffer( (char*)pointer ) ) { itkExceptionMacro(<< "Failed to get the buffer!"); return; } const gdcm::PixelFormat & pixeltype = image.GetPixelFormat(); #ifndef NDEBUG // ImageApplyLookupTable is meant to change the pixel type for PALETTE_COLOR images // (from single values to triple values per pixel) if ( pi != gdcm::PhotometricInterpretation::PALETTE_COLOR ) { itkAssertInDebugAndIgnoreInReleaseMacro( pixeltype_debug == pixeltype ); } #endif if ( m_RescaleSlope != 1.0 || m_RescaleIntercept != 0.0 ) { gdcm::Rescaler r; r.SetIntercept(m_RescaleIntercept); r.SetSlope(m_RescaleSlope); r.SetPixelFormat(pixeltype); gdcm::PixelFormat outputpt = r.ComputeInterceptSlopePixelType(); char * copy = new char[len]; memcpy(copy, (char *)pointer, len); r.Rescale( (char *)pointer, copy, len ); delete[] copy; // WARNING: sizeof(Real World Value) != sizeof(Stored Pixel) len = len * outputpt.GetPixelSize() / pixeltype.GetPixelSize(); } #ifndef NDEBUG // \postcondition // Now that len was updated (after unpacker 12bits -> 16bits, rescale...) , // can now check compat: const SizeValueType numberOfBytesToBeRead = static_cast< SizeValueType >( this->GetImageSizeInBytes() ); itkAssertInDebugAndIgnoreInReleaseMacro(numberOfBytesToBeRead == len); // programmer error #endif } void GDCMImageIO::InternalReadImageInformation(std::ifstream & file) { //read header if ( !this->OpenGDCMFileForReading( file, m_FileName.c_str() ) ) { itkExceptionMacro(<< "Cannot read requested file"); } // In general this should be relatively safe to assume gdcm::ImageHelper::SetForceRescaleInterceptSlope(true); const char * filename = m_FileName.c_str(); gdcm::ImageReader reader; reader.SetFileName(filename); if ( !reader.Read() ) { itkExceptionMacro(<< "Cannot read requested file"); } const gdcm::Image & image = reader.GetImage(); const gdcm::File & f = reader.GetFile(); const gdcm::DataSet & ds = f.GetDataSet(); const unsigned int * dims = image.GetDimensions(); const gdcm::PixelFormat & pixeltype = image.GetPixelFormat(); m_RescaleIntercept = image.GetIntercept(); m_RescaleSlope = image.GetSlope(); gdcm::Rescaler r; r.SetIntercept(m_RescaleIntercept); r.SetSlope(m_RescaleSlope); r.SetPixelFormat(pixeltype); gdcm::PixelFormat::ScalarType outputpt = r.ComputeInterceptSlopePixelType(); itkAssertInDebugAndIgnoreInReleaseMacro(pixeltype <= outputpt); m_ComponentType = UNKNOWNCOMPONENTTYPE; switch ( outputpt ) { case gdcm::PixelFormat::INT8: m_ComponentType = ImageIOBase::CHAR; // Is it signed char ? break; case gdcm::PixelFormat::UINT8: m_ComponentType = ImageIOBase::UCHAR; break; /* INT12 / UINT12 should not happen anymore in any modern DICOM */ case gdcm::PixelFormat::INT12: m_ComponentType = ImageIOBase::SHORT; break; case gdcm::PixelFormat::UINT12: m_ComponentType = ImageIOBase::USHORT; break; case gdcm::PixelFormat::INT16: m_ComponentType = ImageIOBase::SHORT; break; case gdcm::PixelFormat::UINT16: m_ComponentType = ImageIOBase::USHORT; break; // RT / SC have 32bits case gdcm::PixelFormat::INT32: m_ComponentType = ImageIOBase::INT; break; case gdcm::PixelFormat::UINT32: m_ComponentType = ImageIOBase::UINT; break; //case gdcm::PixelFormat::FLOAT16: // TODO case gdcm::PixelFormat::FLOAT32: m_ComponentType = ImageIOBase::FLOAT; break; case gdcm::PixelFormat::FLOAT64: m_ComponentType = ImageIOBase::DOUBLE; break; default: itkExceptionMacro("Unhandled PixelFormat: " << outputpt); } m_NumberOfComponents = pixeltype.GetSamplesPerPixel(); if ( image.GetPhotometricInterpretation() == gdcm::PhotometricInterpretation::PALETTE_COLOR ) { itkAssertInDebugAndIgnoreInReleaseMacro(m_NumberOfComponents == 1); // TODO: need to do the LUT ourself... //itkExceptionMacro(<< "PALETTE_COLOR is not implemented yet"); // AFAIK ITK user don't care about the palette so always apply it and fake a // RGB image for them m_NumberOfComponents = 3; } if ( m_NumberOfComponents == 1 ) { this->SetPixelType(SCALAR); } else { this->SetPixelType(RGB); // What if image is YBR ? This is a problem since // integer conversion is lossy } // set values in case we don't find them //this->SetNumberOfDimensions( image.GetNumberOfDimensions() ); m_Dimensions[0] = dims[0]; m_Dimensions[1] = dims[1]; const double *spacing = image.GetSpacing(); m_Spacing[0] = spacing[0]; m_Spacing[1] = spacing[1]; m_Spacing[2] = spacing[2]; const double *origin = image.GetOrigin(); m_Origin[0] = origin[0]; m_Origin[1] = origin[1]; m_Origin[2] = origin[2]; if ( image.GetNumberOfDimensions() == 3 ) { m_Dimensions[2] = dims[2]; } else { m_Dimensions[2] = 1; } const double * dircos = image.GetDirectionCosines(); vnl_vector< double > rowDirection(3), columnDirection(3); rowDirection[0] = dircos[0]; rowDirection[1] = dircos[1]; rowDirection[2] = dircos[2]; columnDirection[0] = dircos[3]; columnDirection[1] = dircos[4]; columnDirection[2] = dircos[5]; vnl_vector< double > sliceDirection = vnl_cross_3d(rowDirection, columnDirection); // orthogonalize sliceDirection.normalize(); rowDirection = vnl_cross_3d(columnDirection,sliceDirection).normalize(); columnDirection = vnl_cross_3d(sliceDirection,rowDirection); this->SetDirection(0, rowDirection); this->SetDirection(1, columnDirection); this->SetDirection(2, sliceDirection); //Now copying the gdcm dictionary to the itk dictionary: MetaDataDictionary & dico = this->GetMetaDataDictionary(); // in the case of re-use by ImageSeriesReader, clear the dictionary // before populating it. dico.Clear(); gdcm::StringFilter sf; sf.SetFile(f); gdcm::DataSet::ConstIterator it = ds.Begin(); // Copy of the header->content for (; it != ds.End(); ++it ) { const gdcm::DataElement & ref = *it; const gdcm::Tag & tag = ref.GetTag(); // Compute VR from the toplevel file, and the currently processed dataset: gdcm::VR vr = gdcm::DataSetHelper::ComputeVR(f, ds, tag); // Process binary field and encode them as mime64: only when we do not know // of any better // representation. VR::US is binary, but user want ASCII representation. if ( vr & ( gdcm::VR::OB | gdcm::VR::OF | gdcm::VR::OW | gdcm::VR::SQ | gdcm::VR::UN ) ) { // itkAssertInDebugAndIgnoreInReleaseMacro( vr & gdcm::VR::VRBINARY ); /* * Old behavior was to skip SQ, Pixel Data element. I decided that it is not safe to mime64 * VR::UN element. There used to be a bug in gdcm 1.2.0 and VR:UN element. */ if ( (m_LoadPrivateTags || tag.IsPublic()) && vr != gdcm::VR::SQ && tag != gdcm::Tag(0x7fe0, 0x0010) /* && vr != gdcm::VR::UN*/ ) { const gdcm::ByteValue *bv = ref.GetByteValue(); if ( bv ) { // base64 streams have to be a multiple of 4 bytes in length int encodedLengthEstimate = 2 * bv->GetLength(); encodedLengthEstimate = ( ( encodedLengthEstimate / 4 ) + 1 ) * 4; char * bin = new char[encodedLengthEstimate]; unsigned int encodedLengthActual = static_cast< unsigned int >( itksysBase64_Encode( (const unsigned char *)bv->GetPointer(), static_cast< SizeValueType >( bv->GetLength() ), (unsigned char *)bin, static_cast< int >( 0 ) ) ); std::string encodedValue(bin, encodedLengthActual); EncapsulateMetaData< std::string >(dico, tag.PrintAsPipeSeparatedString(), encodedValue); delete[] bin; } } } else /* if ( vr & gdcm::VR::VRASCII ) */ { // Only copying field from the public DICOM dictionary if ( m_LoadPrivateTags || tag.IsPublic() ) { EncapsulateMetaData< std::string >( dico, tag.PrintAsPipeSeparatedString(), sf.ToString(tag) ); } } } #if defined( ITKIO_DEPRECATED_GDCM1_API ) // Now is a good time to fill in the class member: char name[512]; this->GetPatientName(name); this->GetPatientID(name); this->GetPatientSex(name); this->GetPatientAge(name); this->GetStudyID(name); this->GetPatientDOB(name); this->GetStudyDescription(name); this->GetBodyPart(name); this->GetNumberOfSeriesInStudy(name); this->GetNumberOfStudyRelatedSeries(name); this->GetStudyDate(name); this->GetModality(name); this->GetManufacturer(name); this->GetInstitution(name); this->GetModel(name); this->GetScanOptions(name); #endif } void GDCMImageIO::ReadImageInformation() { std::ifstream file; this->InternalReadImageInformation(file); } bool GDCMImageIO::CanWriteFile(const char *name) { std::string filename = name; if ( filename == "" ) { itkDebugMacro(<< "No filename specified."); return false; } std::string::size_type dcmPos = filename.rfind(".dcm"); if ( ( dcmPos != std::string::npos ) && ( dcmPos == filename.length() - 4 ) ) { return true; } dcmPos = filename.rfind(".DCM"); if ( ( dcmPos != std::string::npos ) && ( dcmPos == filename.length() - 4 ) ) { return true; } std::string::size_type dicomPos = filename.rfind(".dicom"); if ( ( dicomPos != std::string::npos ) && ( dicomPos == filename.length() - 6 ) ) { return true; } dicomPos = filename.rfind(".DICOM"); if ( ( dicomPos != std::string::npos ) && ( dicomPos == filename.length() - 6 ) ) { return true; } return false; } void GDCMImageIO::WriteImageInformation() {} void GDCMImageIO::ReadElement(itk::MetaDataDictionary& dict, gdcm::Tag& tag, const std::string& key, gdcm::DataSet& dataset, gdcm::FileMetaInformation& fmi) { gdcm::Global & g = gdcm::Global::GetInstance(); const gdcm::Dicts & dicts = g.GetDicts(); const gdcm::Dict & pubdict = dicts.GetPublicDict(); const gdcm::DictEntry & dictEntry = pubdict.GetDictEntry(tag); gdcm::VR::VRType vrtype = dictEntry.GetVR(); if ( vrtype & ( gdcm::VR::OB | gdcm::VR::OF | gdcm::VR::OW | gdcm::VR::UN ) ) { std::string value; ExposeMetaData< std::string >(dict, key, value); // Custom VR::VRBINARY // convert value from Base64 uint8_t * bin = new uint8_t[value.size()]; unsigned int decodedLengthActual = static_cast< unsigned int >( itksysBase64_Decode( (const unsigned char *)value.c_str(), static_cast< SizeValueType >( 0 ), (unsigned char *)bin, static_cast< SizeValueType >( value.size() ) ) ); if ( /*tag.GetGroup() != 0 ||*/ tag.GetElement() != 0 ) // ? { gdcm::DataElement de(tag); de.SetByteValue( (char *)bin, decodedLengthActual ); de.SetVR( dictEntry.GetVR() ); if ( tag.GetGroup() == 0x2 ) fmi.Insert(de); else dataset.Insert(de); } delete[] bin; } else if (vrtype & gdcm::VR::US) { std::vector< unsigned short> vectorValue; ExposeMetaData< std::vector >(dict, key, vectorValue); if (vectorValue.size() > 0) { if ( !tag.IsGroupLength() ) // Get rid of group length, they are not useful { gdcm::DataElement de(tag); if ( dictEntry.GetVR().IsVRFile() ) { de.SetVR( dictEntry.GetVR() ); } de.SetByteValue( (char*) &vectorValue[0], static_cast(sizeof(unsigned short) * vectorValue.size()) ); dataset.Insert(de); } } else { unsigned short value; ExposeMetaData< unsigned short >(dict, key, value); if ( !tag.IsGroupLength() ) // Get rid of group length, they are not useful { gdcm::DataElement de(tag); if ( dictEntry.GetVR().IsVRFile() ) { de.SetVR( dictEntry.GetVR() ); } de.SetByteValue( (char*) &value, sizeof(unsigned short) ); dataset.Insert(de); //value, tag.GetGroup(), tag.GetElement()); } } } else // VRASCII { std::string value; ExposeMetaData< std::string >(dict, key, value); // TODO, should we keep: // (0028,0106) US/SS 0 #2, 1 // SmallestImagePixelValue // (0028,0107) US/SS 4095 #2, 1 // LargestImagePixelValue if ( !tag.IsGroupLength() ) // Get rid of group length, they are not useful { gdcm::DataElement de(tag); if ( dictEntry.GetVR().IsVRFile() ) { de.SetVR( dictEntry.GetVR() ); } #if GDCM_MAJOR_VERSION == 2 && GDCM_MINOR_VERSION <= 12 // This will not work in the vast majority of cases but to get at // least something working in GDCM 2.0.12 de.SetByteValue( value.c_str(), static_cast(value.size()) ); #else std::string si = sf.FromString( tag, value.c_str(), value.size() ); de.SetByteValue( si.c_str(), si.size() ); #endif if ( tag.GetGroup() == 0x2 ) fmi.Insert(de); else dataset.Insert(de); //value, tag.GetGroup(), tag.GetElement()); } } } void GDCMImageIO::ReadSequenceElement( itk::MetaDataDictionary& dict, const std::string& key, gdcm::Tag& tag, gdcm::DataSet& dataset, gdcm::FileMetaInformation & fmi) { gdcm::Global & g = gdcm::Global::GetInstance(); const gdcm::Dicts & dicts = g.GetDicts(); const gdcm::Dict & pubdict = dicts.GetPublicDict(); const gdcm::DictEntry & dictEntry = pubdict.GetDictEntry(tag); gdcm::VR::VRType vrtype = dictEntry.GetVR(); itk::MetaDataDictionary seqDict; ExposeMetaData< itk::MetaDataDictionary >(dict, key, seqDict); gdcm::SmartPointer sq = new gdcm::SequenceOfItems(); sq->SetLengthToUndefined(); gdcm::Item item; gdcm::DataSet &nds = item.GetNestedDataSet(); gdcm::Tag tagSq; std::string valueSq; itk::MetaDataDictionary::ConstIterator itrSq = seqDict.Begin(); itk::MetaDataDictionary::ConstIterator endSq = seqDict.End(); while ( itrSq != endSq ) { const std::string & keySq = itrSq->first; //Needed for bcc32 ExposeMetaData< std::string >(seqDict, keySq, valueSq); // Convert DICOM name to DICOM (group,element) bool b = tagSq.ReadFromPipeSeparatedString( keySq.c_str() ); if (b) { const gdcm::DictEntry & seqDictEntry = pubdict.GetDictEntry(tagSq); gdcm::VR::VRType vrtype = seqDictEntry.GetVR(); if ( vrtype == gdcm::VR::SQ ) { // How did we reach here // Create a Sequence ReadSequenceElement(seqDict, keySq, tagSq, dataset, fmi); } else { ReadElement(seqDict, tagSq, keySq, nds, fmi); } } ++itrSq; } sq->AddItem(item); gdcm::DataElement des( tag ); des.SetVR(gdcm::VR::SQ); des.SetValue(*sq); des.SetVLToUndefined(); dataset.Insert(des); } void GDCMImageIO::Write(const void *buffer) { std::ofstream file; if ( !this->OpenGDCMFileForWriting( file, m_FileName.c_str() ) ) { return; } file.close(); // global static: gdcm::UIDGenerator::SetRoot( m_UIDPrefix.c_str() ); // echo "ITK" | od -b gdcm::FileMetaInformation::AppendImplementationClassUID("111.124.113"); const std::string project_name = std::string("GDCM/ITK ") + itk::Version::GetITKVersion(); gdcm::FileMetaInformation::SetSourceApplicationEntityTitle( project_name.c_str() ); gdcm::ImageWriter writer; gdcm::FileMetaInformation & fmi = writer.GetFile().GetHeader(); gdcm::DataSet & header = writer.GetFile().GetDataSet(); gdcm::Global & g = gdcm::Global::GetInstance(); const gdcm::Dicts & dicts = g.GetDicts(); const gdcm::Dict & pubdict = dicts.GetPublicDict(); std::string value; MetaDataDictionary & dict = this->GetMetaDataDictionary(); gdcm::Tag tag; //Smarter approach using real iterators itk::MetaDataDictionary::ConstIterator itr = dict.Begin(); itk::MetaDataDictionary::ConstIterator end = dict.End(); gdcm::StringFilter sf; sf.SetFile( writer.GetFile() ); while ( itr != end ) { const std::string & key = itr->first; //Needed for bcc32 // Convert DICOM name to DICOM (group,element) bool b = tag.ReadFromPipeSeparatedString( key.c_str() ); // Anything that has been changed in the MetaData Dict will be pushed // into the DICOM header: if ( b /*tag != gdcm::Tag(0xffff,0xffff)*/ /*dictEntry*/ ) { const gdcm::DictEntry & dictEntry = pubdict.GetDictEntry(tag); gdcm::VR::VRType vrtype = dictEntry.GetVR(); if ( dictEntry.GetVR() == gdcm::VR::SQ ) { // Insert sequence into data set ReadSequenceElement(dict, key, tag, header, fmi); } else { ReadElement(dict, tag, key, header, fmi); } } else { // This is not a DICOM entry, then check if it is one of the // ITK standard ones if ( key == ITK_NumberOfDimensions ) { unsigned int numberOfDimensions = 0; ExposeMetaData< unsigned int >(dict, key, numberOfDimensions); m_GlobalNumberOfDimensions = numberOfDimensions; m_Origin.resize(m_GlobalNumberOfDimensions); m_Spacing.resize(m_GlobalNumberOfDimensions); m_Direction.resize(m_GlobalNumberOfDimensions); for (unsigned int i = 0; i < m_GlobalNumberOfDimensions; i++) { m_Direction[i].resize(m_GlobalNumberOfDimensions); } } else if ( key == ITK_Origin ) { typedef Array< double > DoubleArrayType; DoubleArrayType originArray; ExposeMetaData< DoubleArrayType >(dict, key, originArray); m_Origin[0] = originArray[0]; m_Origin[1] = originArray[1]; m_Origin[2] = originArray[2]; } else if ( key == ITK_Spacing ) { typedef Array< double > DoubleArrayType; DoubleArrayType spacingArray; ExposeMetaData< DoubleArrayType >(dict, key, spacingArray); m_Spacing[0] = spacingArray[0]; m_Spacing[1] = spacingArray[1]; m_Spacing[2] = spacingArray[2]; } else if( key == ITK_ZDirection ) { typedef Matrix< double > DoubleMatrixType; DoubleMatrixType directionMatrix; ExposeMetaData< DoubleMatrixType >( dict, key, directionMatrix ); for(int i = 0; i<3; i++) { for(int j = 0; j<3; j++) { m_Direction[i][j]=directionMatrix[i][j]; } } } else { itkDebugMacro( << "GDCMImageIO: non-DICOM and non-ITK standard key = " << key); } } ++itr; } //std::cout << header << std::endl; //this->SetNumberOfDimensions(3); //gdcm::Image &image = writer.GetImage(); gdcm::SmartPointer< gdcm::Image > simage = new gdcm::Image; gdcm::Image & image = *simage; image.SetNumberOfDimensions(2); // good default image.SetDimension(0, static_cast(m_Dimensions[0])); image.SetDimension(1, static_cast(m_Dimensions[1])); //image.SetDimension(2, m_Dimensions[2] ); image.SetSpacing(0, m_Spacing[0]); image.SetSpacing(1, m_Spacing[1]); if ( m_NumberOfDimensions > 2 && m_Dimensions[2] != 1 ) { image.SetSpacing(2, m_Spacing[2]); } // Set the origin (image position patient) // If the meta dictionary contains the tag "0020 0032", use it std::string tempString; const bool hasIPP = ExposeMetaData(dict,"0020|0032",tempString); if( hasIPP) { double origin3D[3]; sscanf(tempString.c_str(), "%lf\\%lf\\%lf", &(origin3D[0]), &(origin3D[1]), &(origin3D[2]) ); image.SetOrigin(0, origin3D[0]); image.SetOrigin(1, origin3D[1]); image.SetOrigin(2, origin3D[2]); } else { image.SetOrigin(0, m_Origin[0]); image.SetOrigin(1, m_Origin[1]); if ( m_Origin.size() == 3 ) { image.SetOrigin(2, m_Origin[2]); } else { image.SetOrigin(2, 0); } } if ( m_NumberOfDimensions > 2 && m_Dimensions[2] != 1 ) { // resize num of dim to 3: image.SetNumberOfDimensions(3); image.SetDimension(2, static_cast(m_Dimensions[2])); } // Do the direction now: // if the meta dictionary contains the tag "0020 0037", use it const bool hasIOP = ExposeMetaData(dict, "0020|0037",tempString); if (hasIOP) { double directions[6]; sscanf(tempString.c_str(), "%lf\\%lf\\%lf\\%lf\\%lf\\%lf", &(directions[0]), &(directions[1]), &(directions[2]),&(directions[3]),&(directions[4]),&(directions[5])); image.SetDirectionCosines(0, directions[0]); image.SetDirectionCosines(1, directions[1]); image.SetDirectionCosines(2, directions[2]); image.SetDirectionCosines(3, directions[3]); image.SetDirectionCosines(4, directions[4]); image.SetDirectionCosines(5, directions[5]); } else { image.SetDirectionCosines(0, m_Direction[0][0]); image.SetDirectionCosines(1, m_Direction[0][1]); if ( m_Direction.size() == 3 ) { image.SetDirectionCosines(2, m_Direction[0][2]); } else { image.SetDirectionCosines(2, 0); } image.SetDirectionCosines(3, m_Direction[1][0]); image.SetDirectionCosines(4, m_Direction[1][1]); if ( m_Direction.size() == 3 ) { image.SetDirectionCosines(5, m_Direction[1][2]); } else { image.SetDirectionCosines(5, 0); } } // reset any previous value: m_RescaleSlope = 1.0; m_RescaleIntercept = 0.0; // Get user defined rescale slope/intercept std::string rescaleintercept; ExposeMetaData< std::string >(dict, "0028|1052", rescaleintercept); std::string rescaleslope; ExposeMetaData< std::string >(dict, "0028|1053", rescaleslope); if ( rescaleintercept != "" && rescaleslope != "" ) { itksys_ios::stringstream sstr1; sstr1 << rescaleintercept; if ( !( sstr1 >> m_RescaleIntercept ) ) { itkExceptionMacro("Problem reading RescaleIntercept: " << rescaleintercept); } itksys_ios::stringstream sstr2; sstr2 << rescaleslope; if ( !( sstr2 >> m_RescaleSlope ) ) { itkExceptionMacro("Problem reading RescaleSlope: " << rescaleslope); } // header->InsertValEntry( "US", 0x0028, 0x1054 ); // Rescale Type } else if ( rescaleintercept != "" || rescaleslope != "" ) // xor { itkExceptionMacro("Both RescaleSlope & RescaleIntercept need to be present"); } // Handle the bitDepth: std::string bitsAllocated; std::string bitsStored; std::string highBit; std::string pixelRep; // Get user defined bit representation: ExposeMetaData< std::string >(dict, "0028|0100", bitsAllocated); ExposeMetaData< std::string >(dict, "0028|0101", bitsStored); ExposeMetaData< std::string >(dict, "0028|0102", highBit); ExposeMetaData< std::string >(dict, "0028|0103", pixelRep); gdcm::PixelFormat pixeltype = gdcm::PixelFormat::UNKNOWN; switch ( this->GetComponentType() ) { case ImageIOBase::CHAR: pixeltype = gdcm::PixelFormat::INT8; break; case ImageIOBase::UCHAR: pixeltype = gdcm::PixelFormat::UINT8; break; case ImageIOBase::SHORT: pixeltype = gdcm::PixelFormat::INT16; break; case ImageIOBase::USHORT: pixeltype = gdcm::PixelFormat::UINT16; break; case ImageIOBase::INT: pixeltype = gdcm::PixelFormat::INT32; break; case ImageIOBase::UINT: pixeltype = gdcm::PixelFormat::UINT32; break; //Disabling FLOAT and DOUBLE for now... case ImageIOBase::FLOAT: pixeltype = gdcm::PixelFormat::FLOAT32; break; case ImageIOBase::DOUBLE: pixeltype = gdcm::PixelFormat::FLOAT64; break; default: itkExceptionMacro(<< "DICOM does not support this component type"); } itkAssertInDebugAndIgnoreInReleaseMacro(pixeltype != gdcm::PixelFormat::UNKNOWN); gdcm::PhotometricInterpretation pi; if ( this->GetNumberOfComponents() == 1 ) { pi = gdcm::PhotometricInterpretation::MONOCHROME2; } else if ( this->GetNumberOfComponents() == 3 ) { pi = gdcm::PhotometricInterpretation::RGB; // (0028,0006) US 0 #2, 1 // PlanarConfiguration } else { itkExceptionMacro(<< "DICOM does not support this component type"); } pixeltype.SetSamplesPerPixel( static_cast( this->GetNumberOfComponents() ) ); // Compute the outpixeltype gdcm::PixelFormat outpixeltype = gdcm::PixelFormat::UNKNOWN; if ( pixeltype == gdcm::PixelFormat::FLOAT32 || pixeltype == gdcm::PixelFormat::FLOAT64 ) { if ( bitsAllocated != "" && bitsStored != "" && highBit != "" && pixelRep != "" ) { outpixeltype.SetBitsAllocated( static_cast(atoi( bitsAllocated.c_str() ) )); outpixeltype.SetBitsStored( static_cast(atoi( bitsStored.c_str() )) ); outpixeltype.SetHighBit( static_cast(atoi( highBit.c_str()) ) ); outpixeltype.SetPixelRepresentation( static_cast(atoi( pixelRep.c_str() )) ); if ( this->GetNumberOfComponents() != 1 ) { itkExceptionMacro(<< "Sorry Dave I can't do that"); } itkAssertInDebugAndIgnoreInReleaseMacro(outpixeltype != gdcm::PixelFormat::UNKNOWN); } else { itkExceptionMacro(<< "A Floating point buffer was passed but the stored pixel type was not specified." "This is currently not supported"); } } image.SetPhotometricInterpretation(pi); if ( outpixeltype != gdcm::PixelFormat::UNKNOWN ) { image.SetPixelFormat(outpixeltype); } else { image.SetPixelFormat(pixeltype); } SizeValueType len = image.GetBufferLength(); size_t numberOfBytes = this->GetImageSizeInBytes(); gdcm::DataElement pixeldata( gdcm::Tag(0x7fe0, 0x0010) ); // Handle rescaler here: // Whenever shift / scale is needed... do it ! if( outpixeltype != gdcm::PixelFormat::UNKNOWN ) { itkAssertInDebugAndIgnoreInReleaseMacro( m_RescaleIntercept != 0 || m_RescaleSlope != 1 ); // rescale from float to unsigned short gdcm::Rescaler ir; ir.SetIntercept(m_RescaleIntercept); ir.SetSlope(m_RescaleSlope); ir.SetPixelFormat(pixeltype); ir.SetMinMaxForPixelType( static_cast(outpixeltype.GetMin()), static_cast(outpixeltype.GetMax()) ); image.SetIntercept(m_RescaleIntercept); image.SetSlope(m_RescaleSlope); char *copy = new char[len]; ir.InverseRescale(copy, (char *)buffer, numberOfBytes); pixeldata.SetByteValue(copy, static_cast(len)); delete[] copy; } else { itkAssertInDebugAndIgnoreInReleaseMacro(len == numberOfBytes); // only do a straight copy: pixeldata.SetByteValue( (char *)buffer, static_cast(numberOfBytes) ); } image.SetDataElement(pixeldata); // Handle compression here: // If user ask to use compression: if ( m_UseCompression ) { gdcm::ImageChangeTransferSyntax change; if ( m_CompressionType == JPEG ) { change.SetTransferSyntax(gdcm::TransferSyntax::JPEGLosslessProcess14_1); } else if ( m_CompressionType == JPEG2000 ) { change.SetTransferSyntax(gdcm::TransferSyntax::JPEG2000Lossless); } else { itkExceptionMacro(<< "Unknown compression type"); } change.SetInput(image); bool b = change.Change(); if ( !b ) { itkExceptionMacro(<< "Could not change the Transfer Syntax for Compression"); } writer.SetImage( change.GetOutput() ); } else { writer.SetImage(image); } if ( !m_KeepOriginalUID ) { // UID generation part: // We only create *ONE* Study/Series.Frame of Reference Instance UID if ( m_StudyInstanceUID.empty() ) { // As long as user maintain there gdcmIO they will keep the same // Study/Series instance UID. gdcm::UIDGenerator uid; m_StudyInstanceUID = uid.Generate(); m_SeriesInstanceUID = uid.Generate(); m_FrameOfReferenceInstanceUID = uid.Generate(); } //std::string uid = uid.Generate(); const char *studyuid = m_StudyInstanceUID.c_str(); { gdcm::DataElement de( gdcm::Tag(0x0020, 0x000d) ); // Study de.SetByteValue( studyuid, static_cast(strlen(studyuid)) ); de.SetVR( gdcm::Attribute< 0x0020, 0x000d >::GetVR() ); header.Insert(de); } const char *seriesuid = m_SeriesInstanceUID.c_str(); { gdcm::DataElement de( gdcm::Tag(0x0020, 0x000e) ); // Series de.SetByteValue( seriesuid, static_cast(strlen(seriesuid)) ); de.SetVR( gdcm::Attribute< 0x0020, 0x000e >::GetVR() ); header.Insert(de); } const char *frameofreferenceuid = m_FrameOfReferenceInstanceUID.c_str(); { gdcm::DataElement de( gdcm::Tag(0x0020, 0x0052) ); // Frame of Reference de.SetByteValue( frameofreferenceuid, static_cast(strlen( frameofreferenceuid)) ); de.SetVR( gdcm::Attribute< 0x0020, 0x0052 >::GetVR() ); header.Insert(de); } } if ( image.GetTransferSyntax() != gdcm::TransferSyntax::ImplicitVRLittleEndian ) { gdcm::FileExplicitFilter fef; //fef.SetChangePrivateTags( true ); fef.SetFile( writer.GetFile() ); if ( !fef.Change() ) { itkExceptionMacro(<< "Failed to change to Explicit Transfer Syntax"); } } const char *filename = m_FileName.c_str(); writer.SetFileName(filename); if ( !writer.Write() ) { itkExceptionMacro(<< "DICOM does not support this component type"); } } #if defined( ITKIO_DEPRECATED_GDCM1_API ) // Convenience methods to query patient and scanner information. These // methods are here for compatibility with the DICOMImageIO2 class. void GDCMImageIO::GetPatientName(char *name) { MetaDataDictionary & dict = this->GetMetaDataDictionary(); ExposeMetaData< std::string >(dict, "0010|0010", m_PatientName); strcpy ( name, m_PatientName.c_str() ); } void GDCMImageIO::GetPatientID(char *name) { MetaDataDictionary & dict = this->GetMetaDataDictionary(); ExposeMetaData< std::string >(dict, "0010|0020", m_PatientID); strcpy ( name, m_PatientID.c_str() ); } void GDCMImageIO::GetPatientSex(char *name) { MetaDataDictionary & dict = this->GetMetaDataDictionary(); ExposeMetaData< std::string >(dict, "0010|0040", m_PatientSex); strcpy ( name, m_PatientSex.c_str() ); } void GDCMImageIO::GetPatientAge(char *name) { MetaDataDictionary & dict = this->GetMetaDataDictionary(); ExposeMetaData< std::string >(dict, "0010|1010", m_PatientAge); strcpy ( name, m_PatientAge.c_str() ); } void GDCMImageIO::GetStudyID(char *name) { MetaDataDictionary & dict = this->GetMetaDataDictionary(); ExposeMetaData< std::string >(dict, "0020|0010", m_StudyID); strcpy ( name, m_StudyID.c_str() ); } void GDCMImageIO::GetPatientDOB(char *name) { MetaDataDictionary & dict = this->GetMetaDataDictionary(); ExposeMetaData< std::string >(dict, "0010|0030", m_PatientDOB); strcpy ( name, m_PatientDOB.c_str() ); } void GDCMImageIO::GetStudyDescription(char *name) { MetaDataDictionary & dict = this->GetMetaDataDictionary(); ExposeMetaData< std::string >(dict, "0008|1030", m_StudyDescription); strcpy ( name, m_StudyDescription.c_str() ); } void GDCMImageIO::GetBodyPart(char *name) { MetaDataDictionary & dict = this->GetMetaDataDictionary(); ExposeMetaData< std::string >(dict, "0018|0015", m_BodyPart); strcpy ( name, m_BodyPart.c_str() ); } void GDCMImageIO::GetNumberOfSeriesInStudy(char *name) { MetaDataDictionary & dict = this->GetMetaDataDictionary(); ExposeMetaData< std::string >(dict, "0020|1000", m_NumberOfSeriesInStudy); strcpy ( name, m_NumberOfSeriesInStudy.c_str() ); } void GDCMImageIO::GetNumberOfStudyRelatedSeries(char *name) { MetaDataDictionary & dict = this->GetMetaDataDictionary(); ExposeMetaData< std::string >(dict, "0020|1206", m_NumberOfStudyRelatedSeries); strcpy ( name, m_NumberOfStudyRelatedSeries.c_str() ); } void GDCMImageIO::GetStudyDate(char *name) { MetaDataDictionary & dict = this->GetMetaDataDictionary(); ExposeMetaData< std::string >(dict, "0008|0020", m_StudyDate); strcpy ( name, m_StudyDate.c_str() ); } void GDCMImageIO::GetModality(char *name) { MetaDataDictionary & dict = this->GetMetaDataDictionary(); ExposeMetaData< std::string >(dict, "0008|0060", m_Modality); strcpy ( name, m_Modality.c_str() ); } void GDCMImageIO::GetManufacturer(char *name) { MetaDataDictionary & dict = this->GetMetaDataDictionary(); ExposeMetaData< std::string >(dict, "0008|0070", m_Manufacturer); strcpy ( name, m_Manufacturer.c_str() ); } void GDCMImageIO::GetInstitution(char *name) { MetaDataDictionary & dict = this->GetMetaDataDictionary(); ExposeMetaData< std::string >(dict, "0008|0080", m_Institution); strcpy ( name, m_Institution.c_str() ); } void GDCMImageIO::GetModel(char *name) { MetaDataDictionary & dict = this->GetMetaDataDictionary(); ExposeMetaData< std::string >(dict, "0008|1090", m_Model); strcpy ( name, m_Model.c_str() ); } void GDCMImageIO::GetScanOptions(char *name) { MetaDataDictionary & dict = this->GetMetaDataDictionary(); ExposeMetaData< std::string >(dict, "0018|0022", m_ScanOptions); strcpy ( name, m_ScanOptions.c_str() ); } #endif bool GDCMImageIO::GetValueFromTag(const std::string & tag, std::string & value) { MetaDataDictionary & dict = this->GetMetaDataDictionary(); std::string tag_lower = tag; std::transform( tag_lower.begin(), tag_lower.end(), tag_lower.begin(), static_cast( ::tolower ) ); return ExposeMetaData< std::string >(dict, tag_lower, value); } bool GDCMImageIO::GetLabelFromTag(const std::string & tag, std::string & labelId) { gdcm::Tag t; if ( t.ReadFromPipeSeparatedString( tag.c_str() ) && t.IsPublic() ) { const gdcm::Global & g = gdcm::Global::GetInstance(); const gdcm::Dicts & dicts = g.GetDicts(); const gdcm::DictEntry & entry = dicts.GetDictEntry(t); labelId = entry.GetName(); return true; } return false; } void GDCMImageIO::PrintSelf(std::ostream & os, Indent indent) const { Superclass::PrintSelf(os, indent); os << indent << "Internal Component Type: " << this->GetComponentTypeAsString(m_InternalComponentType) << std::endl; os << indent << "RescaleSlope: " << m_RescaleSlope << std::endl; os << indent << "RescaleIntercept: " << m_RescaleIntercept << std::endl; os << indent << "KeepOriginalUID:" << ( m_KeepOriginalUID ? "On" : "Off" ) << std::endl; os << indent << "LoadPrivateTags:" << ( m_LoadPrivateTags ? "On" : "Off" ) << std::endl; os << indent << "UIDPrefix: " << m_UIDPrefix << std::endl; os << indent << "StudyInstanceUID: " << m_StudyInstanceUID << std::endl; os << indent << "SeriesInstanceUID: " << m_SeriesInstanceUID << std::endl; os << indent << "FrameOfReferenceInstanceUID: " << m_FrameOfReferenceInstanceUID << std::endl; os << indent << "CompressionType:" << m_CompressionType << std::endl; #if defined( ITKIO_DEPRECATED_GDCM1_API ) os << indent << "Patient Name:" << m_PatientName << std::endl; os << indent << "Patient ID:" << m_PatientID << std::endl; os << indent << "Patient Sex:" << m_PatientSex << std::endl; os << indent << "Patient Age:" << m_PatientAge << std::endl; os << indent << "Study ID:" << m_StudyID << std::endl; os << indent << "Patient DOB:" << m_PatientDOB << std::endl; os << indent << "Study Description:" << m_StudyDescription << std::endl; os << indent << "Body Part:" << m_BodyPart << std::endl; os << indent << "Number Of Series In Study:" << m_NumberOfSeriesInStudy << std::endl; os << indent << "Number Of Study Related Series:" << m_NumberOfStudyRelatedSeries << std::endl; os << indent << "Study Date:" << m_StudyDate << std::endl; os << indent << "Modality:" << m_Modality << std::endl; os << indent << "Manufacturer:" << m_Manufacturer << std::endl; os << indent << "Institution Name:" << m_Institution << std::endl; os << indent << "Model:" << m_Model << std::endl; os << indent << "Scan Options:" << m_ScanOptions << std::endl; #endif } } // end namespace itk -------------- next part -------------- A non-text attachment was scrubbed... Name: itkGDCMImageIO.h Type: text/x-chdr Size: 12405 bytes Desc: not available URL: From aharr8 at uwo.ca Fri Mar 10 16:02:14 2017 From: aharr8 at uwo.ca (Andrew Harris) Date: Fri, 10 Mar 2017 16:02:14 -0500 Subject: [ITK-users] [ITK] SetCenter() example for VersorRigid3DTransform Message-ID: Hello, I'm trying to set the center of rotation for a VersorRigid3DTransform to the middle of a 3D image in two dimensions and the top in the third. I have as of yet been unable to find an example in the wiki of doing this. The only example I've found appears to use a CenteredTransformInitializer to set the center of rotation to the center of the image. Is there an example of setting the center elsewhere, or if not, can someone provide me the syntax I would use? -- AH ----------------------------------------------------------------------------------------------- *This email and any attachments thereto may contain private, confidential, and privileged materials for the sole use of the intended recipient. Any reviewing, copying, or distribution of this email (or any attachments thereto) by other than the intended recipient is strictly prohibited. If you are not the intended recipient, please contact the sender immediately and permanently destroy this email and any attachments thereto.* -------------- next part -------------- An HTML attachment was scrubbed... URL: From asertyuio at yahoo.fr Fri Mar 10 16:52:30 2017 From: asertyuio at yahoo.fr (asertyuio) Date: Fri, 10 Mar 2017 22:52:30 +0100 Subject: [ITK-users] cmake error when configuring ITK with the variational registration module Message-ID: Hi all, Each time I include the variational registration module, I get the following error while configuring with ccmake : ``` # Insight Journal Handle: https://hdl.handle.net/10380/3460 # Contact: Alexander Schmidt-Richberg # Jan Ehrhardt # Rene Werner itk_fetch_module(VariationalRegistration "A module to perform variational image registration. https://hdl.handle.net/10380/3460" GIT_REPOSITORY ${git_protocol}://github.com/InsightSoftwareConsortium/ITKVariationalRegistration.git GIT_TAG 5110f1b4304f450b46bbbaf0f3818a4bac65b154 ) ``` I'm using the master branch in git as a version of ITK. Seems like a bug... Any idea ? Yann From dzenanz at gmail.com Fri Mar 10 17:57:21 2017 From: dzenanz at gmail.com (=?UTF-8?B?RMW+ZW5hbiBadWtpxIc=?=) Date: Fri, 10 Mar 2017 17:57:21 -0500 Subject: [ITK-users] [ITK-dev] [ANN] ITK 4.11 Release Candidate 2 is ready for testing! In-Reply-To: References: Message-ID: The final version was released this week. ITK compiles, but one of the tests crashes in Release mode. I submitted the bug . On Mon, Jan 30, 2017 at 2:21 PM, Taylor Braun-Jones wrote: > Confirmed on my end as well. Thanks for following up. > > On Sun, Jan 29, 2017 at 4:41 PM, D?enan Zuki? wrote: > >> RC3 got released on Friday, and it builds ITK without issue! >> >> On Thu, Jan 19, 2017 at 5:00 PM, Taylor Braun-Jones < >> taylor at braun-jones.org> wrote: >> >>> Cool, thanks D?enan! >>> >>> On Thu, Jan 19, 2017 at 2:14 PM, D?enan Zuki? wrote: >>> >>>> ... and more: >>>> >>>> Additionally, we've added ITK and VTK libraries from GitHub to our >>>> daily compiler testing and validations. So in short, from now on we will be >>>> releasing MSVC compiler versions to the public where live GitHub ITK and >>>> VTK sources will build clean. That's a promise :). >>>> >>>> Thanks, >>>> Ulzii Luvsanbat >>>> Visual C++ Team >>>> >>>> On Thu, Jan 19, 2017 at 1:21 PM, D?enan Zuki? >>>> wrote: >>>> >>>>> A new reply in that bug report: >>>>> >>>>> Hi, there's a lag when we, the compiler team, tags the bug resolved >>>>> and the fix actually gets included in the VS release. We apologize for >>>>> that, it's just the way how engineering works to get everything ready in VS >>>>> to be shipped. This specific bug has been fixed for the VS2017 RC3 release, >>>>> which is only days away from shipping. >>>>> >>>>> If you'd you like to validate your project before that with a private >>>>> Nuget package of the compiler toolset, then please send me an email here >>>>> (batul at Microsoft dot com), and I can get you going. >>>>> >>>>> On Thu, Jan 19, 2017 at 12:46 PM, D?enan Zuki? >>>>> wrote: >>>>> >>>>>> Hi Taylor, >>>>>> >>>>>> I submitted a bug >>>>>> >>>>>> report to Microsoft about it, and somebody said they will add ITK to their >>>>>> compiler test suite. Also, that crashing bug was supposedly fixed for >>>>>> "final release". >>>>>> >>>>>> Regards, >>>>>> D?enan >>>>>> >>>>>> On Thu, Jan 19, 2017 at 12:18 PM, Taylor Braun-Jones < >>>>>> taylor at braun-jones.org> wrote: >>>>>> >>>>>>> Any chance the 4.11 release could have at least some preliminary >>>>>>> support for VS2017? Right now it crashes the compiler: >>>>>>> >>>>>>> C:\src\itk\modules\core\common\include\itkPromoteType.h(97): fatal >>>>>>> error C1001: An internal error has occurred in the compiler. >>>>>>> (compiler file 'msc1.cpp', line 1469) >>>>>>> To work around this problem, try simplifying or changing the >>>>>>> program near the locations listed above. >>>>>>> Please choose the Technical Support command on the Visual C++ >>>>>>> Help menu, or open the Technical Support help file for more >>>>>>> information >>>>>>> Internal Compiler Error in C:\PROGRA~2\MIB055~1\2017\COMM >>>>>>> UN~1\VC\Tools\MSVC\1410~1.247\bin\HostX64\x64\cl.exe. You will be >>>>>>> prompted to send an error report to Microsoft later. >>>>>>> INTERNAL COMPILER ERROR in 'C:\PROGRA~2\MIB055~1\2017\COM >>>>>>> MUN~1\VC\Tools\MSVC\1410~1.247\bin\HostX64\x64\cl.exe' >>>>>>> Please choose the Technical Support command on the Visual C++ >>>>>>> Help menu, or open the Technical Support help file for more >>>>>>> information >>>>>>> >>>>>>> Taylor >>>>>>> >>>>>>> On Mon, Jan 16, 2017 at 4:18 PM, Matt McCormick < >>>>>>> matt.mccormick at kitware.com> wrote: >>>>>>> >>>>>>>> On behalf of the Insight Toolkit community, we are proud to announce >>>>>>>> that ITK 4.11 release candidate 2 has been tagged and is available >>>>>>>> for >>>>>>>> testing! Please take this opportunity to test the new features in >>>>>>>> the >>>>>>>> release candidate. >>>>>>>> >>>>>>>> >>>>>>>> To obtain the source code, use the links: >>>>>>>> >>>>>>>> >>>>>>>> https://github.com/Kitware/ITK/archive/v4.11rc02.zip >>>>>>>> https://github.com/Kitware/ITK/archive/v4.11rc02.tar.gz >>>>>>>> >>>>>>>> or >>>>>>>> >>>>>>>> git clone https://itk.org/ITK.git >>>>>>>> cd ITK >>>>>>>> git checkout -q --detach v4.11rc02 >>>>>>>> >>>>>>>> For more details, please see the Git documentation [1]. >>>>>>>> >>>>>>>> >>>>>>>> A few selected highlights for this release: >>>>>>>> >>>>>>>> - Remote Modules were added to: perturb mesh vertices with >>>>>>>> additive >>>>>>>> gaussian noise, accurately benchmark computational performance, >>>>>>>> perform principal components analysis of scalar, vector, and mesh >>>>>>>> vertex data, create a run-length encoded memory compression scheme >>>>>>>> for >>>>>>>> itk::Image, run N-D morphological contour interpolation, interpolate >>>>>>>> multi-label images, iterate over multiple images simultaneously, and >>>>>>>> compute inverse displacement fields. >>>>>>>> - NumPy bridge support is now enabled by default with NumPy array >>>>>>>> views of multi-component images and VNL vectors and matrices. >>>>>>>> - Internal HDF5 was updated to the latest upstream version along >>>>>>>> with a number of other third-party libraries. >>>>>>>> >>>>>>>> >>>>>>>> This release introduces a new template class export specification >>>>>>>> macro, ITK_TEMPLATE_EXPORT. The macro should be used with templated >>>>>>>> classes to address failing dynamic_cast's and exception catching >>>>>>>> across binaries on Mac OSX. >>>>>>>> >>>>>>>> Bugs were addressed and improvements were made to how the >>>>>>>> pseudo-random number generator is used. Tests that rely on the >>>>>>>> random >>>>>>>> number generator should explicitly set the global seed at start: >>>>>>>> >>>>>>>> itk::Statistics::MersenneTwisterRandomVariateGenerator::GetI >>>>>>>> nstance()->SetSeed( >>>>>>>> 121212 ); >>>>>>>> >>>>>>>> To improve randomness, new instances of the generator start from a >>>>>>>> different seed; some minor differences in the output of algorithms >>>>>>>> that uses the generator, like mutual information metrics, should be >>>>>>>> expected. >>>>>>>> >>>>>>>> Additionally, output may change for registration with composite >>>>>>>> affine >>>>>>>> transforms; the v4 registration framework now uses corner sampling >>>>>>>> as >>>>>>>> opposed to random sampling to estimate their parameter scales. >>>>>>>> >>>>>>>> >>>>>>>> Please test the release candidate and share your experiences on the >>>>>>>> mailing list, issue tracker, and Gerrit Code Review. >>>>>>>> >>>>>>>> >>>>>>>> An Experimental build, which demonstrates how the test suite >>>>>>>> performs >>>>>>>> on your local build system, can be submitted to the dashboard [2] >>>>>>>> with: >>>>>>>> >>>>>>>> mkdir ../ITK-build >>>>>>>> cd ../ITK-build >>>>>>>> cmake ../ITK >>>>>>>> ctest -j 4 -M Experimental -T Configure -T Build -T Test -T >>>>>>>> Submit >>>>>>>> >>>>>>>> Visual Studio builds must also add ?-C Release? to the ctest >>>>>>>> command. >>>>>>>> >>>>>>>> Notify the mailing list if there are any unexpected failures. >>>>>>>> Testing >>>>>>>> your own applications against the RC is also appreciated. >>>>>>>> >>>>>>>> >>>>>>>> Congratulations to the 31 contributors to this release. We would >>>>>>>> especially like to recognize the new contributors: Hastings Greer, >>>>>>>> Gilles Filippini, Thien Nguyen, Caspar Goch, Mayeul Chassagnard, >>>>>>>> Somesh Kashyap, Simon Rit, Pierre Barbier de Reuille, and Maeliss >>>>>>>> Jallais. >>>>>>>> >>>>>>>> >>>>>>>> The 4.11.0 final release is scheduled for January 23rd. >>>>>>>> >>>>>>>> >>>>>>>> [1] http://www.itk.org/Wiki/ITK/Git >>>>>>>> >>>>>>>> [2] http://open.cdash.org/index.php?project=Insight >>>>>>>> >>>>>>>> >>>>>>>> New Features >>>>>>>> ------------ >>>>>>>> >>>>>>>> * Wrapping Improvements >>>>>>>> - Python GetArrayFromImage() and GetImageFromArray() from >>>>>>>> ITKBridgeNumPy are directly accessible from the Python itk >>>>>>>> namespace. >>>>>>>> - The itk package loads much faster: individual modules are loaded >>>>>>>> only when required. >>>>>>>> - Conversion of ITK images from and to NumPy array using Bridge >>>>>>>> NumPy supports RGB, RGBA, and Vector images. >>>>>>>> - VNL vectors and VNL matrices can be converted from and to NumPy >>>>>>>> objects with respectively the new couple of functions >>>>>>>> GetArrayFromVnlVector()/GetVnlVectorFromArray() and >>>>>>>> GetArrayFromVnlMatrix()/GetVnlMatrixFromArray() >>>>>>>> - The global timestamp is used across all ITK Python modules when >>>>>>>> built statically >>>>>>>> - Wrap additional classes such as KernelFunctionBase >>>>>>>> - itk_python_add_test CMake function added for Python script >>>>>>>> testing >>>>>>>> in ITK modules >>>>>>>> >>>>>>>> * New Remote Modules >>>>>>>> - DVMeshNoise >>>>>>>> - Perturbing mesh vertices with additive gaussian noise >>>>>>>> - http://hdl.handle.net/10380/3567 >>>>>>>> - PerformanceBenchmarking >>>>>>>> - Accurate benchmarking of computational performance >>>>>>>> - http://hdl.handle.net/10380/3557 >>>>>>>> - PrincipalComponentsAnalysis >>>>>>>> - Principal components analysis of scalar, vector, and mesh >>>>>>>> vertex data >>>>>>>> - http://hdl.handle.net/10380/3386 >>>>>>>> - RLEImage >>>>>>>> - Run-length encoded memory compression scheme for itk::Image >>>>>>>> - http://hdl.handle.net/10380/3562 >>>>>>>> - MorphologicalContourInterpolation >>>>>>>> - N-D morphological contour interpolation >>>>>>>> - http://hdl.handle.net/10380/3563 >>>>>>>> - GenericLabelInterpolator >>>>>>>> - A generic interpolator for multi-label images >>>>>>>> - http://hdl.handle.net/10380/3506 >>>>>>>> - MultipleImageIterator >>>>>>>> - Iterate over multiple images simultaneously >>>>>>>> - http://hdl.handle.net/10380/3455 >>>>>>>> - FixedPointInverseDisplacementField >>>>>>>> - Computes inverse displacement field >>>>>>>> - http://hdl.handle.net/10380/3222 >>>>>>>> >>>>>>>> * Core Improvements >>>>>>>> - New ITK_TEMPLATE_EXPORT for templated classes resolves >>>>>>>> cross-binary dynamic_cast on Mac OSX >>>>>>>> - New MersenneTwisterRandomVariateGenerator instances are >>>>>>>> initialized with different seeds >>>>>>>> - Use compiler feature detection in CMake for C++11 features, etc. >>>>>>>> - New CMake macro itk_module_add_library for creating libraries >>>>>>>> in ITK modules >>>>>>>> - Improved support for ccache and distcc with >>>>>>>> CMAKE__COMPILER_LAUNCHER (CMake >=3.4 required) >>>>>>>> - Support for .sha512 ExternalData content links >>>>>>>> - GitHub Pages and data.kitware.com ExternalData repositories >>>>>>>> added >>>>>>>> - GPGPU system support for C++11 >>>>>>>> - Support of new compilers: Visual Studio 15 and XCode 8.2.1 >>>>>>>> (clang-800.0.42.1) >>>>>>>> >>>>>>>> * Filtering Improvements >>>>>>>> - HessianToObjectnessMeasure moved out of the ITKReview module >>>>>>>> - New UnsharpMaskImageFilter for image edge enhancement >>>>>>>> >>>>>>>> * IO Improvements >>>>>>>> - TransformFactory class has been moved to a separate module >>>>>>>> - Spline order added to BSplineTransform identifier >>>>>>>> - Improved NIFTI orientation support >>>>>>>> >>>>>>>> * Documentation Improvements >>>>>>>> - Updates to the Software Guide, Doxygen, Wiki and Sphinx Examples >>>>>>>> >>>>>>>> * Third Party Library Updates >>>>>>>> - pygccxml updated to v1.8.0 >>>>>>>> - VNL updated to latest upstream (2016.07.06) >>>>>>>> - SWIG updated to v3.0.11 >>>>>>>> - KWSys updated to latest upstream (2016.11.21) >>>>>>>> - HDF5 updated to v1.8.17 >>>>>>>> - SCIFIO updated to latest upstream (2016.12.01) >>>>>>>> - DCMTK updated to 3.6.1_20121012 >>>>>>>> - CastXML to latest upstream (2016.01.28) >>>>>>>> >>>>>>>> * Improved Code Coverage -- we are at 85.44%! >>>>>>>> - Jon Haitz-Legarreta's extensive code coverage improvements >>>>>>>> - https://blog.kitware.com/why-should-we-spend-time-writing-te >>>>>>>> sts/ >>>>>>>> >>>>>>>> * *Lots* of important bug fixes >>>>>>>> >>>>>>>> * And much more! See details in the log below. >>>>>>>> >>>>>>>> >>>>>>>> Changes from v4.11rc01 to v4.11rc02 >>>>>>>> ----------------------------------- >>>>>>>> >>>>>>>> Bradley Lowekamp (5): >>>>>>>> BUG: Remove unused SimpleImageRegistrationTest baselines >>>>>>>> ENH: Expose GetNextSeed method in MersenneTwiseter Generator >>>>>>>> BUG: Add option for fixed seed or wall clock seed for sampling >>>>>>>> BUG: Use metric random seed in v3 examples >>>>>>>> BUG: Prefer setting seed at algorithm in "v4" tests. >>>>>>>> >>>>>>>> Francois Budin (3): >>>>>>>> ENH: Update BridgeNumPy to latest version on 2017.01.08 to >>>>>>>> address ITK-3511 >>>>>>>> BUG: Extra \$ in doxygen comment >>>>>>>> BUG: Binary include directory added only if enabled shared >>>>>>>> >>>>>>>> Jon Haitz Legarreta (2): >>>>>>>> DOC: Document itkLabelOverlapMeasuresImageFilter methods. >>>>>>>> DOC: Fix ITKImageNoise filters' doc TeX errors. >>>>>>>> >>>>>>>> Matthew McCormick (1): >>>>>>>> BUG: Remove invalid ImageRegistration4Test.png.sha512 >>>>>>>> >>>>>>>> Max Smolens (1): >>>>>>>> DOC: Fix itkUnsharpMaskImageFilter documentation typos >>>>>>>> >>>>>>>> Simon Rit (1): >>>>>>>> BUG: ITK-based software was crasing when thread creation failed >>>>>>>> >>>>>>>> >>>>>>>> Changes from v4.10.0 to v4.11rc01 >>>>>>>> --------------------------------- >>>>>>>> >>>>>>>> Bill Lorensen (4): >>>>>>>> COMP: Restore support for clang 3.0 compiler >>>>>>>> COMP: Consistent use of ModifiedTimeType >>>>>>>> ENH: Bump WikiExamples remote module version >>>>>>>> ENH: Bump WikiExamples version >>>>>>>> >>>>>>>> Bradley Lowekamp (57): >>>>>>>> ENH: Add registered TrasformIO's to exception >>>>>>>> ENH: Use template or constant for loop stop condition >>>>>>>> ENH: Updating SWIG version to 3.0.9 >>>>>>>> COMP: Address VS9 ambiguous std::abs call in Haung calculator >>>>>>>> COMP: Fix undefined NumericTraits::Zero and One errors with >>>>>>>> mingw64 >>>>>>>> BUG: Fix segfault if ~CleanUpObjectFactory called multiple >>>>>>>> times >>>>>>>> BUG: Address itkHDF5ImageIO test failures for mingw64 >>>>>>>> BUG: demonstrate dynamic_cast failure when reading transforms >>>>>>>> BUG: Address itkHDF5ImageIO test failures for mingw64 >>>>>>>> ENH: Updating SWIG version to 3.0.10 >>>>>>>> ENH: Enable CMP0063 New behavior >>>>>>>> COMP: Enable hidden visibility property with vxl static >>>>>>>> libraries >>>>>>>> COMP: Enable hidden visibility property with HDF5 static >>>>>>>> libraries >>>>>>>> COMP: Enable hidden visibility property with HDF5 static >>>>>>>> libraries >>>>>>>> BUG: Match Add2 function to AddImageFilter documentation >>>>>>>> ENH: Improve support for std::complex with PowImageFilter >>>>>>>> ENH: Explicitly mark required files for dependent tests >>>>>>>> COMP: Bypass XCode 7.3,8 internal compilation error >>>>>>>> COMP: Address CMake configuration error with itkJPEG2000Test03 >>>>>>>> property >>>>>>>> BUG: Correct test's REQUIRED_FILES to only the input. >>>>>>>> ENH: move HessianToObjectnessMeasure filter out of Review >>>>>>>> ENH: Separate TransformFactory class into separate module >>>>>>>> DOC: Add links between similar label to rgb filters >>>>>>>> ENH: Separate data from function calls >>>>>>>> COMP: Fix changed Graft method >>>>>>>> ENH: Reduce template dependencies on CalculateRotationMatrix >>>>>>>> ENH: Add Functor Accessors to LabelMapToRGB filter >>>>>>>> BUG: Enable VirtualDomain and FixedTransform in RegMethv4 >>>>>>>> BUG: Use BSpline Order 3 for 2D in transform factory. >>>>>>>> ENH: Add spline order to BSplineTransform's string id >>>>>>>> ENH: Adding initial CircleCi configuration file >>>>>>>> COMP: Fix float to unsigned integer conversion warnings >>>>>>>> BUG: Include installed modules in ITK_MODULES_ENABLED >>>>>>>> COMP: Address CMake error that ITKGPUCommon is not in export >>>>>>>> COMP: Address wrong library types with VS and shared libraries >>>>>>>> BUG: Ensure CreateImageIO is concurrent thread safe >>>>>>>> ENH: Mark HDF5 CMake options as internal >>>>>>>> COMP: Add template export declaration for ParametricPath >>>>>>>> COMP: Correct TEMPLATE_EXPLICIT definition in Path module >>>>>>>> ENH: Factor out common code in the TrasformFactoryBase >>>>>>>> registration >>>>>>>> ENH: Add CMake variable for max transform dimension, defaults 4 >>>>>>>> ENH: Create CMake module to check for private RTTI >>>>>>>> compatibility >>>>>>>> ENH: Improving setting of default >>>>>>>> ITK_TEMPATE_VISIBILITY_DEFAULT >>>>>>>> COMP: Correct ifndef value to allow user defined >>>>>>>> ITK_TEMPLATE_EXPORT >>>>>>>> BUG: Add explicit instantiate for ObjectToObjectOptimizerBase >>>>>>>> COMP: Use add_definitions for CMake 2.8.9 compatibility >>>>>>>> COMP: Add warning suppression for distcc warning >>>>>>>> ENH: Explicitly instantiate the optimizer base over float >>>>>>>> BUG: Use IsLinear to check if transform is "affine" >>>>>>>> ENH: Remove unneeded includes of random iterator header >>>>>>>> ENH: Improve thread-safety for Generator, and unique New >>>>>>>> sequence >>>>>>>> ENH: Do not use global random generator >>>>>>>> BUG: Update v3 registration metrics to use local seed >>>>>>>> ENH: Prefer setting local seed over global in tests. >>>>>>>> ENH: Update SWIG to latest 3.0.11 release >>>>>>>> BUG: relax testing parameters for v3 translation registration >>>>>>>> BUG: Restore baseline for debug registration >>>>>>>> >>>>>>>> Caspar Goch (2): >>>>>>>> BUG: Use printable type for RGBA pixel ostream for ITK-3501 >>>>>>>> STYLE: Remove extra space for ITK-3501 >>>>>>>> >>>>>>>> Christina Rossmanith (1): >>>>>>>> DOC: Added more details to the class Doxygen documentation. >>>>>>>> >>>>>>>> Davis Vigneault (2): >>>>>>>> COMP: VCL_DEFINE_SPECIALIZATION not defined >>>>>>>> ENH: Add remote module DVMeshNoise >>>>>>>> >>>>>>>> D?enan Zuki? (27): >>>>>>>> BUG: Fixing CID-1355433 (IDENTICAL_BRANCHES) >>>>>>>> ENH: Adding MultipleImageIterator as a remote module >>>>>>>> COMP: enables TBB 4.4 back-end for VTK7's SMP >>>>>>>> COMP: enabling position independent code flag for FFTW >>>>>>>> ENH: adding configuration file for code reformatting tool >>>>>>>> clang-format >>>>>>>> ENH: Updating hooks to work with Windows/TortoiseGit/KDiff3 >>>>>>>> COMP: Fixing -fPIC flag passing with Ninja build system >>>>>>>> ENH: Adding RLEImage as a remote module >>>>>>>> ENH: Updating uncrustify configuration to current git version >>>>>>>> STYLE: better compliance with ITK style >>>>>>>> STYLE: A new option in uncrustify, updating the config file >>>>>>>> accordingly >>>>>>>> ENH: Adding MorphologicalContourInterpolation as a remote >>>>>>>> module >>>>>>>> ENH: improving documentation >>>>>>>> BUG: fixing buffer growing endlessly, as reported by Timothee >>>>>>>> Evain >>>>>>>> BUG: fixing buffer growing endlessly, as reported by Timothee >>>>>>>> Evain >>>>>>>> STYLE: default uncrustify configuration file is less aggressive >>>>>>>> COMP: Fixing warning >>>>>>>> COMP: VS15 compiler fix >>>>>>>> BUG: casting -9 to unsigned produced unwanted result >>>>>>>> BUG: Ensuring consistency between debug and release >>>>>>>> COMP: Updating LesionSizingToolkit after some recent compile >>>>>>>> fixes >>>>>>>> COMP: respect option METAIO_USE_NAMESPACE >>>>>>>> ENH: updating version of AnisotropicDiffusionLBR >>>>>>>> ENH: adding UnsharpMaskingImageFilter >>>>>>>> COMP: explicitly cast to output type >>>>>>>> BUG: double call to update would cause empty output image >>>>>>>> ENH: Updating RLEImage remote module. Change-log: >>>>>>>> >>>>>>>> Eugene Prilepin (4): >>>>>>>> ENH: Add the "ITK_USE_GPU" to ITK Config >>>>>>>> BUG: Fix API for set/get "LaplacianImageFilter" object >>>>>>>> ENH: Add support of images types with the 'CovariantVector' >>>>>>>> pixel type >>>>>>>> ENH: Add python test for the 'GradientVectorFlowImageFilter' >>>>>>>> wrap >>>>>>>> >>>>>>>> Francois Budin (52): >>>>>>>> ENH: Adding GetArrayFromImage in python itk namespace >>>>>>>> ENH: Adding GetImageFromArray in python itk namespace >>>>>>>> ENH: *_WRAP_* variable per external module >>>>>>>> BUG: ImportImageFilter not responsible of memory management >>>>>>>> ENH: New remote module GenericLabelInterpolator >>>>>>>> DOC: SetNumberOfOutputs had wrong comment >>>>>>>> BUG: lazyAttributes dictionary keys could be over-ridden >>>>>>>> BUG: lazyAttributes dictionary keys could be over-ridden >>>>>>>> BUG: Fix recent update of HDF5 (1.8.17) >>>>>>>> ENH: Update SCIFIO to latest version on 08/23/2016 >>>>>>>> ENH: Addition of the remote module >>>>>>>> FixedPointInverseDisplacementField >>>>>>>> ENH: Update SCIFIO to latest version on 08/29/2016 >>>>>>>> BUG: Path to commit was relative instead of absolute >>>>>>>> ENH: Path to SetupForDevelopment is relative, not absolute >>>>>>>> BUG: LSMImageIO write function was not checking image dimension >>>>>>>> BUG: LSMImageIO was not checking correctly image dimension >>>>>>>> BUG: Missing associated test data >>>>>>>> BUG: Missing associated test data >>>>>>>> ENH: Bump CMakeLists.txt version to 4.10.1. >>>>>>>> BUG: Quotes are not escaped in configured cmake file >>>>>>>> ENH: Improving API of Graft() in itk::Image >>>>>>>> ENH: Updating ITKGenericLabelInterpolator remote module >>>>>>>> ENH: Update ITKIOTransformDCMTK remote module >>>>>>>> BUG: Factory registration should depend on ITK_BUILD_SHARED >>>>>>>> COMP: Updating DCMTK compilation for Ninja >>>>>>>> ENH: Update version of DCMTK to 3.6.1_20121012 >>>>>>>> ENH: Update SCIFIO to latest version on 10/25/2016 >>>>>>>> BUG: Swig and PCRE do not support space in installation paths >>>>>>>> BUG: exit() call from within piped commands was not exiting >>>>>>>> the script >>>>>>>> BUG: Typo in folder creation command >>>>>>>> ENH: Only display message for transform registered multiple >>>>>>>> times in debug >>>>>>>> ENH: Image spacing must be positive >>>>>>>> BUG: Supported extensions by PNG IO were not added in >>>>>>>> constructor. >>>>>>>> DOC: Documentation in itkRBGAPixel and itkRGBPixel was >>>>>>>> incorrect. >>>>>>>> ENH: Update SCIFIO to lastest (2016.12.01) >>>>>>>> ENH: FixedPointInverseDisplacementField moved to >>>>>>>> InsightSoftwareConsortium >>>>>>>> COMP: Remove compilation warnings >>>>>>>> ENH: Improved support of ccache and distcc >>>>>>>> BUG: GPUImage regression due to API change. >>>>>>>> ENH: Update Bridge Numpy (2016.12.05) >>>>>>>> ENH: Update VariationalRegistration to remove warnings during >>>>>>>> compilation >>>>>>>> ENH: FindPythonLibs does not support both debug and release >>>>>>>> python libraries >>>>>>>> ENH: Update VariationalRegistration >>>>>>>> BUG: Missing ITK_TEMPLATE_EXPORT in forward declaration of >>>>>>>> itk::ImageBase >>>>>>>> BUG: Missing ITK_TEMPLATE_EXPORT in >>>>>>>> itkOptimizerParametersHelper >>>>>>>> BUG: Missing ITK_TEMPLATE_EXPORT in templated class >>>>>>>> BUG: Remove linkage warnings on MacOS >>>>>>>> BUG: HDF5 CMake installation directory variable had not been >>>>>>>> updated >>>>>>>> BUG: Missing include header in AnisotropicDiffusionBLR remote >>>>>>>> module hxx files >>>>>>>> COMP: Silencing unused variable warning in itkTimeStamp >>>>>>>> STYLE: Improve style checking by using module >>>>>>>> ITKKWStyleOverwrite.txt >>>>>>>> COMP: OS*Barrier functions are deprecated on MacOS 10.12 >>>>>>>> >>>>>>>> GCC-XML Upstream (1): >>>>>>>> ENH: pygccxml v1.8.0 (reduced) >>>>>>>> >>>>>>>> Gert Wollny (1): >>>>>>>> BUG: Relax vnl_complex floating point comparisons for i386 >>>>>>>> >>>>>>>> Gilles Filippini (1): >>>>>>>> BUG: Use NATIVE_HBOOL for encoding HDF5 types. >>>>>>>> >>>>>>>> HDF Group (1): >>>>>>>> ENH: hdf5 1.8.17-r30218 (reduced) >>>>>>>> >>>>>>>> Hans Johnson (23): >>>>>>>> COMP: Use cmake WriteCompilerDetectionHeader >>>>>>>> ENH: Use itk_compiler_detection versions >>>>>>>> COMP: Need ITK_NOEXCEPT_OR_THROW macro. >>>>>>>> COMP: Provide consistent granular C++11 support >>>>>>>> STYLE: Use granular ITK_COMPILER_CXX_STATIC_ASSERT >>>>>>>> STYLE: Prefer to use consistent definitions >>>>>>>> COMP: Improve robustness of identifying the compiler standard >>>>>>>> used >>>>>>>> BUG: try_compile for AlignAs were always failing >>>>>>>> STYLE: Provide a well documented macro for repeated code >>>>>>>> STYLE: Delete functions in consistent way >>>>>>>> COMP: GPU baseclass ivars need to be protected >>>>>>>> COMP: Remove unnecessary circular dependancy >>>>>>>> COMP: Add long long usage for HDF5 >>>>>>>> COMP: Add long long usage for HDF5 >>>>>>>> STYLE: Prefer static small array to dynamic array >>>>>>>> BUG: Confusing interface for FFTW wisdom files >>>>>>>> STYLE: Output dimension from OutputImageType >>>>>>>> STYLE: Code review style cleanups >>>>>>>> STYLE: Prefer to use ITK AssertOrThrow macros >>>>>>>> ENH: Add OverrideBoundaryCondition logic >>>>>>>> ENH: Provide mechanism for enhanced NIFTI support >>>>>>>> BUG: Use NIFTI sform/qform conventions correctly >>>>>>>> ENH: Remove ambiguity about sform/qform >>>>>>>> >>>>>>>> Hastings Greer (8): >>>>>>>> BUG: ITK-3448 Wrap itkQuadEdgeCellTraitsInfo more specifically >>>>>>>> BUG: make itkTriangleHelper instantiable to ease wrapping >>>>>>>> BUG: remove lsqr because of license issues ITK 1160 >>>>>>>> BUG: make itkTriangleHelper instantiable to ease wrapping >>>>>>>> BUG: initialize X to zero in lsmr Solve >>>>>>>> BUG: Labled Point Set Registration: test multiple labels >>>>>>>> BUG: Fix python wrapping of Cuberille remote module >>>>>>>> BUG: Add test demonstrating Python global timestamp issue >>>>>>>> >>>>>>>> Jean-Christophe Fillion-Robin (5): >>>>>>>> STYLE: UseITK: Set ImageIO exceptions using new convention. >>>>>>>> See #3393 >>>>>>>> STYLE: MeshIO: Moves virtual destructor into cpp files. See >>>>>>>> #3393 >>>>>>>> STYLE: Update MeshIO factories to use RegisterFactoryInternal. >>>>>>>> See #3393 >>>>>>>> STYLE: MeshIO: Move MeshFileWriterException into its own file. >>>>>>>> See #3393 >>>>>>>> STYLE: MeshIO: Remove unused include from headers. See #3393 >>>>>>>> >>>>>>>> Johan Andruejol (3): >>>>>>>> ENH: Add missing itkKernelFunctionBase wrapping >>>>>>>> ENH: Add PrincipalComponentsAnalysis remote module >>>>>>>> COMP: Override cannot be used with inline >>>>>>>> >>>>>>>> Jon Haitz Legarreta (216): >>>>>>>> ENH: Improve itkFlatStructutingElement coverage. >>>>>>>> ENH: Improve itkPathToImageFilter class coverage. >>>>>>>> ENH: Improve itkIsolatedWatershedImageFilter coverage. >>>>>>>> ENH: Improve itkLogSigmoidTransferFunction coverage. >>>>>>>> STYLE: Improve itkBSplineTransform doc style. >>>>>>>> ENH: Improve GaborKernelFunctionCoverage. >>>>>>>> PERF: Remove duplicate itkMath include >>>>>>>> STYLE: Move the PrintSelf method to the end >>>>>>>> STYLE: Improve the itkScalarToRGBColormapImageFilter style. >>>>>>>> STYLE: Delete duplicate method documentation >>>>>>>> STYLE: Remove method documentation from implementation file >>>>>>>> STYLE: Improve GACLevelSet classes' style >>>>>>>> STYLE: Improve test style >>>>>>>> ENH: Improve itkGaussianDerivativeImageFilter coverage. >>>>>>>> ENH: Improve the itkScalarToRGBColormapImageFilter coverage >>>>>>>> STYLE: Improve itkScalarToRGBColormap test style >>>>>>>> ENH: Improve GACLSImageFilter classes' coverage >>>>>>>> STYLE: Improve comment style in GACLS tests >>>>>>>> ENH: Improve itkImportImageFilter coverage >>>>>>>> ENH: Improve itkVideoFileReader coverage >>>>>>>> ENH: Improve itkVideoFileWriter coverage >>>>>>>> STYLE: Improve the itkVideoFileWriter style. >>>>>>>> STYLE: Imrpove itkVideoFileReader style. >>>>>>>> ENH: Improve the itkBSplineControlPointImageFunction coverage >>>>>>>> STYLE: Improve the itkIntensityWindowingImageFilter style >>>>>>>> STYLE: Improve the itkIntensityWindowingImageFilter test style >>>>>>>> ENH: Improve ImageToSpatialObjectRegistrationMethod coverage >>>>>>>> STYLE: Improve test style >>>>>>>> ENH: Improve MaskNeighborhoodOperatorImageFilter coverage >>>>>>>> ENH: Improve itkMeshFileWriter coverage >>>>>>>> ENH: Improve RescaleIntensityImageFilter coverage. >>>>>>>> ENH: Improve itkClampImageFilter coverage. >>>>>>>> BUG: Fix ivar type casting in PrintSelf. >>>>>>>> STYLE: Improve MRIBiasFieldCorrectionFilter style. >>>>>>>> ENH: Improve MRIBiasFieldCorrectionFilter coverage. >>>>>>>> ENH: Improve itkIntensityWindowingImageFilter coverage >>>>>>>> BUG: Fix Run-time type information in CSV module classes. >>>>>>>> ENH: Improve the itkHistogram class code coverage. >>>>>>>> DOC: Fix documentation typo. >>>>>>>> STYLE: Improve the ImproveRescaleIntensityImageFilter style. >>>>>>>> PERF: Make the itkVideoFileReader ivars private >>>>>>>> PERF: Make itkVideoFileWriter ivars private >>>>>>>> ENH: Improve coverage for itk::OrientImageFilter. >>>>>>>> STYLE: Improve itk::OrientImageFilter class style. >>>>>>>> ENH: Improve itkCSVNumericObjectFileWriter coverage. >>>>>>>> ENH: Add missing standard class typdefs. >>>>>>>> ENH: Improve itkVoronoiSegmentationImageFilter coverage. >>>>>>>> ENH: Improve itkVoronoiSegmentationImageFilter style. >>>>>>>> STYLE: Improve the MalahanobisDistanceThresholdImageFunction >>>>>>>> style. >>>>>>>> ENH: Improve coverage for itkMalahanobisDistanceThreshold. >>>>>>>> ENH: Improve itk::MinimumMaximumImageCalculator coverage. >>>>>>>> ENH: Improve itkMinimumMaximumImageCalculator style. >>>>>>>> BUG: Fix type mismatch in test. >>>>>>>> STYLE: Improve itkPolylineMaskImagefilter style. >>>>>>>> ENH: Improve itkPolylineMaskImageFilter coverage. >>>>>>>> ENH: Improve itkFileListVideoStyle. >>>>>>>> ENH: Improve itkLandmarkBasedTransformInitializer coverage. >>>>>>>> ENH: Add baseline image to itkPolylineMaskImageFilter test. >>>>>>>> ENH: Improve coverage for itkBSplineTransformInitializer. >>>>>>>> STYLE: Improve itkBSplineTransformInitializer doc style. >>>>>>>> ENH: Enhance itkBSplineTransformInitializer implementation. >>>>>>>> DOC: Fix typo in method documentation. >>>>>>>> ENH: Improve the itkRegularStepGradientDescentOptimizerv4 >>>>>>>> style. >>>>>>>> STYLE: Improve the itkSimpleContourExtractorImageFilter style. >>>>>>>> ENH: Exercise the class' Get methods. >>>>>>>> ENH: Improve coverage for itkStatisticsOpeningLabelMapFilter. >>>>>>>> ENH: Improve style for itkThresholdLabelerImageFilter. >>>>>>>> ENH: Improve itkThresholdLabelerImageFilter coverage. >>>>>>>> ENH: Get internal ImageIO via a const macro. >>>>>>>> ENH: Improve the itkSimpleContourExtractorImageFilter >>>>>>>> coverage. >>>>>>>> STYLE: Improve the itkMetaArray class style. >>>>>>>> ENH: Improve MetaArrayReader/Writer coverages. >>>>>>>> ENH: Improve the itkCovarianceImageFunction style. >>>>>>>> STYLE: Improve itkVoronoiDiagram2DGenerator style. >>>>>>>> ENH: Improve VoronoiDiagram2DGenerator coverage. >>>>>>>> STYLE: Improve the itkBayesianClassifierImageFilter style. >>>>>>>> STYLE: Improve the itkMetaArrayWriter style. >>>>>>>> ENH: Improve itkCovarianteImageFunction coverage. >>>>>>>> COMP: Fix signed/unsigned int comparison warning. >>>>>>>> DOC: Improve itkGrayscaleDilateImageFilter documentation. >>>>>>>> DOC: Improve documentation for itkGrayscaleErodeImageFilter. >>>>>>>> DOC: Improve ConfigureHistogram method documentation. >>>>>>>> STYLE: Improve the itkMovingHistogramMorphologyImagefilter >>>>>>>> style. >>>>>>>> BUG: Fix Superclass name in RTTI. >>>>>>>> STYLE: Improve itkGaussianInterpolateImageFunction style. >>>>>>>> ENH: Improve coverage for itkGaussianInterpolateImageFunction. >>>>>>>> ENH: Improve itkBayesianClassifierImageFilter coverage. >>>>>>>> ENH: Add itkBSplineControlPointImageFilter RTTI. >>>>>>>> STYLE: Improve itkBSplinecontrolPointImageFilter style. >>>>>>>> ENH: Improve itkBSplineControlPointImageFilter coverage. >>>>>>>> ENH: Improve coverage for itkRegularStepGradientDescentO >>>>>>>> ptimizerv4. >>>>>>>> STYLE: Improve the class implementation file style. >>>>>>>> STYLE: Improve the itkResampleImageFilter style. >>>>>>>> DOC: Fix typo in GetMTime method doc. >>>>>>>> STYLE: Remove out-of-body implementation doc >>>>>>>> ENH: Improve itkResampleImageFilter coverage. >>>>>>>> ENH: Improve itkAbsImageAdaptor and Filter coverage. >>>>>>>> BUG: Fix itkLSMImageIO class' Superclass name. >>>>>>>> ENH: Improve the itkInterpolateImagePointsFilter coverage. >>>>>>>> ENH: Improve itkPowImageFilter coverage. >>>>>>>> BUG: Fix ConvolutionImageFilter RTTI. >>>>>>>> STYLE: Use initialization lists. >>>>>>>> STYLE: Improve BinaryFunctorImageFilter style. >>>>>>>> ENH: Improve itkMinimumImageFilter code coverage. >>>>>>>> BUG: Fix Linux-x86_64-gcc4.1 warning on implicit conversion. >>>>>>>> ENH: Improve MaximumImageFilter coverage. >>>>>>>> BUG: Fix conversion to PixelType conversion. >>>>>>>> COMP: Fix double to unsigned char conversion warning. >>>>>>>> ENH: Improve coverage for itkNormalizeToConstantImageFilter. >>>>>>>> BUG: Fix itkSquaredDifferenceErrorFunction RTTI. >>>>>>>> ENH: Improve itkMeanImageFunctionCoverage. >>>>>>>> ENH: Improve itkSquareImageFilter coverage. >>>>>>>> STYLE: Improve the itkSquaredDifferenceErrorFunction style. >>>>>>>> STYLE: Enhance style for itkNormalizeToConstantImageFilter. >>>>>>>> STYLE: Improve itkMeanImageFunction style. >>>>>>>> ENH: Remove unnecesary call to filter print. >>>>>>>> ENH: Improve itkRegionOfInterestImageFilter coverage. >>>>>>>> STYLE: Improve itkRegionOfInterestImageFilter style. >>>>>>>> STYLE: Improve itkPasteImageFilter style. >>>>>>>> STYLE: Improve itkJoinSeriesImageFilter style. >>>>>>>> BUG: Fix itkPadLabelMapFilter RTTI Superclass. >>>>>>>> COMP: Address std::cout.precision conversion warning. >>>>>>>> ENH: Improve itkBayesianClassifiertImageFilter coverage. >>>>>>>> ENH: Improve itkPadLabelMapFilter coverage. >>>>>>>> ENH: Improve itkJoinSeriesImageFilter coverage. >>>>>>>> ENH: Improve the itkPasteImageFilter coverage. >>>>>>>> ENH: Improve MeanImageFilter coverage. >>>>>>>> COMP: Address std::cout.precision conversion warning. >>>>>>>> ENH: Improve TernaryMagnitudeImageFilter coverage. >>>>>>>> ENH: Improve FFTConvolutionImageFilter coverage. >>>>>>>> DOC: Fix class documentation in ternary magnitude filters. >>>>>>>> ENH: Improve ConstrainedValueDifferenceImageFilter coverage. >>>>>>>> ENH: Improve AndImageFilter coverage. >>>>>>>> ENH: Add baseline test to itkTernaryMagnitudeImageFilter. >>>>>>>> ENH: Use MD5 comparison framework in baseline test. >>>>>>>> ENH: Improve itk::VectorRescaleIntensityImageFilter coverage. >>>>>>>> STYLE: Improve the itkVectorRescaleIntensityImageFilter style. >>>>>>>> ENH: Print missing ivar in filter PrintSelf method. >>>>>>>> ENH: Improve itkComplexToImaginaryFilter coverage. >>>>>>>> ENH: Improve itkComplexToPhaseImageFilter coverage. >>>>>>>> ENH: Improve itkComplexToModulusImageFilter coverage. >>>>>>>> ENH: Improve itkComplexToRealImageFilter coverage. >>>>>>>> ENH: Improve itkVectorResampleImageFilter coverage. >>>>>>>> ENH: Add GetTransform method. >>>>>>>> ENH: Improve itkConstrainedValueAdditionImageFilter coverage. >>>>>>>> ENH: Improve itkModulusImageFilter coverage. >>>>>>>> ENH: Improve itkLog10ImageFilter coverage. >>>>>>>> ENH: Imporve itkMagnitudeAndPhaseToComplexImageFilter >>>>>>>> coverage. >>>>>>>> ENH: Improve itkLogImageFilter coverage. >>>>>>>> ENH: Improve itkInvertIntensityImageFilter coverage. >>>>>>>> STYLE: Improve itkInvertIntensityImageFilter style. >>>>>>>> DOC: Add missing doc to itkInvertIntensityImageFilter. >>>>>>>> STYLE: Improve itkIntensityWindowingImageFilter style. >>>>>>>> STYLE: Use initialization lists. >>>>>>>> ENH: Improve itkIntensityWindowingImageFilter coverage. >>>>>>>> ENH: Improve itkNaryMaximumImageFilter coverage. >>>>>>>> COMP: Fix std::precision type casting warning. >>>>>>>> ENH: Improve itkPointSetToPointSetRegistrationMethod coverage. >>>>>>>> STYLE: Improve the itkPointSetToPointSetImageRegistrationMethod >>>>>>>> style. >>>>>>>> ENH: Remove SmartPointers being explicitly initialized to null. >>>>>>>> STYLE: Improve the itkPointSetToImageRegistrationMethod style. >>>>>>>> ENH: Improve itkPointSetToImageRegistration coverage. >>>>>>>> STYLE: Change the name of the itkPointSetToImageRegistrationMethod >>>>>>>> test. >>>>>>>> STYLE: Improve itkVectorResampleImageFilter style. >>>>>>>> STYLE: Improve the itkAntiAliasBinaryImageFilter style. >>>>>>>> ENH: Improve trigonometric function filters' coverage. >>>>>>>> STYLE: Remove test names from std::out messages. >>>>>>>> ENH: Improve Boolean Algebra ImageFilters coverage. >>>>>>>> STYLE: Improve the EuclideanDistancePointMetric style. >>>>>>>> ENH: Improve itkSigmoidImageFilter coverage. >>>>>>>> STYLE: Improve itkCropImageFilter style. >>>>>>>> ENH: Improve itkCropImageFilter coverage. >>>>>>>> ENH: Improve RGBToLuminanceImageFilter and Adaptor coverage. >>>>>>>> ENH: Improve itkRescaleIntensityImageFilter coverage. >>>>>>>> ENH: Improve the itkMatrixSelectionImageFilter coverage. >>>>>>>> ENH: Improve itkTanImageFilter and Adaptor coverage. >>>>>>>> ENH: Increase itkSqrtImageFilter and Adaptor coverage. >>>>>>>> ENH: Increase itkTernaryOperatorImageFilter coverage. >>>>>>>> ENH: Increase itkSymmetricEigenAnalysisImageFilter coverage. >>>>>>>> STYLE: Improve itkScalarImagekmeansImageFilter style. >>>>>>>> STYLE: Conform to TEST_SET_GET_VALUE definition. >>>>>>>> BUG: Fix uninitialized variable due to dynamic analysis defect. >>>>>>>> BUG: Fix uninitialized variable defect reported by valgrind. >>>>>>>> ENH: Improve the itkPointSetToPointSetRegistrationTest. >>>>>>>> ENH: Improve the itkPointSetToImageRegistrationTest. >>>>>>>> ENH: Increas BinaryMagnitudeImageFilter coverage. >>>>>>>> STYLE: Remove test name from std output. >>>>>>>> ENH: Increase MagnitudeImageFilter coverage. >>>>>>>> BUG: Fix uninitialized variable defect reported by valgrind. >>>>>>>> BUG: Fix Superclass name in RTTI. >>>>>>>> STYLE: Improve itkFrustumSpatialFunction style. >>>>>>>> STYLE: Improve the itkConicShellInteriorExteriorSpatialFunction >>>>>>>> style. >>>>>>>> BUG: Fix Superclass template argument list. >>>>>>>> STYLE: Improve the itkTorusInteriorExteriorSpatialFunction >>>>>>>> style. >>>>>>>> STYLE: Improve the itkCheckerBoardImageFilter class style. >>>>>>>> ENH: Improve the itk::LabelVotingImageFilter coverage. >>>>>>>> ENH: Improve itkCheckerBoardImageFilter coverage. >>>>>>>> STYLE: Improve itk::LabelVotingImageFilter style. >>>>>>>> STYLE: Improve the itkHoughTransform2DCirclesImageFilter >>>>>>>> style. >>>>>>>> ENH: Add test for itk::FrustumSpatialFunction class. >>>>>>>> ENH: Improve itkConnectedThresholdImageFilter coverage. >>>>>>>> STYLE: Improve itkConnectedThresholdImageFilter style. >>>>>>>> BUG: Fix FrustumSpatialFunction internal precision conversion. >>>>>>>> COMP: Fix implicit conversion warning. >>>>>>>> STYLE: Improve itkThresholdImageFilter style. >>>>>>>> ENH: Add test for itk::TorusInteriorExteriorSpatialFunction. >>>>>>>> BUG: Fix Superclass template argument list. >>>>>>>> ENH: Improve itkUnsharpMaskingImageFilter implementation. >>>>>>>> ENH: Improve the itkUnsharpMaskingImageFilter coverage. >>>>>>>> ENH: Fix UnsharpMaskingImageFilter test inconsistencies. >>>>>>>> BUG: Add missing itkTypeMacro. >>>>>>>> DOC: Document the member variables. >>>>>>>> BUG: Fix the itkImageSource RTTI class name, >>>>>>>> STYLE: Improve itkLabelImageGaussianInterpolateImageFunction >>>>>>>> style. >>>>>>>> ENH: Finish itkGaussianInterpolateImageFunction PrintSelf. >>>>>>>> STYLE: Improve itkLabelOverlapMeasurementImageFilter style. >>>>>>>> >>>>>>>> KWSys Robot (6): >>>>>>>> KWSys 2016-06-30 (96f06c8e) >>>>>>>> KWSys 2016-10-23 (b630d2f5) >>>>>>>> KWSys 2016-11-03 (37306a1c) >>>>>>>> KWSys 2016-11-08 (2b3e2b1c) >>>>>>>> KWSys 2016-11-09 (18c65411) >>>>>>>> KWSys 2016-11-21 (cb55cf5a) >>>>>>>> >>>>>>>> Maeliss Jallais (1): >>>>>>>> BUG: Add unsigned and signed short to the wrapping of >>>>>>>> vnl_matrix >>>>>>>> >>>>>>>> Matthew McCormick (85): >>>>>>>> PERF: Simplify HilbertPath numberOfPathVertices computation. >>>>>>>> BUG: CID 1355469 NNetClassifierTest4 unintended integer >>>>>>>> division. >>>>>>>> BUG: Update Cuberille Remote for version check fix. >>>>>>>> ENH: Bump ITK version to 4.11.0. >>>>>>>> BUG: Fix HDF5ImageIO type information. >>>>>>>> BUG: Fix H5File memory leak in HDF5ImageIO. >>>>>>>> DOC: Collect Francois Budin's contributions in .mailmap >>>>>>>> BUG: Limit WRAP_ITK_MODULES when building externally >>>>>>>> STYLE: Improvements to ResourceProbe report output. >>>>>>>> ENH: Add a useTabs argument to ResourceProbe::Report. >>>>>>>> ENH: Add standard error measure to the ResourceProbe >>>>>>>> ENH: Add itk_python_add_test function. >>>>>>>> BUG: Remove VNL file from subtree merge. >>>>>>>> COMP: Fix wrapping with a space in the Python include path >>>>>>>> BUG: Fix PermuteAxesImageFilter pipeline method visibility >>>>>>>> BUG: Initialize PermuteOrder and FlipAxes in OrientImageFilter >>>>>>>> BUG: ResampleImageFilter honor isInside output of the >>>>>>>> transform method >>>>>>>> COMP: Avoid recursive include of itkMath.h >>>>>>>> COMP: Fix VXL header installation locations >>>>>>>> BUG: ClampImageFilterTest for older GCC, InPlaceOn >>>>>>>> DOC: Add CONTRIBUTING.md file to the top level. >>>>>>>> COMP: Update VariationalRegistration to address Doxygen >>>>>>>> warnings >>>>>>>> BUG: Compiler detections file installed into ITK build tree >>>>>>>> location >>>>>>>> COMP: Do not use string(TIMESTAMP. >>>>>>>> COMP: Remove HDF5 -std=c99 for C++ files >>>>>>>> BUG: Do not build HDF5 static library with a shared build >>>>>>>> ENH: Add PerformanceBenchmarking Remote Module >>>>>>>> COMP: Remove duplicate wrappings for ResampleImageFilter >>>>>>>> BUG: Put Python test output files in the build tree >>>>>>>> BUG: Improve HDF5ImageIO::CloseDataSet name >>>>>>>> COMP: Use add_python_test PythonLazyLoadingImage >>>>>>>> COMP: Address missing override it itkFactoryTestLib.cxx >>>>>>>> BUG: Index,Size,Offset constructors present in Python with >>>>>>>> C++11 >>>>>>>> COMP: Address missing override it itkFactoryTestLib.cxx >>>>>>>> BUG: PerformanceBenchmarking as EXCLUDE_FROM_DEFAULT >>>>>>>> ENH: Bump SetupForDevelopment version >>>>>>>> BUG: Add missing ZLib deflate support to HDF5 >>>>>>>> BUG: Address memory leak, remove NumPy build dep in BridgeNumPy >>>>>>>> COMP: Do not set ITK_LIBRARY_BUILD_TYPE in ITKTransformFactory >>>>>>>> COMP: Do not set ITK_LIBRARY_BUILD_TYPE in ITKTransformFactory >>>>>>>> BUG: Check when ITK_WRAP_VECTOR_COMPONENTS doesn't include >>>>>>>> ITK_WRAP_IMAGE_DIMS >>>>>>>> BUG: RichardsonLucyDeconvolutionImageFilter with non-null >>>>>>>> input >>>>>>>> Image Origin >>>>>>>> BUG: Fix inconsistent Twister start with Initialize(seed) and >>>>>>>> SetSeed(seed) >>>>>>>> BUG: Do not hard code CMake scripts in HDF5 >>>>>>>> COMP: Workaround Emscripten ITKCommon test build failure >>>>>>>> COMP: Do embed fancy HDF5 libsettings with Emscripten >>>>>>>> COMP: Add missing H5T_patch_vlen_file declaration >>>>>>>> ENH: Bump CastXML to 2016-10-11 master. >>>>>>>> COMP: Workaround Emscripten ITKCommon test build failure >>>>>>>> BUG: Swap CastXML hashes for Mac OSX and Windows >>>>>>>> ENH: Sync ExternalData.cmake with upstream CMake 3.6.2 >>>>>>>> COMP: Fix VNL tests when cross-compiling >>>>>>>> ENH: ExternalData multi-algorithm support >>>>>>>> ENH: ExternalData support for data.kitware.com >>>>>>>> BUG: Install missing H5pubconf.h >>>>>>>> BUG: Use SpacePrecisionType in TileImageFilter >>>>>>>> BUG: Use internal ExternalData_Add_Target >>>>>>>> ENH: Run .sha512, .md5 simultaneous modification pre-commit >>>>>>>> check >>>>>>>> BUG: Correct CastXML Windows binary >>>>>>>> BUG: Support non-zero Index in LevelSetNeighborhoodExtractor >>>>>>>> ENH: Add ArchiveTestingDataOnGirder.py >>>>>>>> BUG: Correct AtanRegularizationHeavisideStepFunction >>>>>>>> derivative >>>>>>>> ENH: Add Utilities/Maintenance/ContentLinkSynchronization.sh >>>>>>>> BUG: Remove extra HessianToObjectness content links >>>>>>>> ENH: Wrap SpatialFunction float types with ITK_WRAP_float >>>>>>>> BUG: Bump PerformanceBenchmarking to 2016-11-04 >>>>>>>> BUG: itk_python_expression_add_test too many quotes. >>>>>>>> ENH: Wrap VectorImage with complex real pixel types >>>>>>>> ENH: Bump PerformanceBenchmarking to 2016-11-07 >>>>>>>> BUG: Do not assume zero Index in ReinitializeLevelSetImageFilte >>>>>>>> r >>>>>>>> ENH: Create itk_module_add_library macro >>>>>>>> BUG: Update computeCodeCoverageLocally.sh for KWStyle addition >>>>>>>> COMP: Install a newer version of CMake on CircleCI >>>>>>>> ENH: Use GitHub Pages as the first ExternalData resource >>>>>>>> ENH: Add tests to demonstrate OSX dynamic_cast failure >>>>>>>> BUG: Use random seed with for MersenneTwisterRandomVariateGe >>>>>>>> nerator. >>>>>>>> BUG: Enable program global timestamp >>>>>>>> BUG: Set random number seed in Mattes metric test >>>>>>>> BUG: Notify builder that ITK_DYNAMIC_LOADING is required with >>>>>>>> wrapping >>>>>>>> BUG: Define ITK_DYNAMIC_LOADING before ITK_WRAP_PYTHON >>>>>>>> BUG: Set random number seed mutual information metric tests >>>>>>>> BUG: Wrap std::vector< itk.Point > >>>>>>>> BUG: Fix wrapping of LandmarkBasedTransformInitializer >>>>>>>> BUG: Rename UnsharpMaskingImageFilter to UnsharpMaskImageFilter >>>>>>>> DOC: Add D?enan Zuki? to .mailmap >>>>>>>> >>>>>>>> Max Smolens (4): >>>>>>>> COMP: CID-1266557 StatisticsLabelMapFilter uninitialized >>>>>>>> scalar field >>>>>>>> BUG: CID-1355438 QuadEdgeTest1 resource leaks >>>>>>>> COMP: CID-1355472 MIRegistrationFunction unused value >>>>>>>> COMP: Fix link errors for VNL template instantiations on >>>>>>>> Windows >>>>>>>> >>>>>>>> Mayeul Chassagnard (7): >>>>>>>> BUG: Test added and error fixed in HDF5ImageIO >>>>>>>> ENH: Update add_library TO itk_module_add_library >>>>>>>> COMP: Set Policy CMP0023 target_link_libraries for >>>>>>>> Modules/ThirdParty/VNLI... >>>>>>>> BUG: Add ITK_TEMPLATE_EXPORT to template classes >>>>>>>> BUG: Fix errors linked to dyn_cast merge >>>>>>>> BUG: Restore old ITKModule_TEMPLATE_EXPORT specification for >>>>>>>> classes >>>>>>>> BUG: dash3win7 dashboard build error unresolved external symbol >>>>>>>> >>>>>>>> Michka Popoff (3): >>>>>>>> ENH: Update UpdatepygccxmlFromUpstream.sh for v1.8.0 >>>>>>>> ENH: Update igenerator.py for pygccxml v1.8.0 >>>>>>>> COMP: Use pygccxml's public API for apply definitions >>>>>>>> >>>>>>>> Pierre Barbier de Reuille (2): >>>>>>>> COMP: Fix function naming error when using FFTWD >>>>>>>> COMP: Fix function naming error when using FFTWD >>>>>>>> >>>>>>>> Sean McBride (1): >>>>>>>> COMP: Bypass HDF5 bugs under TSan >>>>>>>> >>>>>>>> Simon Rit (2): >>>>>>>> COMP: remove C++11 compiler warning for CUDA compilations >>>>>>>> COMP: remove C++11 compiler warning for CUDA compilations >>>>>>>> >>>>>>>> Somesh Kashyap (2): >>>>>>>> BUG: Override TransformCategoryType for >>>>>>>> AzimuthElevationToCartesianTransform >>>>>>>> BUG: -Added test case for itkAzimuthElevationToCartesian >>>>>>>> Transform >>>>>>>> >>>>>>>> Sumedha Singla (1): >>>>>>>> ENH: Updated the git tag for ITK-Minimal-Path-Extraction >>>>>>>> remote module >>>>>>>> >>>>>>>> Taylor Braun-Jones (4): >>>>>>>> COMP: Skip path length checks if ITK_SKIP_PATH_LENGTH_CHECKS >>>>>>>> is enabled >>>>>>>> COMP: Fix truncation from double to float warning >>>>>>>> DOC: Fix incorrect itkFactorylessNewMacro documentation >>>>>>>> COMP: Only include the headers for required OpenCV modules >>>>>>>> >>>>>>>> Thien Nguyen (1): >>>>>>>> PERF: SmapsFileParser unnecessary dynamic_cast >>>>>>>> >>>>>>>> VXL Maintainers (4): >>>>>>>> VNL 2016-05-15 (14f97ab4) >>>>>>>> VNL 2016-06-22 (23a93adb) >>>>>>>> VNL 2016-06-29 (d62a2d70) >>>>>>>> VNL 2016-07-06 (acfa62cc) >>>>>>>> >>>>>>>> Vladimir S. FONOV (1): >>>>>>>> COMP: Build against GCC 5.3.1 >>>>>>>> >>>>>>>> Zach Williamson (2): >>>>>>>> ENH: Update Remote Module Tags >>>>>>>> BUG: Fix Python Wrappings in C++11 >>>>>>>> >>>>>>>> Ziv Yaniv (1): >>>>>>>> BUG: Metric sampling percentage accepted values outside (0.0, >>>>>>>> 1.0]. >>>>>>>> >>>>>>>> >>>>>>>> ITK Software Guide Changes >>>>>>>> ---------------------------------------- >>>>>>>> >>>>>>>> Matt McCormick (8): >>>>>>>> DOC: Move the location for obtaining the software >>>>>>>> DOC: Remove reference to ITKApps >>>>>>>> ENH: Bump ITK ExternalProject version to 2016-11-02 master >>>>>>>> DOC: Document the ITK module registry >>>>>>>> ENH: Bump ITK ExternalProject version to v4.11rc01 master >>>>>>>> DOC: Update CMake hyperlinks >>>>>>>> DOC: Update minimum required CMake version to 2.8.9 >>>>>>>> DOC: Add section on static and shared libraries. >>>>>>>> >>>>>>>> >>>>>>>> ITK Sphinx Examples Changes >>>>>>>> ------------------------------------------- >>>>>>>> >>>>>>>> Matt McCormick (6): >>>>>>>> BUG: Use GDCM ITK module name >>>>>>>> ENH: Rename ReadDICOMSeriesAndWrite3DImage >>>>>>>> BUG: Add tests for ReadDICOMSeriesAndWrite3DImage >>>>>>>> ENH: Bump ITK Superbuild version to 2016-09-20 master >>>>>>>> ENH: Add Python version of ReadDICOMSeriesAndWrite3DImage >>>>>>>> ENH: Add Python version of CreateAnRGBImage >>>>>>>> >>>>>>>> Michka Popoff (5): >>>>>>>> ENH: Use same Python interpreter as ITK for wrapping tests >>>>>>>> BUG: Fix ResampleAnImage example (Python3) >>>>>>>> ENH: Add Python example for ApplyAFilterOnlyToASpecifiedRe >>>>>>>> gionOfAnImage >>>>>>>> ENH: Add 7 Python examples to Core/Common >>>>>>>> ENH: Add BoundingBoxOfAPointSet Python example >>>>>>>> >>>>>>>> >>>>>>>> ----------------------------------------------------- >>>>>>>> Errors or omissions? Please fix them here: >>>>>>>> >>>>>>>> >>>>>>>> https://docs.google.com/document/d/1UQAh7_mDjps0GZYX62biTwFr >>>>>>>> A54KRvf__4oeT0ymzZg/edit >>>>>>>> _______________________________________________ >>>>>>>> Powered by www.kitware.com >>>>>>>> >>>>>>>> Visit other Kitware open-source projects at >>>>>>>> http://www.kitware.com/opensource/opensource.html >>>>>>>> >>>>>>>> Kitware offers ITK Training Courses, for more information visit: >>>>>>>> http://kitware.com/products/protraining.php >>>>>>>> >>>>>>>> Please keep messages on-topic and check the ITK FAQ at: >>>>>>>> http://www.itk.org/Wiki/ITK_FAQ >>>>>>>> >>>>>>>> Follow this link to subscribe/unsubscribe: >>>>>>>> http://public.kitware.com/mailman/listinfo/insight-developers >>>>>>>> >>>>>>> >>>>>>> >>>>>>> _____________________________________ >>>>>>> Powered by www.kitware.com >>>>>>> >>>>>>> Visit other Kitware open-source projects at >>>>>>> http://www.kitware.com/opensource/opensource.html >>>>>>> >>>>>>> Kitware offers ITK Training Courses, for more information visit: >>>>>>> http://www.kitware.com/products/protraining.php >>>>>>> >>>>>>> Please keep messages on-topic and check the ITK FAQ at: >>>>>>> http://www.itk.org/Wiki/ITK_FAQ >>>>>>> >>>>>>> Follow this link to subscribe/unsubscribe: >>>>>>> http://public.kitware.com/mailman/listinfo/insight-users >>>>>>> >>>>>>> >>>>>> >>>>> >>>> >>> >> > -------------- next part -------------- An HTML attachment was scrubbed... URL: From bakkari.abdelkhalek at hotmail.fr Sat Mar 11 06:12:47 2017 From: bakkari.abdelkhalek at hotmail.fr (Abdelkhalek Bakkari) Date: Sat, 11 Mar 2017 11:12:47 +0000 Subject: [ITK-users] Erosion the largest region in the image Message-ID: Dear Insight users, Is there any code example of Erosion the largest region in a 3D image, please ? Thank you in advance. Kind regards, Abdelkhalek Bakkari Ph.D candidate in Computer Science Institute of Applied Computer Science Lodz University of Technology, Poland -------------- next part -------------- An HTML attachment was scrubbed... URL: From jhlegarreta at vicomtech.org Sat Mar 11 07:39:36 2017 From: jhlegarreta at vicomtech.org (Jon Haitz Legarreta) Date: Sat, 11 Mar 2017 13:39:36 +0100 Subject: [ITK-users] Erosion the largest region in the image In-Reply-To: References: Message-ID: Hi Abdelkhalek, examples exist both for binary [1] or grayscale [2] images. As ITK filters are templated over the input image, the examples are still valid for N-D images making the appropriate dimensionality change for the image type. HTH, JON HAITZ [1] https://itk.org/ITKExamples/src/Filtering/BinaryMathematicalMorphology/index.html [2] https://itk.org/ITKExamples/src/Filtering/MathematicalMorphology/index.html -- On 11 March 2017 at 12:12, Abdelkhalek Bakkari < bakkari.abdelkhalek at hotmail.fr> wrote: > Dear Insight users, > > > Is there any code example of Erosion the largest region in a 3D image, > please ? > > > Thank you in advance. > > > Kind regards, > > > Abdelkhalek Bakkari > Ph.D candidate in Computer Science > Institute of Applied Computer Science > Lodz University of Technology, Poland > > > > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From matt.mccormick at kitware.com Sat Mar 11 09:59:03 2017 From: matt.mccormick at kitware.com (Matt McCormick) Date: Sat, 11 Mar 2017 09:59:03 -0500 Subject: [ITK-users] Limitations on GDCMImageIO In-Reply-To: References: Message-ID: Hi Emiliano, Thanks for sharing your work. Please contribute the code as a patch along with a test as documented here: https://itk.org/ITKSoftwareGuide/html/Book1/ITKSoftwareGuide-Book1ch10.html Thanks, Matt On Fri, Mar 10, 2017 at 11:19 AM, Emiliano Beronich wrote: > Hi everyone, > > While using the GDCMImageIO class to write a Dicom Image, I found some > limitations so I modified the class to correct them. > The limitations I found are: > 1) Can't write a sequence or even less Sequence inside Sequences. > 2) Can't write arrays of unsigned short (Example: (0054,0010) > EnergyWindowVector, (0054,0020) DetectorVector, (0054,0080) SliceVector). > > In order to pass the data the array of unsigned short I'm using a > std::vector. The sequences are stored in a Dictionary. > > Attached is the class modified. I would be great to include these changes in > future versions or improve GDCMImageIO class to correct these limitations. > > HTH, > Emiliano Beronich > > > > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > From keepdash at hotmail.com Mon Mar 13 02:13:47 2017 From: keepdash at hotmail.com (keepdash) Date: Sun, 12 Mar 2017 23:13:47 -0700 (MST) Subject: [ITK-users] Dicom image extraction and saving Message-ID: <1489385627841-7589697.post@n2.nabble.com> Hi, I use ITK load a dicom volume, then extract a region in the volume(use ROIImageFilter), I want to save the extracted smaller volume to a series of new dicom files following the example "DicomSeriesReadSeriesWrite.cxx", but I failed. Seems one reason is the slice of new volume is less than original volume so the file count is not match, but it must be more reasons that I can't do the saving. Can someone provide me an example that can do this, thanks. -- View this message in context: http://itk-insight-users.2283740.n2.nabble.com/Dicom-image-extraction-and-saving-tp7589697.html Sent from the ITK Insight Users mailing list archive at Nabble.com. From tevain at telecom-paristech.fr Mon Mar 13 05:50:29 2017 From: tevain at telecom-paristech.fr (Timothee Evain) Date: Mon, 13 Mar 2017 10:50:29 +0100 (CET) Subject: [ITK-users] [ITK] SetCenter() example for VersorRigid3DTransform In-Reply-To: References: Message-ID: <2004820203.39892196.1489398629117.JavaMail.zimbra@enst.fr> Hello, You could use : itk::OptimizerParameters NewCenter(3); NewCenter[0]=X; NewCenter[1]=Y; NewCenter[2]=Z; MyTransform->SetFixedParameters(NewCenter); or itk::Point NewCenter; NewCenter[0]=X; NewCenter[1]=Y; NewCenter[2]=Z; MyTransform->SetCenter(NewCenter); I've mostly used the first way, but the second should work also I think. HTH Tim, ----- Mail original ----- De: "Andrew Harris" ?: "Insight-users" Envoy?: Vendredi 10 Mars 2017 22:02:14 Objet: [ITK] [ITK-users] SetCenter() example for VersorRigid3DTransform Hello, I'm trying to set the center of rotation for a VersorRigid3DTransform to the middle of a 3D image in two dimensions and the top in the third. I have as of yet been unable to find an example in the wiki of doing this. The only example I've found appears to use a CenteredTransformInitializer to set the center of rotation to the center of the image. Is there an example of setting the center elsewhere, or if not, can someone provide me the syntax I would use? -- AH ----------------------------------------------------------------------------------------------- This email and any attachments thereto may contain private, confidential, and privileged materials for the sole use of the intended recipient. Any reviewing, copying, or distribution of this email (or any attachments thereto) by other than the intended recipient is strictly prohibited. If you are not the intended recipient, please contact the sender immediately and permanently destroy this email and any attachments thereto. _____________________________________ Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Kitware offers ITK Training Courses, for more information visit: http://www.kitware.com/products/protraining.php Please keep messages on-topic and check the ITK FAQ at: http://www.itk.org/Wiki/ITK_FAQ Follow this link to subscribe/unsubscribe: http://public.kitware.com/mailman/listinfo/insight-users _______________________________________________ Community mailing list Community at itk.org http://public.kitware.com/mailman/listinfo/community From filippo.brogi at topic.nl Mon Mar 13 08:05:00 2017 From: filippo.brogi at topic.nl (Filippo Brogi) Date: Mon, 13 Mar 2017 05:05:00 -0700 (MST) Subject: [ITK-users] Registering IO factories Message-ID: <1489406700323-37988.post@n7.nabble.com> Hi all, I know that using cmake the Factory Registration is going to automatically all the modules, that is basically going to created dependencies on all the module. Is there a way to initializes only the modules really used in the software. In my application for instance I'm only using the GDCMImageIO module, but when I release the software I have dependencies also on ITKIOBioRad-4.9 ITKIOBMP-4.9 ITKIOJPEG-4.9 ITKIOGE-4.9 etc.. Thanks in advance! -- View this message in context: http://itk-users.7.n7.nabble.com/Registering-IO-factories-tp37988.html Sent from the ITK - Users mailing list archive at Nabble.com. From matimontg at gmail.com Mon Mar 13 08:31:23 2017 From: matimontg at gmail.com (Matias) Date: Mon, 13 Mar 2017 05:31:23 -0700 (MST) Subject: [ITK-users] DicomTags when reading directory and generating mha or mhd... Message-ID: <1489408283871-37989.post@n7.nabble.com> Hi, I'm reading a directory which contains a series of Dicoms and then writting an .mha or .mhd file. I noticed the tags are lost (patient name, capture device, dates, series names, etc). How can I keep this information? I use a resampler filter and I have tried: resampler->SetMetaDataDictionary(reader->GetMetaDataDictionary()); writer->SetInput(resampler->GetOutput()); writer->UseInputMetaDataDictionaryOn(); With no luck.. Thank you, Matias. -- View this message in context: http://itk-users.7.n7.nabble.com/DicomTags-when-reading-directory-and-generating-mha-or-mhd-tp37989.html Sent from the ITK - Users mailing list archive at Nabble.com. From dzenanz at gmail.com Mon Mar 13 09:01:58 2017 From: dzenanz at gmail.com (=?UTF-8?B?RMW+ZW5hbiBadWtpxIc=?=) Date: Mon, 13 Mar 2017 09:01:58 -0400 Subject: [ITK-users] DicomTags when reading directory and generating mha or mhd... In-Reply-To: <1489408283871-37989.post@n7.nabble.com> References: <1489408283871-37989.post@n7.nabble.com> Message-ID: Hi Matias, what worked for me was: itk::MetaDataDictionary metadata = reader->GetMetaDataDictionary(); //processing... image->SetMetaDataDictionary(metadata); writer->SetInput(image); writer->Update(); Regards, D?enan On Mon, Mar 13, 2017 at 8:31 AM, Matias wrote: > Hi, > > I'm reading a directory which contains a series of Dicoms and then writting > an .mha or .mhd file. > > I noticed the tags are lost (patient name, capture device, dates, series > names, etc). > > How can I keep this information? I use a resampler filter and I have tried: > resampler->SetMetaDataDictionary(reader->GetMetaDataDictionary()); > writer->SetInput(resampler->GetOutput()); > writer->UseInputMetaDataDictionaryOn(); > > With no luck.. > > Thank you, > > Matias. > > > > -- > View this message in context: http://itk-users.7.n7.nabble. > com/DicomTags-when-reading-directory-and-generating-mha- > or-mhd-tp37989.html > Sent from the ITK - Users mailing list archive at Nabble.com. > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > -------------- next part -------------- An HTML attachment was scrubbed... URL: From dzenanz at gmail.com Mon Mar 13 09:05:32 2017 From: dzenanz at gmail.com (=?UTF-8?B?RMW+ZW5hbiBadWtpxIc=?=) Date: Mon, 13 Mar 2017 09:05:32 -0400 Subject: [ITK-users] Registering IO factories In-Reply-To: <1489406700323-37988.post@n7.nabble.com> References: <1489406700323-37988.post@n7.nabble.com> Message-ID: Hi Filippo, you can list just the modules you want. Here is an example snippet from CMakeLists.txt: set(ITK_COMPONENTS ITKIOImageBase ITKSmoothing ITKTransform ITKIOTransformBase ITKIOTransformInsightLegacy # .tfm format ITKIOMeta ITKIONRRD ITKIOPNG ITKIOTIFF ) find_package(ITK COMPONENTS ${ITK_COMPONENTS} REQUIRED) # using just a subset of IO modules cuts down exe file size #find_package(ITK COMPONENTS REQUIRED) # alternative: all components include(${ITK_USE_FILE}) Hope this helps, D?enan On Mon, Mar 13, 2017 at 8:05 AM, Filippo Brogi wrote: > Hi all, > I know that using cmake the Factory Registration is going to automatically > all the modules, that is basically going to created dependencies on all the > module. > > Is there a way to initializes only the modules really used in the software. > In my application for instance I'm only using the GDCMImageIO module, but > when I release the software I have dependencies also on > > ITKIOBioRad-4.9 > ITKIOBMP-4.9 > ITKIOJPEG-4.9 > ITKIOGE-4.9 > etc.. > > Thanks in advance! > > > > > -- > View this message in context: http://itk-users.7.n7.nabble. > com/Registering-IO-factories-tp37988.html > Sent from the ITK - Users mailing list archive at Nabble.com. > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > -------------- next part -------------- An HTML attachment was scrubbed... URL: From francois.budin at kitware.com Mon Mar 13 09:53:13 2017 From: francois.budin at kitware.com (Francois Budin) Date: Mon, 13 Mar 2017 09:53:13 -0400 Subject: [ITK-users] cmake error when configuring ITK with the variational registration module In-Reply-To: References: Message-ID: Hello Yann, I do not have such an error on my machine (only warning messages at compile time). Could you send your entire error message? The message you sent looks like the content of the file "Modules/Remote/VariationalRegistration.remote.cmake" which should download the source code of VariationalRegistration. There are some problems however when compiling ITK with BUILD_TESTING=ON as some testing data for this module seems to not be found, so if you want to compile this module, you should deactivate ITK testing. Francois On Fri, Mar 10, 2017 at 4:52 PM, asertyuio via Insight-users < insight-users at itk.org> wrote: > Hi all, > > Each time I include the variational registration module, I get the > following error while configuring with ccmake : > > ``` > # Insight Journal Handle: https://hdl.handle.net/10380/3460 > # Contact: Alexander Schmidt-Richberg > # Jan Ehrhardt > # Rene Werner > itk_fetch_module(VariationalRegistration > "A module to perform variational image registration. > https://hdl.handle.net/10380/3460" > GIT_REPOSITORY > ${git_protocol}://github.com/InsightSoftwareConsortium/ > ITKVariationalRegistration.git > GIT_TAG 5110f1b4304f450b46bbbaf0f3818a4bac65b154 > ) > ``` > > I'm using the master branch in git as a version of ITK. > > Seems like a bug... Any idea ? > Yann > > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > -------------- next part -------------- An HTML attachment was scrubbed... URL: From filippo.brogi at topic.nl Mon Mar 13 10:04:22 2017 From: filippo.brogi at topic.nl (Filippo Brogi) Date: Mon, 13 Mar 2017 07:04:22 -0700 (MST) Subject: [ITK-users] Registering IO factories In-Reply-To: References: <1489406700323-37988.post@n7.nabble.com> Message-ID: <1489413862950-37993.post@n7.nabble.com> That's is definitely what I was looking for. Thanks a lot -- View this message in context: http://itk-users.7.n7.nabble.com/Registering-IO-factories-tp37988p37993.html Sent from the ITK - Users mailing list archive at Nabble.com. From matimontg at gmail.com Mon Mar 13 10:09:47 2017 From: matimontg at gmail.com (Matias) Date: Mon, 13 Mar 2017 07:09:47 -0700 (MST) Subject: [ITK-users] DicomTags when reading directory and generating mha or mhd... In-Reply-To: References: <1489408283871-37989.post@n7.nabble.com> Message-ID: Thanks Dzenam, I actually have a resampler: typedef itk::ResampleImageFilter FilterType; //Filtro FilterType::Pointer resampler = FilterType::New(); which is then passed to the writer: writer->SetInput(resampler->GetOutput()); So I will try your suggestion and do this: resampler->SetMetaDataDictionary(metadata); or: writer->SetMetaDataDictionary(metadata); I will let you know how it goes. Regards, Matias El lun., 13 de mar. de 2017 a la(s) 10:02, D?enan Zuki? [via ITK - Users] < ml-node+s7n37990h59 at n7.nabble.com> escribi?: > Hi Matias, > > what worked for me was: > > itk::MetaDataDictionary metadata = reader->GetMetaDataDictionary(); > //processing... > image->SetMetaDataDictionary(metadata); > writer->SetInput(image); > writer->Update(); > > Regards, > D?enan > > On Mon, Mar 13, 2017 at 8:31 AM, Matias <[hidden email] > > wrote: > > Hi, > > I'm reading a directory which contains a series of Dicoms and then writting > an .mha or .mhd file. > > I noticed the tags are lost (patient name, capture device, dates, series > names, etc). > > How can I keep this information? I use a resampler filter and I have tried: > resampler->SetMetaDataDictionary(reader->GetMetaDataDictionary()); > writer->SetInput(resampler->GetOutput()); > writer->UseInputMetaDataDictionaryOn(); > > With no luck.. > > Thank you, > > Matias. > > > > -- > View this message in context: > http://itk-users.7.n7.nabble.com/DicomTags-when-reading-directory-and-generating-mha-or-mhd-tp37989.html > Sent from the ITK - Users mailing list archive at Nabble.com. > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > > > > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > > > ------------------------------ > If you reply to this email, your message will be added to the discussion > below: > > http://itk-users.7.n7.nabble.com/DicomTags-when-reading-directory-and-generating-mha-or-mhd-tp37989p37990.html > To unsubscribe from DicomTags when reading directory and generating mha or > mhd..., click here > > . > NAML > > -- Matias -- View this message in context: http://itk-users.7.n7.nabble.com/DicomTags-when-reading-directory-and-generating-mha-or-mhd-tp37989p37994.html Sent from the ITK - Users mailing list archive at Nabble.com. -------------- next part -------------- An HTML attachment was scrubbed... URL: From matt.mccormick at kitware.com Mon Mar 13 10:52:55 2017 From: matt.mccormick at kitware.com (Matt McCormick) Date: Mon, 13 Mar 2017 10:52:55 -0400 Subject: [ITK-users] cmake error when configuring ITK with the variational registration module In-Reply-To: References: Message-ID: Hi, I was able to reproduce this locally -- the update checkout was failing due to some changing files. I created an issue to track this: https://issues.itk.org/jira/browse/ITK-3531 As a workaround in the meantime, try rm -rf ITK/Modules/Remote/VariationalRegistration/ Thanks, Matt On Mon, Mar 13, 2017 at 9:53 AM, Francois Budin wrote: > Hello Yann, > > I do not have such an error on my machine (only warning messages at compile > time). Could you send your entire error message? The message you sent looks > like the content of the file > "Modules/Remote/VariationalRegistration.remote.cmake" which should download > the source code of VariationalRegistration. > There are some problems however when compiling ITK with BUILD_TESTING=ON as > some testing data for this module seems to not be found, so if you want to > compile this module, you should deactivate ITK testing. > > Francois > > On Fri, Mar 10, 2017 at 4:52 PM, asertyuio via Insight-users > wrote: >> >> Hi all, >> >> Each time I include the variational registration module, I get the >> following error while configuring with ccmake : >> >> ``` >> # Insight Journal Handle: https://hdl.handle.net/10380/3460 >> # Contact: Alexander Schmidt-Richberg >> # Jan Ehrhardt >> # Rene Werner >> itk_fetch_module(VariationalRegistration >> "A module to perform variational image registration. >> https://hdl.handle.net/10380/3460" >> GIT_REPOSITORY >> >> ${git_protocol}://github.com/InsightSoftwareConsortium/ITKVariationalRegistration.git >> GIT_TAG 5110f1b4304f450b46bbbaf0f3818a4bac65b154 >> ) >> ``` >> >> I'm using the master branch in git as a version of ITK. >> >> Seems like a bug... Any idea ? >> Yann >> >> _____________________________________ >> Powered by www.kitware.com >> >> Visit other Kitware open-source projects at >> http://www.kitware.com/opensource/opensource.html >> >> Kitware offers ITK Training Courses, for more information visit: >> http://www.kitware.com/products/protraining.php >> >> Please keep messages on-topic and check the ITK FAQ at: >> http://www.itk.org/Wiki/ITK_FAQ >> >> Follow this link to subscribe/unsubscribe: >> http://public.kitware.com/mailman/listinfo/insight-users > > > > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > From scapegoat.sarthak at gmail.com Mon Mar 13 13:53:48 2017 From: scapegoat.sarthak at gmail.com (Sarthak P) Date: Mon, 13 Mar 2017 13:53:48 -0400 Subject: [ITK-users] Conical or Solid Angle Iterator Message-ID: Hello, I am looking for a conical or solid angle iterator. I found something similar to what I wanted in an older thread (see below). Does anyone know of something that could help? Thanks in advance, Sarthak > Hi > > About the "Modified()" method : > > It is already called in itkSetMacro(), > so if you change the filter parameters > using > > e.g. SetMacro( Sigma, float ); > > The code generated by this macro > will set the new value and call > Modified(). > > > Luis > > > > Thanks, Will, > > > > We want to store an indeterminant number of image feature objects such as core atoms in a given block of physical space 10-20 voxels on a side for analysis and spatial clustering. The blocks are in a regular isotropic lattice, and we want clever > > iterators that can sample ellipsoids, solid angles, etc. We have all this stuff written in my VIA package, but not yet in ITK standards. We don't want to duplicate what's available already in ITK. > > > > George > > > > Will Schroeder wrote: > > > > Hi George- > > > > Yes, but since I don't know what you're trying to do, I can't say > > that this is the best way given what's there. Could you enlighten me? > > > > Will > > > At 04:19 AM 9/22/00 -0500, George Stetten wrote: > >Dear Will, > > > >Is there anything that would prevent us from making an itkImage whose pixel type is a linked list? Damion Shelton (at Pitt) and I are working on putting "core atoms" into the itk format, and this would be a very cool approach to doing that. > > > >Thanks, > > > >George > > > > _______________________________________________ > Insight-developers mailing list > Insight-developers at public.kitware.com > http://public.kitware.com/mailman/listinfo/insight-developers -------------- next part -------------- An HTML attachment was scrubbed... URL: From dzenanz at gmail.com Mon Mar 13 14:19:31 2017 From: dzenanz at gmail.com (=?UTF-8?B?RMW+ZW5hbiBadWtpxIc=?=) Date: Mon, 13 Mar 2017 14:19:31 -0400 Subject: [ITK-users] Conical or Solid Angle Iterator In-Reply-To: References: Message-ID: Hi Sarthak, the closest thing to a solid angle iterator is line iterator . You could start from that and create a solid angle iterator. If you do so, it would be good if you submitted the patch to add it to ITK. Regards, D?enan On Mon, Mar 13, 2017 at 1:53 PM, Sarthak P wrote: > Hello, > > I am looking for a conical or solid angle iterator. I found something > similar to what I wanted in an older thread (see below). Does anyone know > of something that could help? > > Thanks in advance, > Sarthak > > > Hi > > > > About the "Modified()" method : > > > > It is already called in itkSetMacro(), > > so if you change the filter parameters > > using > > > > e.g. SetMacro( Sigma, float ); > > > > The code generated by this macro > > will set the new value and call > > Modified(). > > > > > > Luis > > > > > > > Thanks, Will, > > > > > > We want to store an indeterminant number of image feature objects > such as core atoms in a given block of physical space 10-20 voxels on a > side for analysis and spatial clustering. The blocks are in a regular > isotropic lattice, and we want clever > > > iterators that can sample ellipsoids, solid angles, etc. We have all > this stuff written in my VIA package, but not yet in ITK standards. We > don't want to duplicate what's available already in ITK. > > > > > > George > > > > > > Will Schroeder wrote: > > > > > > Hi George- > > > > > > Yes, but since I don't know what you're trying to do, I can't say > > > that this is the best way given what's there. Could you enlighten me? > > > > > > Will > > > > > At 04:19 AM 9/22/00 -0500, George Stetten wrote: > > >Dear Will, > > > > > >Is there anything that would prevent us from making an itkImage whose > pixel type is a linked list? Damion Shelton (at Pitt) and I are working on > putting "core atoms" into the itk format, and this would be a very cool > approach to doing that. > > > > > >Thanks, > > > > > >George > > > > > > > _______________________________________________ > > Insight-developers mailing list > > Insight-developers at public.kitware.com > > http://public.kitware.com/mailman/listinfo/insight-developers > > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From scapegoat.sarthak at gmail.com Mon Mar 13 15:44:56 2017 From: scapegoat.sarthak at gmail.com (Sarthak P) Date: Mon, 13 Mar 2017 15:44:56 -0400 Subject: [ITK-users] Conical or Solid Angle Iterator In-Reply-To: References: Message-ID: Hi Dzenan, Thanks for the input. I will try to get this implemented and will submit it if I am successful. Cheers, S On Mon, Mar 13, 2017 at 2:19 PM, D?enan Zuki? wrote: > Hi Sarthak, > > the closest thing to a solid angle iterator is line iterator > . You could > start from that and create a solid angle iterator. If you do so, it would > be good if you submitted the patch > to add it to ITK. > > Regards, > D?enan > > On Mon, Mar 13, 2017 at 1:53 PM, Sarthak P > wrote: > >> Hello, >> >> I am looking for a conical or solid angle iterator. I found something >> similar to what I wanted in an older thread (see below). Does anyone know >> of something that could help? >> >> Thanks in advance, >> Sarthak >> >> > Hi >> > >> > About the "Modified()" method : >> > >> > It is already called in itkSetMacro(), >> > so if you change the filter parameters >> > using >> > >> > e.g. SetMacro( Sigma, float ); >> > >> > The code generated by this macro >> > will set the new value and call >> > Modified(). >> > >> > >> > Luis >> > >> > >> > > Thanks, Will, >> > > >> > > We want to store an indeterminant number of image feature objects >> such as core atoms in a given block of physical space 10-20 voxels on a >> side for analysis and spatial clustering. The blocks are in a regular >> isotropic lattice, and we want clever >> > > iterators that can sample ellipsoids, solid angles, etc. We have >> all this stuff written in my VIA package, but not yet in ITK standards. We >> don't want to duplicate what's available already in ITK. >> > > >> > > George >> > > >> > > Will Schroeder wrote: >> > > >> > > Hi George- >> > > >> > > Yes, but since I don't know what you're trying to do, I can't say >> > > that this is the best way given what's there. Could you enlighten me? >> > > >> > > Will >> > > >> > At 04:19 AM 9/22/00 -0500, George Stetten wrote: >> > >Dear Will, >> > > >> > >Is there anything that would prevent us from making an itkImage whose >> pixel type is a linked list? Damion Shelton (at Pitt) and I are working on >> putting "core atoms" into the itk format, and this would be a very cool >> approach to doing that. >> > > >> > >Thanks, >> > > >> > >George >> > > >> > >> > _______________________________________________ >> > Insight-developers mailing list >> > Insight-developers at public.kitware.com >> > http://public.kitware.com/mailman/listinfo/insight-developers >> >> _____________________________________ >> Powered by www.kitware.com >> >> Visit other Kitware open-source projects at >> http://www.kitware.com/opensource/opensource.html >> >> Kitware offers ITK Training Courses, for more information visit: >> http://www.kitware.com/products/protraining.php >> >> Please keep messages on-topic and check the ITK FAQ at: >> http://www.itk.org/Wiki/ITK_FAQ >> >> Follow this link to subscribe/unsubscribe: >> http://public.kitware.com/mailman/listinfo/insight-users >> >> > -------------- next part -------------- An HTML attachment was scrubbed... URL: From pablo.hernandez.cerdan at outlook.com Tue Mar 14 04:54:12 2017 From: pablo.hernandez.cerdan at outlook.com (=?utf-8?B?UGFibG8gSGVybsOhbmRleg==?=) Date: Tue, 14 Mar 2017 08:54:12 +0000 Subject: [ITK-users] Metadata Information in FFT images can be misleading. Message-ID: Hey there, I am contributing with the IsotropicWavelet external module, and I am facing some doubts about the meaning of image metadata in frequency-domain images. Current behavior performing a FFTforward is to copy the input image metadata: spacing,origin, and direction to the output, even though the output is in the frequency domain or dual space. I guess it is better copy it than to lose it, but doesn't mean that the metadata is meaningful in the frequency domain. Spacing information can led the user to think that between each pixel holding a frequency value, that spacing is like a frequency resolution, but it is not. Some refresh of the lingo to help: dual space: f ~ 1/T (where T can represent time or space) Units of frequency are: Hertz = 1 / [ T ], or Radians (Rad = 2pi Hz) Spacing (or Sampling in the lingo of digital signaling processing) in a spatial domain image is associated with the resolution of the image, and represents the pixel width in physical units. The Origin is an array holding some relative units to world coordinates that are meaningful for the experimenter. What does spacing mean in a frequency domain image? The frequency resolution after an FFT is related to the size of the FFT (the size of the image) and the sampling rate of the original image (more here). Freq_bin_resolution = Freq_sampling / N. Where N is the size of the image, and Freq_sampling = 1 / Spacing. All these variables are arrays, with size equal to the dimension of the image. And the origin, in the case of the output of an FFT, depends on the layout of that particular FFT algorithm. VNL and FFTW share the same layout, where, for example, the zero frequency bin is stored the first index {{0}} , (also note that the physical units of that first index is always 0.0 Hz, regardless of origin, or spacing of the original image). If we set the Freq_sampling to {{1.0}} (corresponding to a Spacing of {{1.0}}, then the freq resolution will be {{1/N}} (depending on the size!), and the range of frequencies will always be: (-0.5, 0.5] Hz, or (-pi, pi] rads (independent of the size). So right now, in the wavelet module that works in the frequency domain, and does some shrinkage in this domain, I have chosen to ignore all this metadata, and let the user recover it if he/she needs it, but it might be worth to think about this. For example, in a shrinkage by a factor of 2, the width of a pixel representing a frequency, doubles. F_bin_resolution =1/(N/2) = 2/N, and the range of allowed frequencies keeps the same: (-Freq_sampling/2.0, Freq_sampling/2.0] or (-0.5, 0.5] or (-pi,pi] if Freq_sampling =1.0 This is all good, but hard to grasp when the metadata can be misleading. If you have any thoughts on how to improve this or be clearer to the user, happy to hear, meanwhile I think I will keep ignoring any metadata associated with the spatial domain when dealing with frequency domain images. Cheers, Pablo -------------- next part -------------- An HTML attachment was scrubbed... URL: From bakkari.abdelkhalek at hotmail.fr Tue Mar 14 13:34:41 2017 From: bakkari.abdelkhalek at hotmail.fr (Abdelkhalek Bakkari) Date: Tue, 14 Mar 2017 17:34:41 +0000 Subject: [ITK-users] Version of VTK and ITK Message-ID: Dear ITK users, How could I use two different VTK versions with one version of ITK and Qt for one application, please ? Thank you in advance. Best regards, Abdelkhalek Bakkari Ph.D candidate in Computer Science Institute of Applied Computer Science Lodz University of Technology, Poland -------------- next part -------------- An HTML attachment was scrubbed... URL: From dzenanz at gmail.com Tue Mar 14 13:48:14 2017 From: dzenanz at gmail.com (=?UTF-8?B?RMW+ZW5hbiBadWtpxIc=?=) Date: Tue, 14 Mar 2017 13:48:14 -0400 Subject: [ITK-users] Version of VTK and ITK In-Reply-To: References: Message-ID: Hi Abdelkhalek, you could try two different modules in your application which statically link to different versions of VTK. Then the main executable calls the appropriate functions in these modules. I think the easiest is to have these modules be static libraries. But why do you need two different versions of VTK? HTH, D?enan On Tue, Mar 14, 2017 at 1:34 PM, Abdelkhalek Bakkari < bakkari.abdelkhalek at hotmail.fr> wrote: > Dear ITK users, > > > How could I use two different VTK versions with one version of ITK and Qt > for one application, please ? > > > Thank you in advance. > > > Best regards, > > > Abdelkhalek Bakkari > Ph.D candidate in Computer Science > Institute of Applied Computer Science > Lodz University of Technology, Poland > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From bakkari.abdelkhalek at hotmail.fr Tue Mar 14 14:03:37 2017 From: bakkari.abdelkhalek at hotmail.fr (Abdelkhalek Bakkari) Date: Tue, 14 Mar 2017 18:03:37 +0000 Subject: [ITK-users] Version of VTK and ITK In-Reply-To: References: , Message-ID: Hi D?enan, Thank you for your prompt answer. I need two versions of VTK because I am using the 5.10.1 version for my current application and I need to use the Point Set module from the new version 7.1.0 of VTK. D?enan Abdelkhalek Bakkari Ph.D candidate in Computer Science Institute of Applied Computer Science Lodz University of Technology, Poland ________________________________ From: D?enan Zuki? Sent: 14 March 2017 18:48 To: Abdelkhalek Bakkari Cc: insight-users Subject: Re: Version of VTK and ITK Hi Abdelkhalek, you could try two different modules in your application which statically link to different versions of VTK. Then the main executable calls the appropriate functions in these modules. I think the easiest is to have these modules be static libraries. But why do you need two different versions of VTK? HTH, D?enan On Tue, Mar 14, 2017 at 1:34 PM, Abdelkhalek Bakkari > wrote: Dear ITK users, How could I use two different VTK versions with one version of ITK and Qt for one application, please ? Thank you in advance. Best regards, Abdelkhalek Bakkari Ph.D candidate in Computer Science Institute of Applied Computer Science Lodz University of Technology, Poland -------------- next part -------------- An HTML attachment was scrubbed... URL: From asertyuio at yahoo.fr Wed Mar 15 15:30:23 2017 From: asertyuio at yahoo.fr (asertyuio) Date: Wed, 15 Mar 2017 20:30:23 +0100 Subject: [ITK-users] cmake error when configuring ITK with the variational registration module In-Reply-To: References: Message-ID: <95c0bbfa-2cc3-7cc0-c2d7-f817eacd0c05@yahoo.fr> Thanks Matt and Francois ! The workaround is working. Happy to see that there is an issue created ! Yann Le 13/03/2017 ? 15:52, Matt McCormick a ?crit : > Hi, > > I was able to reproduce this locally -- the update checkout was > failing due to some changing files. I created an issue to track this: > > https://issues.itk.org/jira/browse/ITK-3531 > > As a workaround in the meantime, try > > rm -rf ITK/Modules/Remote/VariationalRegistration/ > > Thanks, > Matt > > On Mon, Mar 13, 2017 at 9:53 AM, Francois Budin > wrote: >> Hello Yann, >> >> I do not have such an error on my machine (only warning messages at compile >> time). Could you send your entire error message? The message you sent looks >> like the content of the file >> "Modules/Remote/VariationalRegistration.remote.cmake" which should download >> the source code of VariationalRegistration. >> There are some problems however when compiling ITK with BUILD_TESTING=ON as >> some testing data for this module seems to not be found, so if you want to >> compile this module, you should deactivate ITK testing. >> >> Francois >> >> On Fri, Mar 10, 2017 at 4:52 PM, asertyuio via Insight-users >> wrote: >>> Hi all, >>> >>> Each time I include the variational registration module, I get the >>> following error while configuring with ccmake : >>> >>> ``` >>> # Insight Journal Handle: https://hdl.handle.net/10380/3460 >>> # Contact: Alexander Schmidt-Richberg >>> # Jan Ehrhardt >>> # Rene Werner >>> itk_fetch_module(VariationalRegistration >>> "A module to perform variational image registration. >>> https://hdl.handle.net/10380/3460" >>> GIT_REPOSITORY >>> >>> ${git_protocol}://github.com/InsightSoftwareConsortium/ITKVariationalRegistration.git >>> GIT_TAG 5110f1b4304f450b46bbbaf0f3818a4bac65b154 >>> ) >>> ``` >>> >>> I'm using the master branch in git as a version of ITK. >>> >>> Seems like a bug... Any idea ? >>> Yann >>> >>> _____________________________________ >>> Powered by www.kitware.com >>> >>> Visit other Kitware open-source projects at >>> http://www.kitware.com/opensource/opensource.html >>> >>> Kitware offers ITK Training Courses, for more information visit: >>> http://www.kitware.com/products/protraining.php >>> >>> Please keep messages on-topic and check the ITK FAQ at: >>> http://www.itk.org/Wiki/ITK_FAQ >>> >>> Follow this link to subscribe/unsubscribe: >>> http://public.kitware.com/mailman/listinfo/insight-users >> >> >> _____________________________________ >> Powered by www.kitware.com >> >> Visit other Kitware open-source projects at >> http://www.kitware.com/opensource/opensource.html >> >> Kitware offers ITK Training Courses, for more information visit: >> http://www.kitware.com/products/protraining.php >> >> Please keep messages on-topic and check the ITK FAQ at: >> http://www.itk.org/Wiki/ITK_FAQ >> >> Follow this link to subscribe/unsubscribe: >> http://public.kitware.com/mailman/listinfo/insight-users >> From asertyuio at yahoo.fr Wed Mar 15 15:41:15 2017 From: asertyuio at yahoo.fr (asertyuio) Date: Wed, 15 Mar 2017 20:41:15 +0100 Subject: [ITK-users] fastest way of calculating highest value on watershed each line branches Message-ID: <75dcb89a-5586-d67d-3606-6f2ab505dd5c@yahoo.fr> Hi all, I'm calculating the watershed transform of an image based on some markers. Now, I want to calculate the maximum value of the image on each branch of the lines separating watershed labels. I haven't found anything in ITK to separate the different branches. I'm thinking of a good way of implementing this. My idea would be to use a neighborhood iterator marching on the lines to list pixels belonging to the different branches of the watershed lines, and then use some sort of point set to calculate the max intensity in the original image. Do you think it is a good way to go, or is there some better alternatives ? Many thanks, Yann From noreply at insightsoftwareconsortium.org Wed Mar 15 20:00:11 2017 From: noreply at insightsoftwareconsortium.org (Insight Journal) Date: Wed, 15 Mar 2017 20:00:11 -0400 (EDT) Subject: [ITK-users] New Submission: A patch-based framework for new ITK functionality: Joint fusion, denoising, and non-local super-resolution Message-ID: <20170316000011.8AAC63D620AF@insight-journal.org> Hello, A new submission has been added to the Insight Journal. Title: A patch-based framework for new ITK functionality: Joint fusion, denoising, and non-local super-resolution Authors: Tustison N., Avants B., Wang H., Xie L., Coupe P., Yushkevich P., Manjon J. Abstract: In an earlier Insight Journal article, we introduced an ITK implementation of the adaptive patch-based image denoising algorithm described in [3]. We follow-up up that offering with a generalized non-local, patch-based ITK class framework and a refactored denoising class. In addition, we provide two ITK implementations of related, well-known algorithms. The first is a non-local super resolution method described in [1, 2]. The second is the multivariate joint label fusion algorithm of [4, 5] with additional extensions, denoted as ???joint intensity fusion???, which will be described in a forthcoming manuscript. Accompanying these ITK classes are documented programming interfaces which use our previously introduced unique command line interface routines. Several 2-D examples on brain imaging data are provided to qualitatively demonstrate performance. Download and review this publication at: http://hdl.handle.net/10380/3570 Generated by the Insight Journal You are receiving this email because you asked to be informed by the Insight Journal for new submissions. To change your email preference visit http://www.insight-journal.org/ . From richard.beare at gmail.com Wed Mar 15 21:09:37 2017 From: richard.beare at gmail.com (Richard Beare) Date: Thu, 16 Mar 2017 12:09:37 +1100 Subject: [ITK-users] fastest way of calculating highest value on watershed each line branches In-Reply-To: <75dcb89a-5586-d67d-3606-6f2ab505dd5c@yahoo.fr> References: <75dcb89a-5586-d67d-3606-6f2ab505dd5c@yahoo.fr> Message-ID: This is often a little haphazard, but the usual approach I use is something along these lines: 1) Use the watershed version that marks watershed lines, and binarize the output so that the line is 1 and everything else is zero. 2) Filter this to produce a count of neighbours at each watershed voxel. You could write a custom neighbourhood filter to do this, or simply use a box mean filter, radius 1. The neighbour count is then filtervalue*filtersize - 1. You can, of course, base the following steps on the mean, as the transform is constant. 3) In 2D the non branch points will have 2 neighbours, branch points have more. Thus you can select branch points, dilate them, mask them out of the watershed line and label the result. Then you can use the label statistics filter to compute the maximum in each segment. In 3D the watershed boundaries are "sheets", so the neighbour count is more complex, but analagous. On Thu, Mar 16, 2017 at 6:41 AM, asertyuio via Insight-users < insight-users at itk.org> wrote: > Hi all, > > I'm calculating the watershed transform of an image based on some > markers. Now, I want to calculate the maximum value of the image on each > branch of the lines separating watershed labels. > > I haven't found anything in ITK to separate the different branches. > > I'm thinking of a good way of implementing this. My idea would be to use > a neighborhood iterator marching on the lines to list pixels belonging > to the different branches of the watershed lines, and then use some sort > of point set to calculate the max intensity in the original image. > > Do you think it is a good way to go, or is there some better alternatives ? > > Many thanks, > > Yann > > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > -------------- next part -------------- An HTML attachment was scrubbed... URL: From asertyuio at yahoo.fr Thu Mar 16 12:15:11 2017 From: asertyuio at yahoo.fr (asertyuio) Date: Thu, 16 Mar 2017 17:15:11 +0100 Subject: [ITK-users] fastest way of calculating highest value on watershed each line branches In-Reply-To: References: <75dcb89a-5586-d67d-3606-6f2ab505dd5c@yahoo.fr> Message-ID: Ok, I'll go for that ! Many thanks Richard, for your quick answer ! Yann Le 16/03/2017 ? 02:09, Richard Beare a ?crit : > This is often a little haphazard, but the usual approach I use is > something along these lines: > > 1) Use the watershed version that marks watershed lines, and binarize > the output so that the line is 1 and everything else is zero. > > 2) Filter this to produce a count of neighbours at each watershed > voxel. You could write a custom neighbourhood filter to do this, or > simply use a box mean filter, radius 1. The neighbour count is then > filtervalue*filtersize - 1. You can, of course, base the following > steps on the mean, as the transform is constant. > > 3) In 2D the non branch points will have 2 neighbours, branch points > have more. Thus you can select branch points, dilate them, mask them > out of the watershed line and label the result. Then you can use the > label statistics filter to compute the maximum in each segment. In 3D > the watershed boundaries are "sheets", so the neighbour count is more > complex, but analagous. > > On Thu, Mar 16, 2017 at 6:41 AM, asertyuio via Insight-users > > wrote: > > Hi all, > > I'm calculating the watershed transform of an image based on some > markers. Now, I want to calculate the maximum value of the image > on each > branch of the lines separating watershed labels. > > I haven't found anything in ITK to separate the different branches. > > I'm thinking of a good way of implementing this. My idea would be > to use > a neighborhood iterator marching on the lines to list pixels belonging > to the different branches of the watershed lines, and then use > some sort > of point set to calculate the max intensity in the original image. > > Do you think it is a good way to go, or is there some better > alternatives ? > > Many thanks, > > Yann > > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From matt.mccormick at kitware.com Thu Mar 16 15:43:43 2017 From: matt.mccormick at kitware.com (Matt McCormick) Date: Thu, 16 Mar 2017 15:43:43 -0400 Subject: [ITK-users] Metadata Information in FFT images can be misleading. In-Reply-To: References: Message-ID: Hi Pablo, Thanks for discussing this issue and the excellent overview of the topic. The meaning of metadata in the frequency domain could definitely a source of confusion and bugs, and we would benefit from a clarity and consensus on the subject. For practical reasons of pipeline use and existing algorithm application, re-use of itk::Image as much about seems beneficial. What do you think about adding documentation to itk::ImageBase::GetSpacing() [1]? We could state that the Spacing is always in physical units. If the image is in the frequency domain, then Spacing is equal to 1 / Frequency Sampling and the Frequency Bin Resolution equals 1 / (Frequency Sampling * N), where N is the Size of the LargestPossibleImageRegion (but not in the half-Hermitian storage). Then, the frequency shrinkage filter would increase its output Spacing accordingly so metadata is updated throughout an analysis pipeline. Thanks, Matt [1] https://itk.org/Doxygen/html/classitk_1_1ImageBase.html#aaadef7c0a9627cf22b0fbf2de6de913c On Tue, Mar 14, 2017 at 4:54 AM, Pablo Hern?ndez wrote: > Hey there, > > I am contributing with the IsotropicWavelet external module, and I am facing > some doubts about the meaning of image metadata in frequency-domain images. > > Current behavior performing a FFTforward is to copy the input image > metadata: spacing,origin, and direction to the output, even though the > output is in the frequency domain or dual space. I guess it is better copy > it than to lose it, but doesn't mean that the metadata is meaningful in the > frequency domain. Spacing information can led the user to think that between > each pixel holding a frequency value, that spacing is like a frequency > resolution, but it is not. > > Some refresh of the lingo to help: > dual space: f ~ 1/T (where T can represent time or space) > Units of frequency are: Hertz = 1 / [ T ], or Radians (Rad = 2pi Hz) > Spacing (or Sampling in the lingo of digital signaling processing) in a > spatial domain image is associated with the resolution of the image, and > represents the pixel width in physical units. > The Origin is an array holding some relative units to world coordinates that > are meaningful for the experimenter. > > What does spacing mean in a frequency domain image? The frequency resolution > after an FFT is related to the size of the FFT (the size of the image) and > the sampling rate of the original image (more here). > > Freq_bin_resolution = Freq_sampling / N. Where N is the size of the image, > and Freq_sampling = 1 / Spacing. All these variables are arrays, with size > equal to the dimension of the image. > > And the origin, in the case of the output of an FFT, depends on the layout > of that particular FFT algorithm. VNL and FFTW share the same layout, where, > for example, the zero frequency bin is stored the first index {{0}} , (also > note that the physical units of that first index is always 0.0 Hz, > regardless of origin, or spacing of the original image). > > If we set the Freq_sampling to {{1.0}} (corresponding to a Spacing of > {{1.0}}, then the freq resolution will be {{1/N}} (depending on the size!), > and the range of frequencies will always be: (-0.5, 0.5] Hz, or (-pi, pi] > rads (independent of the size). > > So right now, in the wavelet module that works in the frequency domain, and > does some shrinkage in this domain, I have chosen to ignore all this > metadata, and let the user recover it if he/she needs it, but it might be > worth to think about this. > > For example, in a shrinkage by a factor of 2, the width of a pixel > representing a frequency, doubles. F_bin_resolution =1/(N/2) = 2/N, and the > range of allowed frequencies keeps the same: (-Freq_sampling/2.0, > Freq_sampling/2.0] or (-0.5, 0.5] or (-pi,pi] if Freq_sampling =1.0 > > This is all good, but hard to grasp when the metadata can be misleading. If > you have any thoughts on how to improve this or be clearer to the user, > happy to hear, meanwhile I think I will keep ignoring any metadata > associated with the spatial domain when dealing with frequency domain > images. > > Cheers, > Pablo > > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > From cyril.mory at creatis.insa-lyon.fr Fri Mar 17 11:21:58 2017 From: cyril.mory at creatis.insa-lyon.fr (Cyril Mory) Date: Fri, 17 Mar 2017 16:21:58 +0100 Subject: [ITK-users] Reading nifti files Message-ID: Hi ITK users, I have recently started working with nifti files, to collaborate with a colleague that uses this format. But the itk::ImageFileReader does not correctly open the nifti files I have (image size, offset and direction matrix are wrong). I use a recent version of ITK (commit from Feb 6 18:02:49 2017), but my colleague has his own fork from nifti_reg, which is several years old. Two questions: - Does someone have experience in manipulating nifti files from ITK, and if so, is it supposed to work fine ? - Have there been important modifications in the nifti format in the last years, which the ITK reader would have followed, and which could cause the issues I'm seeing when opening old ones ? Best regards, Cyril From scapegoat.sarthak at gmail.com Fri Mar 17 11:34:45 2017 From: scapegoat.sarthak at gmail.com (Sarthak P) Date: Fri, 17 Mar 2017 11:34:45 -0400 Subject: [ITK-users] Reading nifti files In-Reply-To: References: Message-ID: For NIfTI I/O, I'd suggest you stick to the latest tags as they up to date regarding the latest standards. What exactly do you mean my manipulation? There is an ITK filter to change image information ( https://itk.org/Doxygen/html/classitk_1_1ChangeInformationImageFilter.html) but that only happens AFTER itk::ImageFileReader has done its work. Could you possibly try to get your collaborator to write a few images using a latest variant of ITK (preferably version matched with yours for consistency)? If not, then perhaps try to read the information in the header using the example in https://itk.org/Wiki/ITK/Examples/IO/ReadUnknownImageType and then do comparisons between what you expect. All the best, S On Fri, Mar 17, 2017 at 11:21 AM, Cyril Mory < cyril.mory at creatis.insa-lyon.fr> wrote: > Hi ITK users, > > I have recently started working with nifti files, to collaborate with a > colleague that uses this format. But the itk::ImageFileReader does not > correctly open the nifti files I have (image size, offset and direction > matrix are wrong). I use a recent version of ITK (commit from Feb 6 > 18:02:49 2017), but my colleague has his own fork from nifti_reg, which is > several years old. > > Two questions: > - Does someone have experience in manipulating nifti files from ITK, and > if so, is it supposed to work fine ? > - Have there been important modifications in the nifti format in the last > years, which the ITK reader would have followed, and which could cause the > issues I'm seeing when opening old ones ? > > Best regards, > Cyril > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > -------------- next part -------------- An HTML attachment was scrubbed... URL: From bakkari.abdelkhalek at hotmail.fr Fri Mar 17 11:36:50 2017 From: bakkari.abdelkhalek at hotmail.fr (Abdelkhalek Bakkari) Date: Fri, 17 Mar 2017 15:36:50 +0000 Subject: [ITK-users] Reading nifti files In-Reply-To: References: Message-ID: Hi Cyril, I am using ITK to read and process the NIFTI files and it is working quite good. Kind regards, Abdelkhalek Bakkari Ph.D candidate in Computer Science Institute of Applied Computer Science Lodz University of Technology, Poland ________________________________ From: Insight-users on behalf of Cyril Mory Sent: 17 March 2017 16:21 To: insight-users at itk.org Subject: [ITK-users] Reading nifti files Hi ITK users, I have recently started working with nifti files, to collaborate with a colleague that uses this format. But the itk::ImageFileReader does not correctly open the nifti files I have (image size, offset and direction matrix are wrong). I use a recent version of ITK (commit from Feb 6 18:02:49 2017), but my colleague has his own fork from nifti_reg, which is several years old. Two questions: - Does someone have experience in manipulating nifti files from ITK, and if so, is it supposed to work fine ? - Have there been important modifications in the nifti format in the last years, which the ITK reader would have followed, and which could cause the issues I'm seeing when opening old ones ? Best regards, Cyril _____________________________________ Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Kitware offers ITK Training Courses, for more information visit: http://www.kitware.com/products/protraining.php Please keep messages on-topic and check the ITK FAQ at: http://www.itk.org/Wiki/ITK_FAQ Follow this link to subscribe/unsubscribe: http://public.kitware.com/mailman/listinfo/insight-users -------------- next part -------------- An HTML attachment was scrubbed... URL: From cyril.mory at creatis.insa-lyon.fr Fri Mar 17 11:46:56 2017 From: cyril.mory at creatis.insa-lyon.fr (Cyril Mory) Date: Fri, 17 Mar 2017 16:46:56 +0100 Subject: [ITK-users] Reading nifti files In-Reply-To: References: Message-ID: Thanks for this answer. By manipulation, I essentially mean reading a 6D .nii file, extracting sub images, and writing them to .mhd format, hopefully keeping the correct image information throughout the process. I'll see if my colleague can write to a more recent format, and otherwise follow your advice about ReadUnknownImageType. Best, Cyril On 17/03/2017 16:34, Sarthak P wrote: > For NIfTI I/O, I'd suggest you stick to the latest tags as they up to > date regarding the latest standards. > > What exactly do you mean my manipulation? There is an ITK filter to > change image information > (https://itk.org/Doxygen/html/classitk_1_1ChangeInformationImageFilter.html) > but that only happens AFTER itk::ImageFileReader has done its work. > > Could you possibly try to get your collaborator to write a few images > using a latest variant of ITK (preferably version matched with yours > for consistency)? If not, then perhaps try to read the information in > the header using the example in > https://itk.org/Wiki/ITK/Examples/IO/ReadUnknownImageType and then do > comparisons between what you expect. > > All the best, > S > > On Fri, Mar 17, 2017 at 11:21 AM, Cyril Mory > > wrote: > > Hi ITK users, > > I have recently started working with nifti files, to collaborate > with a colleague that uses this format. But the > itk::ImageFileReader does not correctly open the nifti files I > have (image size, offset and direction matrix are wrong). I use a > recent version of ITK (commit from Feb 6 18:02:49 2017), but my > colleague has his own fork from nifti_reg, which is several years old. > > Two questions: > - Does someone have experience in manipulating nifti files from > ITK, and if so, is it supposed to work fine ? > - Have there been important modifications in the nifti format in > the last years, which the ITK reader would have followed, and > which could cause the issues I'm seeing when opening old ones ? > > Best regards, > Cyril > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From blowekamp at mail.nih.gov Fri Mar 17 15:50:23 2017 From: blowekamp at mail.nih.gov (Lowekamp, Bradley (NIH/NLM/LHC) [C]) Date: Fri, 17 Mar 2017 19:50:23 +0000 Subject: [ITK-users] [ANN] SimpleITK 1.0 Release Candidate 2 Message-ID: On behalf of the SimpleITK developers and the Insight Software Consortium community, we are pleased to announce the release of the SimpleITK 1.0 Release Candidate 2! For the second release candidate in addition to the source code distributions and the language specific ?front-ends?, where are providing binary Python wheels. A number of binary Python wheels are available for download and testing. It is important to have the latest version form pip to ensure correct wheel compatibility. To install the SimpleITK package: pip install --upgrade pip pip install --pre -f https://github.com/SimpleITK/SimpleITK/releases/tag/v1.0rc2 SimpleITK We encourage users to build SimpleITK v1.0rc2 from the source (https://itk.org/Wiki/SimpleITK/GettingStarted#Build_It_Yourself) as well as to download and test the rc2 binaries. There are a number of language specific "front-ends? which can be used to build SimpleITK: - Python - https://github.com/SimpleITK/SimpleITKPythonPackage - R - https://github.com/SimpleITK/SimpleITKRInstaller - Lua - https://github.com/SimpleITK/SimpleITKLuaRock - Anaconda - https://github.com/SimpleITK/SimpleITKCondaRecipe Release Candidate 2 Notes: - Additional Improvements: - Updated ITK version along 4.11 release branch - Reorganized examples directory - Reorganized filter libraries to match ITK modules - Improved compilation with more specific ITK module usage - Now using modern CMake 3 style properties for exported libraries - API Changes - Depricated CMake variables with "SITK" prefix, now consistenly using the "SimpleITK" prefix for configurable CMake variables - Removed `ImageSeriesReader::GetGDCMSeriesFileNames` parameter `loadPrivateTags` parameter. This removes an overloaded version of the class method. - Added `sitkWallClock` enum for a sentinel value for random number seed to indicate initialization from the clock Release Candidate 1 Notes: * Key Improvements: - Improved Python data bridge - New Python method `GetArrayViewFromImage` provides copy free read-only access - Updated Python data structures to use `memory view` objects - Building SimpleITK wrappers: - R devtools based installer (https://github.com/SimpleITK/SimpleITKRInstaller). - Python: scripts for building wheels (https://github.com/SimpleITK/SimpleITKPythonPackage) and a Conda recipe (https://github.com/SimpleITK/SimpleITKCondaRecipe). - Support use of virtual image domain in the `ImageRegistrationMethod`. - OnePlusOneOptimizer added to registration framework. - Improved support for R: propogating C++ exceptions into R, additional R tests. - Additional tests for Java. - Python and R notebooks repository illustrating the basics and more advanced functionality of SimpleITK (https://github.com/InsightSoftwareConsortium/SimpleITK-Notebooks). - Added continous integration via CircleCI. - Updated version and improved integration of Google Test. - Updated ITK version to 4.11 - Updated minimal required CMake version to 3.0, and numerous CMake changes to support various build configurations. - Updated to usage of SWIG 3.0.11 ( using the latest SIWG is strongly recommended for R ) - Reorganized examples directory into example based sub-directories with multiple languages - Improvements to documentation transmogrification scripts - Many bug fixes and improvement to the build system! * API changes: - R methods which previously unnecessarily returned self return void. - New method `Image::GetNumberOfPixels` - New method `LabelMapContourOverlayImageFilter::SetColormap` - New method `LabelMapToRGBImageFilter::SetColormap` - New method `ImageRegistrationMethod::SetVirtualDomain` - New method `ImageRegistrationMethod::SetVirtualDomainFromImage` - New seed parameter to `ImageRegistrationMethod::AddMetricSamplingSeed` method - `CastImageFilter::SetOutputPixelType` method no longer accepts the pixel ID by value, uses only enumerated type. Please try out SimpleITK 1.0rc2, and report any issues! Enjoy! Bradley Lowekamp -------------- next part -------------- An HTML attachment was scrubbed... URL: From matimontg at gmail.com Sun Mar 19 20:29:18 2017 From: matimontg at gmail.com (Matias) Date: Sun, 19 Mar 2017 17:29:18 -0700 (MST) Subject: [ITK-users] Modify ImagePositionPatient and maintain Image position in the frame? Message-ID: <1489969758792-38015.post@n7.nabble.com> Hi, Is there a way to modify the Origin or ImagePositionPatient tag of an image and keep it in the same place it was before? ITK changes the image position when you change its origin which is what I expect to happen but we need to modify the image origin tag and keep the image in the same place. This is used to do some calculations in different Estereotactic frames. Thank you, Matias. -- View this message in context: http://itk-users.7.n7.nabble.com/Modify-ImagePositionPatient-and-maintain-Image-position-in-the-frame-tp38015.html Sent from the ITK - Users mailing list archive at Nabble.com. From matimontg at gmail.com Sun Mar 19 21:59:50 2017 From: matimontg at gmail.com (Matias) Date: Sun, 19 Mar 2017 18:59:50 -0700 (MST) Subject: [ITK-users] Modify ImagePositionPatient and maintain Image position in the frame? In-Reply-To: <1489969758792-38015.post@n7.nabble.com> References: <1489969758792-38015.post@n7.nabble.com> Message-ID: <1489975190892-38016.post@n7.nabble.com> I just found the way. Had to use serieswriter and change the tag manually. I used the example ResampleDicom.cxx Regards, -- View this message in context: http://itk-users.7.n7.nabble.com/Modify-ImagePositionPatient-and-maintain-Image-position-in-the-frame-tp38015p38016.html Sent from the ITK - Users mailing list archive at Nabble.com. From asertyuio at yahoo.fr Mon Mar 20 19:46:55 2017 From: asertyuio at yahoo.fr (asertyuio) Date: Tue, 21 Mar 2017 00:46:55 +0100 Subject: [ITK-users] auto keyword and New() smart pointer In-Reply-To: References: Message-ID: <0c50035e-fdb2-1d74-608f-fc7be08ef18d@yahoo.fr> Hey there, I'm wondering if it was safe to use the auto keyword along with the itk New() smart pointer creator. Thanks in advance for your answer ! Yann From hans-johnson at uiowa.edu Mon Mar 20 20:43:24 2017 From: hans-johnson at uiowa.edu (Johnson, Hans J) Date: Tue, 21 Mar 2017 00:43:24 +0000 Subject: [ITK-users] auto keyword and New() smart pointer In-Reply-To: <0c50035e-fdb2-1d74-608f-fc7be08ef18d@yahoo.fr> References: <0c50035e-fdb2-1d74-608f-fc7be08ef18d@yahoo.fr> Message-ID: <7D94F016-18A7-4F89-9361-486AA6561E8E@uiowa.edu> Yann, It will work only if you are compiling with C++11, and you have no intention of sharing your code with others who may not use C++11 syntax. ITK proper currently maintains backwards compatibility with older versions of C++. Hans -- On 3/20/17, 6:46 PM, "Insight-users on behalf of asertyuio via Insight-users" wrote: Hey there, I'm wondering if it was safe to use the auto keyword along with the itk New() smart pointer creator. Thanks in advance for your answer ! Yann _____________________________________ Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Kitware offers ITK Training Courses, for more information visit: http://www.kitware.com/products/protraining.php Please keep messages on-topic and check the ITK FAQ at: http://www.itk.org/Wiki/ITK_FAQ Follow this link to subscribe/unsubscribe: http://public.kitware.com/mailman/listinfo/insight-users From asertyuio at yahoo.fr Tue Mar 21 06:45:07 2017 From: asertyuio at yahoo.fr (asertyuio) Date: Tue, 21 Mar 2017 11:45:07 +0100 Subject: [ITK-users] auto keyword and New() smart pointer In-Reply-To: <7D94F016-18A7-4F89-9361-486AA6561E8E@uiowa.edu> References: <0c50035e-fdb2-1d74-608f-fc7be08ef18d@yahoo.fr> <7D94F016-18A7-4F89-9361-486AA6561E8E@uiowa.edu> Message-ID: <5faa49b1-4dda-5dea-bb91-43ec7b5a2cc8@yahoo.fr> Hi Hans, Thanks for your answer ! I was asking that because when I use auto keyword with a filter output, it seems like is result in a normal point type, not a smart pointer, so a code with |auto testOutput = testFilter->GetOutput(); | has not the same behavior as |FilterOutputType::Pointer testOutput = testFilter->GetOutput(); | |testOutput| is a smart pointer in the second case, and a normal pointer in the first one. I was wondering if it could interfere with the smart pointer role (for example causing memory leak, or wrong reference count). After a deeper look, |New()| return a smart pointer (so with auto =, no problem) and |GetOutput()| a pointer. So the second code snipset just creates another instance of a smart pointer. I hope what was my question is now clearer ! Yann Le 21/03/2017 ? 01:43, Johnson, Hans J a ?crit : > Yann, > > It will work only if you are compiling with C++11, and you have no intention of sharing your code with others who may not use C++11 syntax. > > ITK proper currently maintains backwards compatibility with older versions of C++. > > Hans > > ? -------------- next part -------------- An HTML attachment was scrubbed... URL: From francois.budin at kitware.com Tue Mar 21 08:38:34 2017 From: francois.budin at kitware.com (Francois Budin) Date: Tue, 21 Mar 2017 08:38:34 -0400 Subject: [ITK-users] auto keyword and New() smart pointer In-Reply-To: <5faa49b1-4dda-5dea-bb91-43ec7b5a2cc8@yahoo.fr> References: <0c50035e-fdb2-1d74-608f-fc7be08ef18d@yahoo.fr> <7D94F016-18A7-4F89-9361-486AA6561E8E@uiowa.edu> <5faa49b1-4dda-5dea-bb91-43ec7b5a2cc8@yahoo.fr> Message-ID: Hello Yann, Indeed, you are correct. New() will return a smart pointer, but other methods will return a pointer, so you cannot use the keyword "auto" with these other methods. The two following links give some insight in why ITK is implemented this way: https://itk.org/Wiki/ITK/Examples/Utilities/ReturnObjectFromFunction https://itk.org/pipermail/insight-developers/2011-April/018011.html Hope this helps, Francois On Tue, Mar 21, 2017 at 6:45 AM, asertyuio via Insight-users < insight-users at itk.org> wrote: > Hi Hans, > > Thanks for your answer ! > > I was asking that because when I use auto keyword with a filter output, it > seems like is result in a normal point type, not a smart pointer, so a code > with > > auto testOutput = testFilter->GetOutput(); > > has not the same behavior as > > FilterOutputType::Pointer testOutput = testFilter->GetOutput(); > > testOutput is a smart pointer in the second case, and a normal pointer in > the first one. > > I was wondering if it could interfere with the smart pointer role (for > example causing memory leak, or wrong reference count). > > After a deeper look, New() return a smart pointer (so with auto =, no > problem) and GetOutput() a pointer. So the second code snipset just > creates another instance of a smart pointer. > > I hope what was my question is now clearer ! > Yann > > Le 21/03/2017 ? 01:43, Johnson, Hans J a ?crit : > > Yann, > > It will work only if you are compiling with C++11, and you have no intention of sharing your code with others who may not use C++11 syntax. > > ITK proper currently maintains backwards compatibility with older versions of C++. > > Hans > > > > ? > > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From kiran.j88 at gmail.com Tue Mar 21 10:49:26 2017 From: kiran.j88 at gmail.com (Kiran Joshi) Date: Tue, 21 Mar 2017 14:49:26 +0000 Subject: [ITK-users] auto keyword and New() smart pointer In-Reply-To: References: <0c50035e-fdb2-1d74-608f-fc7be08ef18d@yahoo.fr> <7D94F016-18A7-4F89-9361-486AA6561E8E@uiowa.edu> <5faa49b1-4dda-5dea-bb91-43ec7b5a2cc8@yahoo.fr> Message-ID: Hi Francois, Maybe I misunderstood, but I disagree with your statement that "you cannot use the keyword auto with these other methods" Attached is a screenshot showing a small ITK test program in a Visual Studio debugging session. The program is very simple; an AddImages() function is called, which itself calls a CreateImage() function twice before adding the created images and returning the result. Note that I have used *auto* when storing the image pointers returned by the CreateImage and AddImage functions. On the right of the image you can see snapshots of the memory usage as the program executes, and I have also annotated which lines of the program were executed immediately before taking the snapshot. The first snapshot show that on line 22, very little memory has been allocated, since we have not yet created any images. On line 23 ~16MB of memory is used when the first image is created. On line 24 ~32MB is used after the 2nd image is created. On line 30 the two images are added together and the result is returned from the function. At this point ~48MB is used because all 3 image still exist in memory. On line 31 we exit from the AddImages() function and can see that the memory for two temporary images has been correctly deallocated, since the *im1* and *im2* pointers have gone out of scope. Finally on line 38 we exit the main() function and see that the memory usage returns to ~0MB, since the *image* variable also goes out of scope and the memory associated with it is deallocated. Based on this simple test I think that it is probably safe to use *auto* to store the output from filters. It does not look like it interferes with the reference counting or leads to memory leaks, as Yann was worried about. Let me know if you see any mistakes in my tests! Kiran [image: ITKPointerTest.png] On Tue, 21 Mar 2017 at 12:38 Francois Budin wrote: > Hello Yann, > > Indeed, you are correct. New() will return a smart pointer, but other > methods will return a pointer, so you cannot use the keyword "auto" with > these other methods. > The two following links give some insight in why ITK is implemented this > way: > https://itk.org/Wiki/ITK/Examples/Utilities/ReturnObjectFromFunction > https://itk.org/pipermail/insight-developers/2011-April/018011.html > > Hope this helps, > Francois > > On Tue, Mar 21, 2017 at 6:45 AM, asertyuio via Insight-users < > insight-users at itk.org> wrote: > > Hi Hans, > > Thanks for your answer ! > > I was asking that because when I use auto keyword with a filter output, it > seems like is result in a normal point type, not a smart pointer, so a code > with > > auto testOutput = testFilter->GetOutput(); > > has not the same behavior as > > FilterOutputType::Pointer testOutput = testFilter->GetOutput(); > > testOutput is a smart pointer in the second case, and a normal pointer in > the first one. > > I was wondering if it could interfere with the smart pointer role (for > example causing memory leak, or wrong reference count). > > After a deeper look, New() return a smart pointer (so with auto =, no > problem) and GetOutput() a pointer. So the second code snipset just > creates another instance of a smart pointer. > > I hope what was my question is now clearer ! > Yann > > Le 21/03/2017 ? 01:43, Johnson, Hans J a ?crit : > > Yann, > > It will work only if you are compiling with C++11, and you have no intention of sharing your code with others who may not use C++11 syntax. > > ITK proper currently maintains backwards compatibility with older versions of C++. > > Hans > > > > ? > > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > > > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: ITKPointerTest.png Type: image/png Size: 154512 bytes Desc: not available URL: From blowekamp at mail.nih.gov Tue Mar 21 10:59:39 2017 From: blowekamp at mail.nih.gov (Lowekamp, Bradley (NIH/NLM/LHC) [C]) Date: Tue, 21 Mar 2017 14:59:39 +0000 Subject: [ITK-users] [ITK] auto keyword and New() smart pointer In-Reply-To: References: <0c50035e-fdb2-1d74-608f-fc7be08ef18d@yahoo.fr> <7D94F016-18A7-4F89-9361-486AA6561E8E@uiowa.edu> <5faa49b1-4dda-5dea-bb91-43ec7b5a2cc8@yahoo.fr> Message-ID: <53D7FB39-E6EB-4AF1-9669-DD605C99A13B@mail.nih.gov> Hello, Your code and description illustrates the problem with the implicit auto type. Based on this simple test I think that it is probably safe to use auto to store the output from filters. It does not look like it interferes with the reference counting or leads to memory leaks, as Yann was worried about. This can be problematic: auto testOutput = testFilter->GetOutput(); But that is not what you are doing in your example. When you use the ?auto? type you need to be careful to determine if the type is a raw pointer or a smart pointer. The GetOutput methods returns an raw pointer without reference counting. This is the type auto is above. However in your example the return type for your method is ImageType::Pointer, which is an ITK smart pointer. Your code adds an implicit cast for the raw pointer to ITK?s smart pointer. And this is not made clear by the usage of auto. HTH, Brad On Mar 21, 2017, at 10:49 AM, Kiran Joshi > wrote: Hi Francois, Maybe I misunderstood, but I disagree with your statement that "you cannot use the keyword auto with these other methods" Attached is a screenshot showing a small ITK test program in a Visual Studio debugging session. The program is very simple; an AddImages() function is called, which itself calls a CreateImage() function twice before adding the created images and returning the result. Note that I have used auto when storing the image pointers returned by the CreateImage and AddImage functions. On the right of the image you can see snapshots of the memory usage as the program executes, and I have also annotated which lines of the program were executed immediately before taking the snapshot. The first snapshot show that on line 22, very little memory has been allocated, since we have not yet created any images. On line 23 ~16MB of memory is used when the first image is created. On line 24 ~32MB is used after the 2nd image is created. On line 30 the two images are added together and the result is returned from the function. At this point ~48MB is used because all 3 image still exist in memory. On line 31 we exit from the AddImages() function and can see that the memory for two temporary images has been correctly deallocated, since the im1 and im2 pointers have gone out of scope. Finally on line 38 we exit the main() function and see that the memory usage returns to ~0MB, since the image variable also goes out of scope and the memory associated with it is deallocated. Let me know if you see any mistakes in my tests! Kiran On Tue, 21 Mar 2017 at 12:38 Francois Budin > wrote: Hello Yann, Indeed, you are correct. New() will return a smart pointer, but other methods will return a pointer, so you cannot use the keyword "auto" with these other methods. The two following links give some insight in why ITK is implemented this way: https://itk.org/Wiki/ITK/Examples/Utilities/ReturnObjectFromFunction https://itk.org/pipermail/insight-developers/2011-April/018011.html Hope this helps, Francois On Tue, Mar 21, 2017 at 6:45 AM, asertyuio via Insight-users > wrote: Hi Hans, Thanks for your answer ! I was asking that because when I use auto keyword with a filter output, it seems like is result in a normal point type, not a smart pointer, so a code with auto testOutput = testFilter->GetOutput(); has not the same behavior as FilterOutputType::Pointer testOutput = testFilter->GetOutput(); testOutput is a smart pointer in the second case, and a normal pointer in the first one. I was wondering if it could interfere with the smart pointer role (for example causing memory leak, or wrong reference count). After a deeper look, New() return a smart pointer (so with auto =, no problem) and GetOutput() a pointer. So the second code snipset just creates another instance of a smart pointer. I hope what was my question is now clearer ! Yann Le 21/03/2017 ? 01:43, Johnson, Hans J a ?crit : Yann, It will work only if you are compiling with C++11, and you have no intention of sharing your code with others who may not use C++11 syntax. ITK proper currently maintains backwards compatibility with older versions of C++. Hans ? _____________________________________ Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Kitware offers ITK Training Courses, for more information visit: http://www.kitware.com/products/protraining.php Please keep messages on-topic and check the ITK FAQ at: http://www.itk.org/Wiki/ITK_FAQ Follow this link to subscribe/unsubscribe: http://public.kitware.com/mailman/listinfo/insight-users _____________________________________ Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Kitware offers ITK Training Courses, for more information visit: http://www.kitware.com/products/protraining.php Please keep messages on-topic and check the ITK FAQ at: http://www.itk.org/Wiki/ITK_FAQ Follow this link to subscribe/unsubscribe: http://public.kitware.com/mailman/listinfo/insight-users _____________________________________ Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Kitware offers ITK Training Courses, for more information visit: http://www.kitware.com/products/protraining.php Please keep messages on-topic and check the ITK FAQ at: http://www.itk.org/Wiki/ITK_FAQ Follow this link to subscribe/unsubscribe: http://public.kitware.com/mailman/listinfo/insight-users _______________________________________________ Community mailing list Community at itk.org http://public.kitware.com/mailman/listinfo/community -------------- next part -------------- An HTML attachment was scrubbed... URL: From kiran.j88 at gmail.com Tue Mar 21 11:22:20 2017 From: kiran.j88 at gmail.com (Kiran Joshi) Date: Tue, 21 Mar 2017 15:22:20 +0000 Subject: [ITK-users] [ITK] auto keyword and New() smart pointer In-Reply-To: <53D7FB39-E6EB-4AF1-9669-DD605C99A13B@mail.nih.gov> References: <0c50035e-fdb2-1d74-608f-fc7be08ef18d@yahoo.fr> <7D94F016-18A7-4F89-9361-486AA6561E8E@uiowa.edu> <5faa49b1-4dda-5dea-bb91-43ec7b5a2cc8@yahoo.fr> <53D7FB39-E6EB-4AF1-9669-DD605C99A13B@mail.nih.gov> Message-ID: Hi Brad, Thanks for correcting me. When I replace my AddImages() function with what's below, the memory for the *result* image still gets cleaned up automatically at the correct time. Would you be able to give an example were the use of *auto* could lead to a memory leak? Since I guess I'm still not understanding the problem fully. Thanks, Kiran ImageType::Pointer AddImages(short a, short b) { auto im1 = CreateImage(a); auto im2 = CreateImage(b); AddFilterType::Pointer adder = AddFilterType::New(); adder->SetInput1(im1); adder->SetInput2(im2); adder->Update(); * auto result = adder->GetOutput();* AddFilterType::Pointer adder2 = AddFilterType::New(); adder2->SetInput1(im1); adder2->SetInput2(result); adder2->Update(); auto result2 = adder2->GetOutput(); return result2; } On Tue, 21 Mar 2017 at 14:59 Lowekamp, Bradley (NIH/NLM/LHC) [C] < blowekamp at mail.nih.gov> wrote: > Hello, > > Your code and description illustrates the problem with the implicit auto > type. > > > Based on this simple test I think that it is probably safe to use *auto* to > store the output from filters. It does not look like it interferes with the > reference counting or leads to memory leaks, as Yann was worried about. > > > This can be problematic: > auto testOutput = testFilter->GetOutput(); > > But that is not what you are doing in your example. When you use the > ?auto? type you need to be careful to determine if the type is a raw > pointer or a smart pointer. The GetOutput methods returns an raw pointer > without reference counting. This is the type auto is above. > > However in your example the return type for your method is > ImageType::Pointer, which is an ITK smart pointer. Your code adds an > implicit cast for the raw pointer to ITK?s smart pointer. And this is not > made clear by the usage of auto. > > HTH, > Brad > > > On Mar 21, 2017, at 10:49 AM, Kiran Joshi wrote: > > Hi Francois, > > Maybe I misunderstood, but I disagree with your statement that "you cannot > use the keyword auto with these other methods" > > Attached is a screenshot showing a small ITK test program in a Visual > Studio debugging session. > > The program is very simple; an AddImages() function is called, which > itself calls a CreateImage() function twice before adding the created > images and returning the result. > Note that I have used *auto* when storing the image pointers returned by > the CreateImage and AddImage functions. > > On the right of the image you can see snapshots of the memory usage as the > program executes, and I have also annotated which lines of the program were > executed immediately before taking the snapshot. > > The first snapshot show that on line 22, very little memory has been > allocated, since we have not yet created any images. > On line 23 ~16MB of memory is used when the first image is created. > On line 24 ~32MB is used after the 2nd image is created. > On line 30 the two images are added together and the result is returned > from the function. At this point ~48MB is used because all 3 image still > exist in memory. > On line 31 we exit from the AddImages() function and can see that the > memory for two temporary images has been correctly deallocated, since the > *im1* and *im2* pointers have gone out of scope. > Finally on line 38 we exit the main() function and see that the memory > usage returns to ~0MB, since the *image* variable also goes out of scope > and the memory associated with it is deallocated. > > > Let me know if you see any mistakes in my tests! > Kiran > > > > > On Tue, 21 Mar 2017 at 12:38 Francois Budin > wrote: > > Hello Yann, > > Indeed, you are correct. New() will return a smart pointer, but other > methods will return a pointer, so you cannot use the keyword "auto" with > these other methods. > The two following links give some insight in why ITK is implemented this > way: > https://itk.org/Wiki/ITK/Examples/Utilities/ReturnObjectFromFunction > https://itk.org/pipermail/insight-developers/2011-April/018011.html > > Hope this helps, > Francois > > On Tue, Mar 21, 2017 at 6:45 AM, asertyuio via Insight-users < > insight-users at itk.org> wrote: > > Hi Hans, > > Thanks for your answer ! > > I was asking that because when I use auto keyword with a filter output, it > seems like is result in a normal point type, not a smart pointer, so a code > with > > auto testOutput = testFilter->GetOutput(); > > has not the same behavior as > > FilterOutputType::Pointer testOutput = testFilter->GetOutput(); > > testOutput is a smart pointer in the second case, and a normal pointer in > the first one. > > I was wondering if it could interfere with the smart pointer role (for > example causing memory leak, or wrong reference count). > > After a deeper look, New() return a smart pointer (so with auto =, no > problem) and GetOutput() a pointer. So the second code snipset just > creates another instance of a smart pointer. > > I hope what was my question is now clearer ! > Yann > > Le 21/03/2017 ? 01:43, Johnson, Hans J a ?crit : > > > Yann, > > It will work only if you are compiling with C++11, and you have no intention of sharing your code with others who may not use C++11 syntax. > > ITK proper currently maintains backwards compatibility with older versions of C++. > > Hans > > > > > > ? > > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > > > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > > _______________________________________________ > Community mailing list > Community at itk.org > http://public.kitware.com/mailman/listinfo/community > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From blowekamp at mail.nih.gov Tue Mar 21 11:51:56 2017 From: blowekamp at mail.nih.gov (Lowekamp, Bradley (NIH/NLM/LHC) [C]) Date: Tue, 21 Mar 2017 15:51:56 +0000 Subject: [ITK-users] [ITK] auto keyword and New() smart pointer In-Reply-To: References: <0c50035e-fdb2-1d74-608f-fc7be08ef18d@yahoo.fr> <7D94F016-18A7-4F89-9361-486AA6561E8E@uiowa.edu> <5faa49b1-4dda-5dea-bb91-43ec7b5a2cc8@yahoo.fr> <53D7FB39-E6EB-4AF1-9669-DD605C99A13B@mail.nih.gov> Message-ID: <0DD6EF24-7BB0-4213-BE7C-043457EF7D50@mail.nih.gov> Bellow is an additional line which frees the filter, and thereby the output image, when only a raw auto pointer is used. On Mar 21, 2017, at 11:22 AM, Kiran Joshi > wrote: Hi Brad, Thanks for correcting me. When I replace my AddImages() function with what's below, the memory for the result image still gets cleaned up automatically at the correct time. Would you be able to give an example were the use of auto could lead to a memory leak? Since I guess I'm still not understanding the problem fully. Thanks, Kiran ImageType::Pointer AddImages(short a, short b) { auto im1 = CreateImage(a); auto im2 = CreateImage(b); AddFilterType::Pointer adder = AddFilterType::New(); adder->SetInput1(im1); adder->SetInput2(im2); adder->Update(); auto result = adder->GetOutput(); AddFilterType::Pointer adder2 = AddFilterType::New(); adder2->SetInput1(im1); adder2->SetInput2(result); adder2->Update(); auto result2 = adder2->GetOutput(); adder2 = ITK_NULLPTR; return result2; } On Tue, 21 Mar 2017 at 14:59 Lowekamp, Bradley (NIH/NLM/LHC) [C] > wrote: Hello, Your code and description illustrates the problem with the implicit auto type. Based on this simple test I think that it is probably safe to use auto to store the output from filters. It does not look like it interferes with the reference counting or leads to memory leaks, as Yann was worried about. This can be problematic: auto testOutput = testFilter->GetOutput(); But that is not what you are doing in your example. When you use the ?auto? type you need to be careful to determine if the type is a raw pointer or a smart pointer. The GetOutput methods returns an raw pointer without reference counting. This is the type auto is above. However in your example the return type for your method is ImageType::Pointer, which is an ITK smart pointer. Your code adds an implicit cast for the raw pointer to ITK?s smart pointer. And this is not made clear by the usage of auto. HTH, Brad On Mar 21, 2017, at 10:49 AM, Kiran Joshi > wrote: Hi Francois, Maybe I misunderstood, but I disagree with your statement that "you cannot use the keyword auto with these other methods" Attached is a screenshot showing a small ITK test program in a Visual Studio debugging session. The program is very simple; an AddImages() function is called, which itself calls a CreateImage() function twice before adding the created images and returning the result. Note that I have used auto when storing the image pointers returned by the CreateImage and AddImage functions. On the right of the image you can see snapshots of the memory usage as the program executes, and I have also annotated which lines of the program were executed immediately before taking the snapshot. The first snapshot show that on line 22, very little memory has been allocated, since we have not yet created any images. On line 23 ~16MB of memory is used when the first image is created. On line 24 ~32MB is used after the 2nd image is created. On line 30 the two images are added together and the result is returned from the function. At this point ~48MB is used because all 3 image still exist in memory. On line 31 we exit from the AddImages() function and can see that the memory for two temporary images has been correctly deallocated, since the im1 and im2 pointers have gone out of scope. Finally on line 38 we exit the main() function and see that the memory usage returns to ~0MB, since the image variable also goes out of scope and the memory associated with it is deallocated. Let me know if you see any mistakes in my tests! Kiran On Tue, 21 Mar 2017 at 12:38 Francois Budin > wrote: Hello Yann, Indeed, you are correct. New() will return a smart pointer, but other methods will return a pointer, so you cannot use the keyword "auto" with these other methods. The two following links give some insight in why ITK is implemented this way: https://itk.org/Wiki/ITK/Examples/Utilities/ReturnObjectFromFunction https://itk.org/pipermail/insight-developers/2011-April/018011.html Hope this helps, Francois On Tue, Mar 21, 2017 at 6:45 AM, asertyuio via Insight-users > wrote: Hi Hans, Thanks for your answer ! I was asking that because when I use auto keyword with a filter output, it seems like is result in a normal point type, not a smart pointer, so a code with auto testOutput = testFilter->GetOutput(); has not the same behavior as FilterOutputType::Pointer testOutput = testFilter->GetOutput(); testOutput is a smart pointer in the second case, and a normal pointer in the first one. I was wondering if it could interfere with the smart pointer role (for example causing memory leak, or wrong reference count). After a deeper look, New() return a smart pointer (so with auto =, no problem) and GetOutput() a pointer. So the second code snipset just creates another instance of a smart pointer. I hope what was my question is now clearer ! Yann Le 21/03/2017 ? 01:43, Johnson, Hans J a ?crit : Yann, It will work only if you are compiling with C++11, and you have no intention of sharing your code with others who may not use C++11 syntax. ITK proper currently maintains backwards compatibility with older versions of C++. Hans ? _____________________________________ Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Kitware offers ITK Training Courses, for more information visit: http://www.kitware.com/products/protraining.php Please keep messages on-topic and check the ITK FAQ at: http://www.itk.org/Wiki/ITK_FAQ Follow this link to subscribe/unsubscribe: http://public.kitware.com/mailman/listinfo/insight-users _____________________________________ Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Kitware offers ITK Training Courses, for more information visit: http://www.kitware.com/products/protraining.php Please keep messages on-topic and check the ITK FAQ at: http://www.itk.org/Wiki/ITK_FAQ Follow this link to subscribe/unsubscribe: http://public.kitware.com/mailman/listinfo/insight-users _____________________________________ Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Kitware offers ITK Training Courses, for more information visit: http://www.kitware.com/products/protraining.php Please keep messages on-topic and check the ITK FAQ at: http://www.itk.org/Wiki/ITK_FAQ Follow this link to subscribe/unsubscribe: http://public.kitware.com/mailman/listinfo/insight-users _______________________________________________ Community mailing list Community at itk.org http://public.kitware.com/mailman/listinfo/community -------------- next part -------------- An HTML attachment was scrubbed... URL: From fisidoro at ethz.ch Tue Mar 21 13:49:23 2017 From: fisidoro at ethz.ch (D'Isidoro Fabio) Date: Tue, 21 Mar 2017 17:49:23 +0000 Subject: [ITK-users] Create ITK Project with CUDA from CMake Message-ID: <50B858FB5F53124F9E32314E5C1B409445964F56@MBX212.d.ethz.ch> Hallo, I have a .cu CUDA main code which makes use of itk to read and write images. How can I create a new ITK project with Cmake that include CUDA? I could not find any tutorial/description on it. Since I am not familiar with Cmake, I would need an understandable and detailed description. The most basic CmakeLists.txt I could find does not work: ------------------------------ project(CUDAitk) find_package(ITK REQUIRED) include(${ITK_USE_FILE}) find_package(CUDA REQUIRED) CUDA_INCLUDE_DIRECTORIES(${ITK_INCLUDE_DIRS}) cuda_add_executable(CUDAitk CUDAitk.cu) target_link_libraries(CUDAitk ${ITK_LIBRARIES}) ------------------------------ The compling errors I get are like: error C2244: 'itk::FixedArray::FixedArray': unable to match function definition to an existing declaration CMake Error at CUDAitk_generated_CUDAitk.cu.obj.Debug.cmake:267 (message): Error generating file C:/Users/Fabio/Documents/CUDAitk_cpp2/bin/CMakeFiles/CUDAitk.dir//Debug/CUDAitk_generated_CUDAitk.cu.obj Any help is highly appreciated. Thank you! Fabio -------------- next part -------------- An HTML attachment was scrubbed... URL: From jmatuteflores at gmail.com Tue Mar 21 18:39:38 2017 From: jmatuteflores at gmail.com (jose alejandro matute flores) Date: Tue, 21 Mar 2017 23:39:38 +0100 Subject: [ITK-users] Create ITK Project with CUDA from CMake In-Reply-To: <50B858FB5F53124F9E32314E5C1B409445964F56@MBX212.d.ethz.ch> References: <50B858FB5F53124F9E32314E5C1B409445964F56@MBX212.d.ethz.ch> Message-ID: Hi, I use cuda as well, I have a different directory for my cuda parts of the application. What I do is create a static library and link it to the application. It might not be the best way, but it's been working so far. -------------------cuda/CMakeLists.txt ------------------------ FIND_PACKAGE(CUDA REQUIRED) set (CUDA_NVCC_FLAGS "-g -G -lineinfo" CACHE STRING "nvcc flags" FORCE) SET (CUDA_VERBOSE_BUILD ON CACHE BOOL "nvcc verbose" FORCE) SET(LIB_TYPE STATIC) #set the lib type CUDA_ADD_LIBRARY(cudaLibName ${LIB_TYPE} visual.h visual.cu ) -------------------------------------------------- and in the main project directory ------- CMakeLists.txt--------------------- find_package(CUDA REQUIRED) add_subdirectory(cuda) INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/cuda) INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/cuda/lib) LINK_DIRECTORIES(${CMAKE_SOURCE_DIR}/cuda) LINK_DIRECTORIES(${CMAKE_SOURCE_DIR}/cuda/lib) cuda_add_executable(CUDAitk ${SOURCES} ) ADD_DEPENDENCIES(CUDAitk cudaLibName) target_link_libraries( CUDAitk cudaLibName .... ) --------------------------------------------- Best, Jos? On Tue, Mar 21, 2017 at 6:49 PM, D'Isidoro Fabio wrote: > Hallo, > > > > I have a .cu CUDA main code which makes use of itk to read and write > images. > > > > How can I create a new ITK project with Cmake that include CUDA? I could > not find any tutorial/description on it. Since I am not familiar with > Cmake, I would need an understandable and detailed description. > > > > The most basic CmakeLists.txt I could find does not work: > > > > ------------------------------ > > project(CUDAitk) > > > > find_package(ITK REQUIRED) > > include(${ITK_USE_FILE}) > > > > find_package(CUDA REQUIRED) > > > > CUDA_INCLUDE_DIRECTORIES(${ITK_INCLUDE_DIRS}) > > > > cuda_add_executable(CUDAitk CUDAitk.cu) > > target_link_libraries(CUDAitk ${ITK_LIBRARIES}) > > > > ------------------------------ > > > > The compling errors I get are like: > > > > error C2244: 'itk::FixedArray::FixedArray': unable to > match function definition to an existing declaration > > > > CMake Error at CUDAitk_generated_CUDAitk.cu.obj.Debug.cmake:267 (message): > > Error generating file > > C:/Users/Fabio/Documents/CUDAitk_cpp2/bin/CMakeFiles/ > CUDAitk.dir//Debug/CUDAitk_generated_CUDAitk.cu.obj > > > > > > Any help is highly appreciated. > > > > Thank you! > > > > Fabio > > > > > > > > > > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From tobias.wood at kcl.ac.uk Wed Mar 22 07:06:30 2017 From: tobias.wood at kcl.ac.uk (Wood, Tobias) Date: Wed, 22 Mar 2017 11:06:30 +0000 Subject: [ITK-users] Reading nifti files In-Reply-To: References: Message-ID: Hi Cyril, I use NIFTI all the time, it generally works. Which transform in the header does your collaborator use? There are (annoyingly) two in NIFTI, the qform and the sform. ITK generally uses the qform, because the sform can include transformations (shears) that the ITK Image class does not support (ITK as a whole supports them, but in a different place). The easiest way I know to check this is with FSL?s fslhd command, which will print out both. I know there were some changes to ITK?s NIFTI support very recently (just before Christmas if my memory serves). Essentially, ITK now follows the NIFTI standard exactly. One of the things the NIFTI standard specifies is when to use the qform and when to use the sform. Unfortunately, most other packages (and ITK previously) were very relaxed about this and did not follow the spec, often doing things like setting qform=sform or having an invalid combination of qform_code/sform_code. I have a suspicion that your sforms/qforms are messed up. In which case, the fslorient tool is your friend. On the other hand, I might be wrong entirely. Good luck, Toby On 17/03/2017, 15:46, "Insight-users on behalf of Cyril Mory" on behalf of cyril.mory at creatis.insa-lyon.fr> wrote: Thanks for this answer. By manipulation, I essentially mean reading a 6D .nii file, extracting sub images, and writing them to .mhd format, hopefully keeping the correct image information throughout the process. I'll see if my colleague can write to a more recent format, and otherwise follow your advice about ReadUnknownImageType. Best, Cyril On 17/03/2017 16:34, Sarthak P wrote: For NIfTI I/O, I'd suggest you stick to the latest tags as they up to date regarding the latest standards. What exactly do you mean my manipulation? There is an ITK filter to change image information (https://itk.org/Doxygen/html/classitk_1_1ChangeInformationImageFilter.html) but that only happens AFTER itk::ImageFileReader has done its work. Could you possibly try to get your collaborator to write a few images using a latest variant of ITK (preferably version matched with yours for consistency)? If not, then perhaps try to read the information in the header using the example in https://itk.org/Wiki/ITK/Examples/IO/ReadUnknownImageType and then do comparisons between what you expect. All the best, S On Fri, Mar 17, 2017 at 11:21 AM, Cyril Mory > wrote: Hi ITK users, I have recently started working with nifti files, to collaborate with a colleague that uses this format. But the itk::ImageFileReader does not correctly open the nifti files I have (image size, offset and direction matrix are wrong). I use a recent version of ITK (commit from Feb 6 18:02:49 2017), but my colleague has his own fork from nifti_reg, which is several years old. Two questions: - Does someone have experience in manipulating nifti files from ITK, and if so, is it supposed to work fine ? - Have there been important modifications in the nifti format in the last years, which the ITK reader would have followed, and which could cause the issues I'm seeing when opening old ones ? Best regards, Cyril _____________________________________ Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Kitware offers ITK Training Courses, for more information visit: http://www.kitware.com/products/protraining.php Please keep messages on-topic and check the ITK FAQ at: http://www.itk.org/Wiki/ITK_FAQ Follow this link to subscribe/unsubscribe: http://public.kitware.com/mailman/listinfo/insight-users -------------- next part -------------- An HTML attachment was scrubbed... URL: From aharr8 at uwo.ca Wed Mar 22 15:15:41 2017 From: aharr8 at uwo.ca (Andrew Harris) Date: Wed, 22 Mar 2017 15:15:41 -0400 Subject: [ITK-users] Applying transform with a rotation, translation, and offset to points Message-ID: Hello, I would like to be able to duplicate the applicaiton of a VersorRigid3DTransform that incorporates a rotation, translation, and offset to points selected to calculate TRE between a fixed and transformed moving image. I?m confused about how the 3x3 matrix, 3x1 transform, and 3x1 offset are applied within a ResampleFilter. If I could get them composed into a 4x4 transform matrix I could apply that to the points selected in the moving image and calculate the distance between the transformed points and the corresponding points in the fixed image. Any help would be appreciated. -- AH ------------------------------------------------------------ ----------------------------------- *This email and any attachments thereto may contain private, confidential, and privileged materials for the sole use of the intended recipient. Any reviewing, copying, or distribution of this email (or any attachments thereto) by other than the intended recipient is strictly prohibited. If you are not the intended recipient, please contact the sender immediately and permanently destroy this email and any attachments thereto.* -------------- next part -------------- An HTML attachment was scrubbed... URL: From matt.mccormick at kitware.com Wed Mar 22 17:00:44 2017 From: matt.mccormick at kitware.com (Matt McCormick) Date: Wed, 22 Mar 2017 17:00:44 -0400 Subject: [ITK-users] Applying transform with a rotation, translation, and offset to points In-Reply-To: References: Message-ID: Hello Andrew, To apply the transformation, typically the methods, itk::Image::TransformIndexToPhysicalPoint itk::Transform::TransformPoint would be used. Nonetheless, a matrix representation from VersorRigid3DTransform can be obtained from its base class methods itk::MatrixOffsetTransformBase::GetMatrix and itk::MatrixOffsetTransformBase::GetOffset. HTH, Matt On Wed, Mar 22, 2017 at 3:15 PM, Andrew Harris wrote: > Hello, > I would like to be able to duplicate the applicaiton of a > VersorRigid3DTransform that incorporates a rotation, translation, and offset > to points selected to calculate TRE between a fixed and transformed moving > image. I?m confused about how the 3x3 matrix, 3x1 transform, and 3x1 offset > are applied within a ResampleFilter. If I could get them composed into a > 4x4 transform matrix I could apply that to the points selected in the moving > image and calculate the distance between the transformed points and the > corresponding points in the fixed image. Any help would be appreciated. > > -- > > AH > > > ----------------------------------------------------------------------------------------------- > > This email and any attachments thereto may contain private, confidential, > and privileged materials for the sole use of the intended recipient. Any > reviewing, copying, or distribution of this email (or any attachments > thereto) by other than the intended recipient is strictly prohibited. If you > are not the intended recipient, please contact the sender immediately and > permanently destroy this email and any attachments thereto. > > > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > From cyril.mory at creatis.insa-lyon.fr Thu Mar 23 04:37:52 2017 From: cyril.mory at creatis.insa-lyon.fr (Cyril Mory) Date: Thu, 23 Mar 2017 09:37:52 +0100 Subject: [ITK-users] Reading nifti files In-Reply-To: References: Message-ID: <91e1d7f1-7a00-e2e5-e4c1-c0e76281c6c8@creatis.insa-lyon.fr> Hi Tobias, Indeed, I had a conversation with my (remote) colleague, and he admitted that he used only the sform in his code, and did not maintain the qform so that they match. And obviously, ITK was using the qform. Thanks for your help, Cyril On 22/03/2017 12:06, Wood, Tobias wrote: > > Hi Cyril, > > I use NIFTI all the time, it generally works. > > Which transform in the header does your collaborator use? There are > (annoyingly) two in NIFTI, the qform and the sform. ITK generally uses > the qform, because the sform can include transformations (shears) that > the ITK Image class does not support (ITK as a whole supports them, > but in a different place). The easiest way I know to check this is > with FSL?s fslhd command, which will print out both. > > I know there were some changes to ITK?s NIFTI support very recently > (just before Christmas if my memory serves). Essentially, ITK now > follows the NIFTI standard exactly. One of the things the NIFTI > standard specifies is when to use the qform and when to use the sform. > Unfortunately, most other packages (and ITK previously) were very > relaxed about this and did not follow the spec, often doing things > like setting qform=sform or having an invalid combination of > qform_code/sform_code. > > I have a suspicion that your sforms/qforms are messed up. In which > case, the fslorient tool is your friend. > > On the other hand, I might be wrong entirely. > > Good luck, > > Toby > > On 17/03/2017, 15:46, "Insight-users on behalf of Cyril Mory" > > on behalf of cyril.mory at creatis.insa-lyon.fr > > wrote: > > Thanks for this answer. > By manipulation, I essentially mean reading a 6D .nii file, extracting > sub images, and writing them to .mhd format, hopefully keeping the > correct image information throughout the process. > I'll see if my colleague can write to a more recent format, and > otherwise follow your advice about ReadUnknownImageType. > > Best, > Cyril > > On 17/03/2017 16:34, Sarthak P wrote: > > For NIfTI I/O, I'd suggest you stick to the latest tags as they up > to date regarding the latest standards. > > What exactly do you mean my manipulation? There is an ITK filter > to change image information > (https://itk.org/Doxygen/html/classitk_1_1ChangeInformationImageFilter.html > ) > but that only happens AFTER itk::ImageFileReader has done its work. > > Could you possibly try to get your collaborator to write a few > images using a latest variant of ITK (preferably version matched > with yours for consistency)? If not, then perhaps try to read the > information in the header using the example in > https://itk.org/Wiki/ITK/Examples/IO/ReadUnknownImageType > > and then do comparisons between what you expect. > > All the best, > > S > > On Fri, Mar 17, 2017 at 11:21 AM, Cyril Mory > > wrote: > > Hi ITK users, > > I have recently started working with nifti files, to > collaborate with a colleague that uses this format. But the > itk::ImageFileReader does not correctly open the nifti files I > have (image size, offset and direction matrix are wrong). I > use a recent version of ITK (commit from Feb 6 18:02:49 2017), > but my colleague has his own fork from nifti_reg, which is > several years old. > > Two questions: > - Does someone have experience in manipulating nifti files > from ITK, and if so, is it supposed to work fine ? > - Have there been important modifications in the nifti format > in the last years, which the ITK reader would have followed, > and which could cause the issues I'm seeing when opening old > ones ? > > Best regards, > Cyril > _____________________________________ > Powered by www.kitware.com > > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From fisidoro at ethz.ch Thu Mar 23 13:41:15 2017 From: fisidoro at ethz.ch (D'Isidoro Fabio) Date: Thu, 23 Mar 2017 17:41:15 +0000 Subject: [ITK-users] Create ITK Project with CUDA from CMake In-Reply-To: References: <50B858FB5F53124F9E32314E5C1B409445964F56@MBX212.d.ethz.ch> Message-ID: <50B858FB5F53124F9E32314E5C1B40944596525D@MBX212.d.ethz.ch> Thank you very much Jose, I can?t make your example work, but I am not sure I have been doing the right things. If you can help me: I am using Visual Studio, Windows 10. My directory looks like: CUDAitk/ src/ CUDAitk.cu CMakeLists.txt CUDApart/ CUDApart.cu CMakeLists.txt bin/ where ----------- CUDAitk/CUDApart/CMakeLists.txt ----------- FIND_PACKAGE(CUDA REQUIRED) set (CUDA_NVCC_FLAGS "-g -G -lineinfo" CACHE STRING "nvcc flags" FORCE) SET (CUDA_VERBOSE_BUILD ON CACHE BOOL "nvcc verbose" FORCE) SET(LIB_TYPE STATIC) #set the lib type CUDA_ADD_LIBRARY(CUDAPart ${LIB_TYPE} CUDApart.h CUDApart.cu ) ----------------------------------------------------------------------- ----------- src/CMakeLists.txt ----------- project(CUDAitk) find_package(ITK REQUIRED) include(${ITK_USE_FILE}) find_package(CUDA REQUIRED) add_subdirectory(CUDApart ) INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/CUDApart) INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/CUDApart/Debug) LINK_DIRECTORIES(${CMAKE_SOURCE_DIR}/CUDApart) LINK_DIRECTORIES(${CMAKE_SOURCE_DIR}/CUDApart/Debug) cuda_add_executable(CUDAitk CUDAitk.cu ${SOURCES} ) ADD_DEPENDENCIES(CUDAitk CUDApart) target_link_libraries( CUDAitk CUDApart ${ITK_LIBRARIES} ) ----------------------------------------------------------------------- CUDAitk.cu starts with #include "CUDApart.h" #include "itkImage.h" My issues are: 1) I understand I should NOT create the static library first (with Cmake) and then the main project (with another CMake run). Instead, add_subdirectory() should assure that the library is generated first with CUDAitk/CUDApart/CMakeLists.txt and then the src/CMakeLists.txt is generated after that. Is that correct? 2) However at generation, Cmake does not find the CUDApart library (I need to build the created project with Visual Studio first). 3) When I build the main project with Visual Studio (after running CMake), the itk library is not recognized (link error) I would appreciate any feedback that could be useful to figure this whole thing out. Thank you again! From: jose alejandro matute flores [mailto:jmatuteflores at gmail.com] Sent: Dienstag, 21. M?rz 2017 23:40 To: D'Isidoro Fabio Cc: insight-users at itk.org Subject: Re: [ITK-users] Create ITK Project with CUDA from CMake Hi, I use cuda as well, I have a different directory for my cuda parts of the application. What I do is create a static library and link it to the application. It might not be the best way, but it's been working so far. -------------------cuda/CMakeLists.txt ------------------------ FIND_PACKAGE(CUDA REQUIRED) set (CUDA_NVCC_FLAGS "-g -G -lineinfo" CACHE STRING "nvcc flags" FORCE) SET (CUDA_VERBOSE_BUILD ON CACHE BOOL "nvcc verbose" FORCE) SET(LIB_TYPE STATIC) #set the lib type CUDA_ADD_LIBRARY(cudaLibName ${LIB_TYPE} visual.h visual.cu ) -------------------------------------------------- and in the main project directory ------- CMakeLists.txt--------------------- find_package(CUDA REQUIRED) add_subdirectory(cuda) INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/cuda) INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/cuda/lib) LINK_DIRECTORIES(${CMAKE_SOURCE_DIR}/cuda) LINK_DIRECTORIES(${CMAKE_SOURCE_DIR}/cuda/lib) cuda_add_executable(CUDAitk ${SOURCES} ) ADD_DEPENDENCIES(CUDAitk cudaLibName) target_link_libraries( CUDAitk cudaLibName .... ) --------------------------------------------- Best, Jos? On Tue, Mar 21, 2017 at 6:49 PM, D'Isidoro Fabio > wrote: Hallo, I have a .cu CUDA main code which makes use of itk to read and write images. How can I create a new ITK project with Cmake that include CUDA? I could not find any tutorial/description on it. Since I am not familiar with Cmake, I would need an understandable and detailed description. The most basic CmakeLists.txt I could find does not work: ------------------------------ project(CUDAitk) find_package(ITK REQUIRED) include(${ITK_USE_FILE}) find_package(CUDA REQUIRED) CUDA_INCLUDE_DIRECTORIES(${ITK_INCLUDE_DIRS}) cuda_add_executable(CUDAitk CUDAitk.cu) target_link_libraries(CUDAitk ${ITK_LIBRARIES}) ------------------------------ The compling errors I get are like: error C2244: 'itk::FixedArray::FixedArray': unable to match function definition to an existing declaration CMake Error at CUDAitk_generated_CUDAitk.cu.obj.Debug.cmake:267 (message): Error generating file C:/Users/Fabio/Documents/CUDAitk_cpp2/bin/CMakeFiles/CUDAitk.dir//Debug/CUDAitk_generated_CUDAitk.cu.obj Any help is highly appreciated. Thank you! Fabio _____________________________________ Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Kitware offers ITK Training Courses, for more information visit: http://www.kitware.com/products/protraining.php Please keep messages on-topic and check the ITK FAQ at: http://www.itk.org/Wiki/ITK_FAQ Follow this link to subscribe/unsubscribe: http://public.kitware.com/mailman/listinfo/insight-users -------------- next part -------------- An HTML attachment was scrubbed... URL: From aharr8 at uwo.ca Thu Mar 23 15:46:03 2017 From: aharr8 at uwo.ca (Andrew Harris) Date: Thu, 23 Mar 2017 15:46:03 -0400 Subject: [ITK-users] Applying transform with a rotation, translation, and offset to points In-Reply-To: References: Message-ID: Hi Matt, Thanks for getting back to me. I?m still a bit foggy about the relationship between matrix, offset, and translation. I think I?m going to try and mark my targets within ITK and transform them as you have suggested, outputting a text file to then analyze. However, I would like to know what is going on ?under the hood? so to speak, just in case someone asks me to explain it. If I were to compose a 4x4 transformation matrix using the 3x3 matrix and 3x1 offset, apply it to a point, and then add the 3x1 translation after the fact would that correctly transform the point? -- AH ----------------------------------------------------------------------------------------------- *This email and any attachments thereto may contain private, confidential, and privileged materials for the sole use of the intended recipient. Any reviewing, copying, or distribution of this email (or any attachments thereto) by other than the intended recipient is strictly prohibited. If you are not the intended recipient, please contact the sender immediately and permanently destroy this email and any attachments thereto.* On Wed, Mar 22, 2017 at 5:00 PM, Matt McCormick wrote: > Hello Andrew, > > To apply the transformation, typically the methods, > > itk::Image::TransformIndexToPhysicalPoint > itk::Transform::TransformPoint > > would be used. > > > Nonetheless, a matrix representation from VersorRigid3DTransform can > be obtained from its base class methods > itk::MatrixOffsetTransformBase::GetMatrix and > itk::MatrixOffsetTransformBase::GetOffset. > > HTH, > Matt > > On Wed, Mar 22, 2017 at 3:15 PM, Andrew Harris wrote: > > Hello, > > I would like to be able to duplicate the applicaiton of a > > VersorRigid3DTransform that incorporates a rotation, translation, and > offset > > to points selected to calculate TRE between a fixed and transformed > moving > > image. I?m confused about how the 3x3 matrix, 3x1 transform, and 3x1 > offset > > are applied within a ResampleFilter. If I could get them composed into a > > 4x4 transform matrix I could apply that to the points selected in the > moving > > image and calculate the distance between the transformed points and the > > corresponding points in the fixed image. Any help would be appreciated. > > > > -- > > > > AH > > > > > > ------------------------------------------------------------ > ----------------------------------- > > > > This email and any attachments thereto may contain private, confidential, > > and privileged materials for the sole use of the intended recipient. Any > > reviewing, copying, or distribution of this email (or any attachments > > thereto) by other than the intended recipient is strictly prohibited. If > you > > are not the intended recipient, please contact the sender immediately and > > permanently destroy this email and any attachments thereto. > > > > > > _____________________________________ > > Powered by www.kitware.com > > > > Visit other Kitware open-source projects at > > http://www.kitware.com/opensource/opensource.html > > > > Kitware offers ITK Training Courses, for more information visit: > > http://www.kitware.com/products/protraining.php > > > > Please keep messages on-topic and check the ITK FAQ at: > > http://www.itk.org/Wiki/ITK_FAQ > > > > Follow this link to subscribe/unsubscribe: > > http://public.kitware.com/mailman/listinfo/insight-users > > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From zivrafael.yaniv at nih.gov Thu Mar 23 16:41:31 2017 From: zivrafael.yaniv at nih.gov (Yaniv, Ziv Rafael (NIH/NLM/LHC) [C]) Date: Thu, 23 Mar 2017 20:41:31 +0000 Subject: [ITK-users] Applying transform with a rotation, translation, and offset to points In-Reply-To: References: Message-ID: <90B99315-6795-4A93-9EE1-18B57208A72E@mail.nih.gov> Hello Andrew, This is a bit off topic as you are interested in bare ITK, but this may help your understanding. The following SimpleITK notebook has explanations and examples of how ITK/SimpleITK transformations work https://github.com/InsightSoftwareConsortium/SimpleITK-Notebooks/blob/master/Python/22_Transforms.ipynb . The following notebook does exactly what you want, maps points from one image to another before and after registration, computes the TRE and also displays the specific error for each point in 3D, https://github.com/InsightSoftwareConsortium/SimpleITK-Notebooks/blob/master/Python/65_Registration_FFD.ipynb . The code that does the computations and graphics is in registration_utilities.py . If you are ok with Python then I believe you can easily use the code as is. If you need to implement it in original ITK (C++) then the code can server as a reference for your C++ implementation. Note that most of the computations for TRE are done using numpy functionality as ITK doesn?t have a convenient filter to do these computations (at least not one I am aware of). hope this helps Ziv From: Andrew Harris Date: Thursday, March 23, 2017 at 3:46 PM To: Matt McCormick Cc: Insight-users Subject: Re: [ITK-users] Applying transform with a rotation, translation, and offset to points Hi Matt, Thanks for getting back to me. I?m still a bit foggy about the relationship between matrix, offset, and translation. I think I?m going to try and mark my targets within ITK and transform them as you have suggested, outputting a text file to then analyze. However, I would like to know what is going on ?under the hood? so to speak, just in case someone asks me to explain it. If I were to compose a 4x4 transformation matrix using the 3x3 matrix and 3x1 offset, apply it to a point, and then add the 3x1 translation after the fact would that correctly transform the point? -- AH ----------------------------------------------------------------------------------------------- This email and any attachments thereto may contain private, confidential, and privileged materials for the sole use of the intended recipient. Any reviewing, copying, or distribution of this email (or any attachments thereto) by other than the intended recipient is strictly prohibited. If you are not the intended recipient, please contact the sender immediately and permanently destroy this email and any attachments thereto. On Wed, Mar 22, 2017 at 5:00 PM, Matt McCormick > wrote: Hello Andrew, To apply the transformation, typically the methods, itk::Image::TransformIndexToPhysicalPoint itk::Transform::TransformPoint would be used. Nonetheless, a matrix representation from VersorRigid3DTransform can be obtained from its base class methods itk::MatrixOffsetTransformBase::GetMatrix and itk::MatrixOffsetTransformBase::GetOffset. HTH, Matt On Wed, Mar 22, 2017 at 3:15 PM, Andrew Harris > wrote: > Hello, > I would like to be able to duplicate the applicaiton of a > VersorRigid3DTransform that incorporates a rotation, translation, and offset > to points selected to calculate TRE between a fixed and transformed moving > image. I?m confused about how the 3x3 matrix, 3x1 transform, and 3x1 offset > are applied within a ResampleFilter. If I could get them composed into a > 4x4 transform matrix I could apply that to the points selected in the moving > image and calculate the distance between the transformed points and the > corresponding points in the fixed image. Any help would be appreciated. > > -- > > AH > > > ----------------------------------------------------------------------------------------------- > > This email and any attachments thereto may contain private, confidential, > and privileged materials for the sole use of the intended recipient. Any > reviewing, copying, or distribution of this email (or any attachments > thereto) by other than the intended recipient is strictly prohibited. If you > are not the intended recipient, please contact the sender immediately and > permanently destroy this email and any attachments thereto. > > > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > -------------- next part -------------- An HTML attachment was scrubbed... URL: From matimontg at gmail.com Fri Mar 24 19:46:18 2017 From: matimontg at gmail.com (Matias) Date: Fri, 24 Mar 2017 16:46:18 -0700 (MST) Subject: [ITK-users] Translation on each Dicom on a Directory Message-ID: <1490399178833-38034.post@n7.nabble.com> Hi, I need to read a directory which contains X number of Dicom images. I have no troubles doing this by passing a parameter with the name of each file to ITK but I'd like to read one by one and do the translation in a For. Sounds simple but I could not find an example where you read a directory, process images one by one on a For and then write the resultant image (within the same For) to an output directory.. Does anyone know where I can find an example (of any kind) for reading a directory and doing some processing (any type) in a For? Thank you! -- View this message in context: http://itk-users.7.n7.nabble.com/Translation-on-each-Dicom-on-a-Directory-tp38034.html Sent from the ITK - Users mailing list archive at Nabble.com. From wangtao_ at sjtu.edu.cn Mon Mar 27 00:29:57 2017 From: wangtao_ at sjtu.edu.cn (wangtaoiz) Date: Sun, 26 Mar 2017 21:29:57 -0700 (MST) Subject: [ITK-users] How to get the displacementfield from compositetransform? Message-ID: <1490588997605-38035.post@n7.nabble.com> Dear all: Here I have this question, I have several transforms and I added them to be a compositetransform, finally I want to get the displacementfield vectors form the compositetransform? How can I make it? Thanks a lot Wang -- View this message in context: http://itk-users.7.n7.nabble.com/How-to-get-the-displacementfield-from-compositetransform-tp38035.html Sent from the ITK - Users mailing list archive at Nabble.com. From aichinger_wolfgang at web.de Mon Mar 27 01:18:11 2017 From: aichinger_wolfgang at web.de (Wolfgang Aichinger) Date: Mon, 27 Mar 2017 07:18:11 +0200 Subject: [ITK-users] Problems integrating itk in own project Message-ID: An HTML attachment was scrubbed... URL: From ChrRossmanith at gmx.de Mon Mar 27 02:05:34 2017 From: ChrRossmanith at gmx.de (Christina Rossmanith) Date: Mon, 27 Mar 2017 08:05:34 +0200 Subject: [ITK-users] Problems integrating itk in own project In-Reply-To: References: Message-ID: An HTML attachment was scrubbed... URL: From aichinger_wolfgang at web.de Mon Mar 27 03:15:20 2017 From: aichinger_wolfgang at web.de (Wolfgang Aichinger) Date: Mon, 27 Mar 2017 09:15:20 +0200 Subject: [ITK-users] Problems integrating itk in own project In-Reply-To: References: , Message-ID: An HTML attachment was scrubbed... URL: From aichinger_wolfgang at web.de Mon Mar 27 04:18:40 2017 From: aichinger_wolfgang at web.de (Wolfgang Aichinger) Date: Mon, 27 Mar 2017 10:18:40 +0200 Subject: [ITK-users] Problems integrating itk in own project In-Reply-To: References: , , Message-ID: An HTML attachment was scrubbed... URL: From francois.budin at kitware.com Mon Mar 27 09:18:52 2017 From: francois.budin at kitware.com (Francois Budin) Date: Mon, 27 Mar 2017 09:18:52 -0400 Subject: [ITK-users] Problems integrating itk in own project In-Reply-To: References: Message-ID: Hello Wolfgang, Glad you figured out your issue. If that is an option for your project, it might be a good idea to update ITK to the newest version (4.11) as 3.20 is a very old version and many things have been improved since that version. Francois On Mon, Mar 27, 2017 at 4:18 AM, Wolfgang Aichinger < aichinger_wolfgang at web.de> wrote: > Hi again, > > I got the itk sources along with the project code and it seems that a bug > was included. Getting a fresh version (3.20 as it was originally intended) > did the job. Everything works fine now. > > Thank you for getting me to the idea. > > Best, > Wolfgang > > *Gesendet:* Montag, 27. M?rz 2017 um 09:15 Uhr > *Von:* "Wolfgang Aichinger" > *An:* "Christina Rossmanith" > *Cc:* insight-users at itk.org > *Betreff:* Re: [ITK-users] Problems integrating itk in own project > Hi Christina, > > Simply replacing "cxx" by "hxx" did not work for me. I do not even have a > corresponding ".hxx" file. Are you sure I should have one? Maybe I have to > download all files again from the website. > It also seems to be a more general problem, as removing the line with the > include only leads to similar errors in "itkLinearInterpolateFunction" and > "itkresamplefilter". Removing all problematic includes of course results in > linker errors (LNK2019). > > Regards, > Wolfgang > > *Gesendet:* Montag, 27. M?rz 2017 um 08:05 Uhr > *Von:* "Christina Rossmanith" > *An:* "Wolfgang Aichinger" > *Cc:* insight-users at itk.org > *Betreff:* Aw: [ITK-users] Problems integrating itk in own project > Hi Wolfgang, > > as far as I can see itkMattesMutualInformationImageToImageMetric.hxx is > included in itkMattesMutualInformationImageToImageMetric.h, not .cxx > You should include .h in your source file not .hxx, maybe the examples > referenced in the documentation [1] > > can help you. > > Regards, > Christina > > > *Gesendet:* Montag, 27. M?rz 2017 um 07:18 Uhr > *Von:* "Wolfgang Aichinger" > *An:* insight-users at itk.org > *Betreff:* [ITK-users] Problems integrating itk in own project > Hi all, > > I'm new to itk and to be honest also to using external libraries, so > excuse me if my question is dumb . I have problems with using ITK 3.20 in a > project on Windows using VS2010. I built ITK using cmake (no examples, no > tests, with shared libs). With this configuration I was able to compile > successfully and to install. > For my project I also have a cmakeLists.txt (below) and was able to > include all headers. Anyways, I get an error: > > Error 1 error C1083: Cannot open include file: ' > itkMattesMutualInformationImageToImageMetric.cxx': No such file or > directory D:\extern\ITK\include\InsightToolkit\ > itkMattesMutualInformationImageToImageMetric.h 516 > > This file is in the original sources but not copied during installation. > Should this be the case? What flag in cmake would enforce this? > This include is surrounded by an #infdef ITK_MANUAL_INSTANTIATION, which > is obviously not defined. Could the error be here? > In the project the path where all itk libraries are installed is set > correctly to "Additional Library Directories" : > > D:/extern/ITK/lib/InsightToolkit > D:/extern/ITK/lib/InsightToolkit/$(Configuration) > > I'm probably missing a step that solves it all but I don't have an > idea right now. > > Thanks for any help! > > Best, > Wolfgang > > #CMakeLists.txt > PROJECT (RigidRegistration) > SET(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} "D:/extern/ITK/lib/ > InsightToolkit") > find_package(ITK) > IF(ITK_USE_FILE) > INCLUDE(${ITK_USE_FILE}) > MESSAGE( STATUS "ITK_USE_FILE: " ${ITK_USE_FILE}) > ENDIF(ITK_USE_FILE) > > SET(RigidRegistration > rigid_registration_of_multimodal_MR_knee_data.cxx > ) > ADD_EXECUTABLE(RigidRegistration ${RigidRegistration}) > > TARGET_LINK_LIBRARIES(RigidRegistration > ${ITK_LIBRARIES} > ) > > _____________________________________ Powered by www.kitware.com Visit > other Kitware open-source projects at http://www.kitware.com/ > opensource/opensource.html Kitware offers ITK Training Courses, for more > information visit: http://www.kitware.com/products/protraining.php Please > keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ Follow this link to > subscribe/unsubscribe: http://public.kitware.com/ > mailman/listinfo/insight-users > _____________________________________ Powered by www.kitware.com Visit > other Kitware open-source projects at http://www.kitware.com/ > opensource/opensource.html Kitware offers ITK Training Courses, for more > information visit: http://www.kitware.com/products/protraining.php Please > keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ Follow this link to > subscribe/unsubscribe: http://public.kitware.com/ > mailman/listinfo/insight-users > > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From francois.budin at kitware.com Mon Mar 27 09:26:47 2017 From: francois.budin at kitware.com (Francois Budin) Date: Mon, 27 Mar 2017 09:26:47 -0400 Subject: [ITK-users] How to get the displacementfield from compositetransform? In-Reply-To: <1490588997605-38035.post@n7.nabble.com> References: <1490588997605-38035.post@n7.nabble.com> Message-ID: Hello Wang, You can use the filter described in [1]. It can convert any ITK transform into a displacement field. Hope this helps, Francois [1] https://itk.org/Doxygen/html/classitk_1_1TransformToDisplacementFieldFilter.html On Mon, Mar 27, 2017 at 12:29 AM, wangtaoiz wrote: > Dear all: > Here I have this question, I have several transforms and I added > them to be a compositetransform, finally I want to get the > displacementfield > vectors form the compositetransform? How can I make it? > > Thanks a lot > Wang > > > > -- > View this message in context: http://itk-users.7.n7.nabble. > com/How-to-get-the-displacementfield-from-compositetransform-tp38035.html > Sent from the ITK - Users mailing list archive at Nabble.com. > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > -------------- next part -------------- An HTML attachment was scrubbed... URL: From francois.budin at kitware.com Mon Mar 27 09:40:40 2017 From: francois.budin at kitware.com (Francois Budin) Date: Mon, 27 Mar 2017 09:40:40 -0400 Subject: [ITK-users] Translation on each Dicom on a Directory In-Reply-To: <1490399178833-38034.post@n7.nabble.com> References: <1490399178833-38034.post@n7.nabble.com> Message-ID: Hello, If I understand correctly what you are saying, you were able to use itkImageSeriesReader [1] but you do not want all your files of dimension N-1 to be merged altogether in a file of dimension N, correct? In this case, you will have to read each file individually with itkImageReader. You can still use itkNumericSeriesFileNames to create the list of file names. Your code could look like this (modify and complete what you need: typedef itk::NumericSeriesFileNames NameGeneratorType; NameGeneratorType::Pointer nameGenerator = NameGeneratorType::New(); nameGenerator->SetSeriesFormat( argv[1] ); nameGenerator->SetStartIndex( first ); nameGenerator->SetEndIndex( last ); nameGenerator->SetIncrementIndex( 1 ); std::vector names = nameGenerator->GetFileNames(); typedef itk::ImageFileReader ReaderType; std::vector::iterator nit; for (nit = names.begin(); nit != names.end(); nit++) { ReaderType::Pointer reader = ReaderType::New(); reader->SetFileName((*nit).c_str()); reader->Update(); //////////// // Do your computation //////// } Hope this helps, Francois [1] https://itk.org/Doxygen/html/classitk_1_1ImageSeriesReader.html On Fri, Mar 24, 2017 at 7:46 PM, Matias wrote: > Hi, > > I need to read a directory which contains X number of Dicom images. I have > no troubles doing this by passing a parameter with the name of each file to > ITK but I'd like to read one by one and do the translation in a For. Sounds > simple but I could not find an example where you read a directory, process > images one by one on a For and then write the resultant image (within the > same For) to an output directory.. > > Does anyone know where I can find an example (of any kind) for reading a > directory and doing some processing (any type) in a For? > > Thank you! > > > > -- > View this message in context: http://itk-users.7.n7.nabble. > com/Translation-on-each-Dicom-on-a-Directory-tp38034.html > Sent from the ITK - Users mailing list archive at Nabble.com. > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > -------------- next part -------------- An HTML attachment was scrubbed... URL: From wangtao_ at sjtu.edu.cn Mon Mar 27 10:12:38 2017 From: wangtao_ at sjtu.edu.cn (wangtaoiz) Date: Mon, 27 Mar 2017 07:12:38 -0700 (MST) Subject: [ITK-users] How to get the displacementfield from compositetransform? In-Reply-To: References: <1490588997605-38035.post@n7.nabble.com> Message-ID: <1490623958300-38043.post@n7.nabble.com> Thanks for your reply, I have tryed the TransformToDisplacementFieldFilter but the program throw a exception in run time, I wondered if it becaues the input transform is a compositetransform and it can not directly be transfered. Actually I just want to get the combination of the displacementfield in a compositetransform. Wang -- View this message in context: http://itk-users.7.n7.nabble.com/How-to-get-the-displacementfield-from-compositetransform-tp38035p38043.html Sent from the ITK - Users mailing list archive at Nabble.com. From wangtao_ at sjtu.edu.cn Mon Mar 27 10:28:10 2017 From: wangtao_ at sjtu.edu.cn (wangtaoiz) Date: Mon, 27 Mar 2017 07:28:10 -0700 (MST) Subject: [ITK-users] How to get the displacementfield from compositetransform? In-Reply-To: <1490623958300-38043.post@n7.nabble.com> References: <1490588997605-38035.post@n7.nabble.com> <1490623958300-38043.post@n7.nabble.com> Message-ID: <1490624890927-38044.post@n7.nabble.com> For instance, I have transforms A, B, C after registration. Then I used these transforms, the codes should be: ... A.AddTransform(B); A.AddTransform(C); ... Resample.SetTransform(A); ... In this way, I sequentially used transform A, then B and finally C. Now I want the get the combined transform scalar value directly, so I asked if there is a to get the displacementfield by these compositetransform. Hope for some guidances! Thanks Wang -- View this message in context: http://itk-users.7.n7.nabble.com/How-to-get-the-displacementfield-from-compositetransform-tp38035p38044.html Sent from the ITK - Users mailing list archive at Nabble.com. From francois.budin at kitware.com Mon Mar 27 13:36:35 2017 From: francois.budin at kitware.com (Francois Budin) Date: Mon, 27 Mar 2017 13:36:35 -0400 Subject: [ITK-users] How to get the displacementfield from compositetransform? In-Reply-To: <1490624890927-38044.post@n7.nabble.com> References: <1490588997605-38035.post@n7.nabble.com> <1490623958300-38043.post@n7.nabble.com> <1490624890927-38044.post@n7.nabble.com> Message-ID: Hello Wang, What was the exception message that you were getting? Did you try the TransformToDisplacementFieldFilter with only one simple transform (such as an affine transform) to see if your implementation was working in that case? Did you specify a size or a reference image for the TransformToDisplacementFieldFilter? Hope this helps, Francois On Mon, Mar 27, 2017 at 10:28 AM, wangtaoiz wrote: > For instance, I have transforms A, B, C after registration. Then I used > these > transforms, the codes should be: > ... > A.AddTransform(B); > A.AddTransform(C); > ... > Resample.SetTransform(A); > ... > > In this way, I sequentially used transform A, then B and finally C. Now I > want the get the combined transform scalar value directly, so I asked if > there is a to get the displacementfield by these compositetransform. Hope > for some guidances! > > Thanks > Wang > > > > -- > View this message in context: http://itk-users.7.n7.nabble. > com/How-to-get-the-displacementfield-from-compositetransform- > tp38035p38044.html > Sent from the ITK - Users mailing list archive at Nabble.com. > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > -------------- next part -------------- An HTML attachment was scrubbed... URL: From wangtao_ at sjtu.edu.cn Mon Mar 27 20:35:10 2017 From: wangtao_ at sjtu.edu.cn (wangtaoiz) Date: Mon, 27 Mar 2017 17:35:10 -0700 (MST) Subject: [ITK-users] How to get the displacementfield from compositetransform? In-Reply-To: References: <1490588997605-38035.post@n7.nabble.com> <1490623958300-38043.post@n7.nabble.com> <1490624890927-38044.post@n7.nabble.com> Message-ID: <1490661310994-38046.post@n7.nabble.com> Yeah, I followed your advice and it really worked. Use the filter to get a displacementfield image and the saclars are really what I want, Thank you! Wang -- View this message in context: http://itk-users.7.n7.nabble.com/How-to-get-the-displacementfield-from-compositetransform-tp38035p38046.html Sent from the ITK - Users mailing list archive at Nabble.com. From asertyuio at yahoo.fr Tue Mar 28 06:37:09 2017 From: asertyuio at yahoo.fr (asertyuio) Date: Tue, 28 Mar 2017 12:37:09 +0200 Subject: [ITK-users] ThinPlateSplineKernelTransform and landmark with coordinate in pixel In-Reply-To: References: Message-ID: <26832f9e-19a0-f451-1a39-99471169f4c0@yahoo.fr> Hi all, I'm using the ThinPlateSplineKernelTransform (the code is mostly from the example RegistrationITKv4/ThinPlateSplineWarp.cxx) to warp an image onto another, with one set of corresponding landmarks for each image. I'm using landmarks from another program, which position are in pixel coordinate. I haven't managed to get correct warping results. I suspected that this due to the default spacing/origin set by tiff image reader, i.e. the difference of coordinate system between landmark and image. I reset the image spacing to 1 and image origin to 1, also try to reverse the Y direction, but nothing succeed. Is there any easy way of transforming pixel based coordinate into image coordinate ? Any help will be much appreciated for your help ! Yann From asertyuio at yahoo.fr Tue Mar 28 07:48:56 2017 From: asertyuio at yahoo.fr (asertyuio) Date: Tue, 28 Mar 2017 13:48:56 +0200 Subject: [ITK-users] ThinPlateSplineKernelTransform and landmark with coordinate in pixel In-Reply-To: <26832f9e-19a0-f451-1a39-99471169f4c0@yahoo.fr> References: <26832f9e-19a0-f451-1a39-99471169f4c0@yahoo.fr> Message-ID: I found the cause of the wrong warping results. It is not exactly clear for me why I have to do that, but I had to invert the target and the source landmark. So what is working is to use as source landmark the landmarks in the fixed image, and as target landmark, the landmark of the moving image. I may have a misunderstanding of the meaning of "source" and "target". Sorry for the noise ! Yann Le 28/03/2017 ? 12:37, asertyuio a ?crit : > Hi all, > > I'm using the ThinPlateSplineKernelTransform (the code is mostly from > the example RegistrationITKv4/ThinPlateSplineWarp.cxx) to warp an image > onto another, with one set of corresponding landmarks for each image. > I'm using landmarks from another program, which position are in pixel > coordinate. > > I haven't managed to get correct warping results. I suspected that this > due to the default spacing/origin set by tiff image reader, i.e. the > difference of coordinate system between landmark and image. I reset the > image spacing to 1 and image origin to 1, also try to reverse the Y > direction, but nothing succeed. > > Is there any easy way of transforming pixel based coordinate into image > coordinate ? > > Any help will be much appreciated for your help ! > > Yann > > From francois.budin at kitware.com Tue Mar 28 09:30:45 2017 From: francois.budin at kitware.com (Francois Budin) Date: Tue, 28 Mar 2017 09:30:45 -0400 Subject: [ITK-users] How to get the displacementfield from compositetransform? In-Reply-To: <1490661310994-38046.post@n7.nabble.com> References: <1490588997605-38035.post@n7.nabble.com> <1490623958300-38043.post@n7.nabble.com> <1490624890927-38044.post@n7.nabble.com> <1490661310994-38046.post@n7.nabble.com> Message-ID: Glad I could help. Enjoy using ITK, and feel free to contribute if you find things to improve. Francois On Mon, Mar 27, 2017 at 8:35 PM, wangtaoiz wrote: > Yeah, I followed your advice and it really worked. Use the filter to get a > displacementfield image and the saclars are really what I want, Thank you! > Wang > > > > -- > View this message in context: http://itk-users.7.n7.nabble. > com/How-to-get-the-displacementfield-from-compositetransform- > tp38035p38046.html > Sent from the ITK - Users mailing list archive at Nabble.com. > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > -------------- next part -------------- An HTML attachment was scrubbed... URL: From matimontg at gmail.com Thu Mar 30 08:49:16 2017 From: matimontg at gmail.com (Matias) Date: Thu, 30 Mar 2017 05:49:16 -0700 (MST) Subject: [ITK-users] SimpleITK Serieswriter and DicomTags Message-ID: <1490878156334-38050.post@n7.nabble.com> Hi, I've been dealing with ITK for years in C++ and now I would need to use SimpleITK and C# as far as I can in a new proyect. Is the SimpleITK SeriesWriter working for Dicom Files? Last time I tried to use it I had problems with the DicomTags, these would not copy or there was no method to copy the tags to the resulting slices. Currently, I read a volume of slices, apply rotation and then I need to write the resulting image as another set of slices AND keeping tag information such as patient name, etc. Thank you, Matias. -- View this message in context: http://itk-users.7.n7.nabble.com/SimpleITK-Serieswriter-and-DicomTags-tp38050.html Sent from the ITK - Users mailing list archive at Nabble.com. From matimontg at gmail.com Thu Mar 30 09:29:52 2017 From: matimontg at gmail.com (Matias) Date: Thu, 30 Mar 2017 06:29:52 -0700 (MST) Subject: [ITK-users] Get Z (mm) on a mha volume Message-ID: <1490880592325-38051.post@n7.nabble.com> Hi, How can I get the Z value of a specific slice in a volume I read from a Dicom Directory? Thank you, Matias. -- View this message in context: http://itk-users.7.n7.nabble.com/Get-Z-mm-on-a-mha-volume-tp38051.html Sent from the ITK - Users mailing list archive at Nabble.com. From blowekamp at mail.nih.gov Thu Mar 30 10:23:26 2017 From: blowekamp at mail.nih.gov (Lowekamp, Bradley (NIH/NLM/LHC) [C]) Date: Thu, 30 Mar 2017 14:23:26 +0000 Subject: [ITK-users] [ITK] SimpleITK Serieswriter and DicomTags In-Reply-To: <1490878156334-38050.post@n7.nabble.com> References: <1490878156334-38050.post@n7.nabble.com> Message-ID: <031C16D1-4B43-4BD8-9C80-91A2F9C72B6B@mail.nih.gov> Hello, Writing correct DICOM continues to be a struggle with SimpleITK and ITK. It is generally recommended to directly use GDCM or DCMTK to write a proper DICOM series. SimpleITK tries to keep things, well, simple and straight forward. But ITK ties to do some smart things, which get in the way for certain uses with SimpleITK. We are trying to document and develop a nominal set of DICOM output operations that work in SimpleITK. Do you have working C++ code that works for your intended operation? Can you share a small section of code which does what you expect it C++? Thank, Brad > On Mar 30, 2017, at 8:49 AM, Matias wrote: > > Hi, > > I've been dealing with ITK for years in C++ and now I would need to use > SimpleITK and C# as far as I can in a new proyect. > > Is the SimpleITK SeriesWriter working for Dicom Files? Last time I tried to > use it I had problems with the DicomTags, these would not copy or there was > no method to copy the tags to the resulting slices. > > Currently, I read a volume of slices, apply rotation and then I need to > write the resulting image as another set of slices AND keeping tag > information such as patient name, etc. > > Thank you, > > Matias. > > > > -- > View this message in context: http://itk-users.7.n7.nabble.com/SimpleITK-Serieswriter-and-DicomTags-tp38050.html > Sent from the ITK - Users mailing list archive at Nabble.com. > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > _______________________________________________ > Community mailing list > Community at itk.org > http://public.kitware.com/mailman/listinfo/community From tomas.psorn at gmail.com Thu Mar 30 10:33:32 2017 From: tomas.psorn at gmail.com (topsorn) Date: Thu, 30 Mar 2017 07:33:32 -0700 (MST) Subject: [ITK-users] Interleaved dataset interpolation Message-ID: <1490884412961-7589763.post@n2.nabble.com> Hello, I'm dealing with a registration problem. I'm supposed to perform 3D registration of rat brain MRI scans. The problem is, that my dataset has gaps in "z" direction. That means I have dataset of 15, 1.25 mm thick slices and between them 14, 1.25 mm thick gaps. Is there a way of interpolating the missing slices using ITK? Thank you for an answer. Tom?? P?orn -- View this message in context: http://itk-insight-users.2283740.n2.nabble.com/ITK-users-Interleaved-dataset-interpolation-tp7589763.html Sent from the ITK Insight Users mailing list archive at Nabble.com. From dzenanz at gmail.com Thu Mar 30 11:31:48 2017 From: dzenanz at gmail.com (=?UTF-8?B?RMW+ZW5hbiBadWtpxIc=?=) Date: Thu, 30 Mar 2017 11:31:48 -0400 Subject: [ITK-users] Get Z (mm) on a mha volume In-Reply-To: <1490880592325-38051.post@n7.nabble.com> References: <1490880592325-38051.post@n7.nabble.com> Message-ID: Hi Matias, in order to get "Z" value of a specific slice, you need to get it from tag Image Position (Patient) (0020,0032). If you read it into a 3D volume you can get "Z" value by using image->TransformIndexToPhysicalPoint by providing e.g. index [0,0,slice]. Caveat: the 3D reader assumes equidistant spacing between slices, by examining distance between slices 0 and 1. In case of non-constant Z spacing this method will likely produce wrong result. Regards On Thu, Mar 30, 2017 at 9:29 AM, Matias wrote: > Hi, > > How can I get the Z value of a specific slice in a volume I read from a > Dicom Directory? > > Thank you, > > Matias. > > > > -- > View this message in context: http://itk-users.7.n7.nabble. > com/Get-Z-mm-on-a-mha-volume-tp38051.html > Sent from the ITK - Users mailing list archive at Nabble.com. > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > -------------- next part -------------- An HTML attachment was scrubbed... URL: From dzenanz at gmail.com Thu Mar 30 12:00:44 2017 From: dzenanz at gmail.com (=?UTF-8?B?RMW+ZW5hbiBadWtpxIc=?=) Date: Thu, 30 Mar 2017 12:00:44 -0400 Subject: [ITK-users] Interleaved dataset interpolation In-Reply-To: <1490884412961-7589763.post@n2.nabble.com> References: <1490884412961-7589763.post@n2.nabble.com> Message-ID: Hi Tom??, if you are looking at slice thickness tag and seeing that it is only 1.25 mm, while the distances between slices are 2.5 mm, do not worry. Similar thing is common in practice, although your case is a bit more extreme. But ITK should read that series normally, and do some kind of interpolation during registration (linear is usual). You shouldn't need to do anything special. Regards, D?enan On Thu, Mar 30, 2017 at 10:33 AM, topsorn wrote: > Hello, > > I'm dealing with a registration problem. I'm supposed to perform 3D > registration of rat brain MRI scans. The problem is, that my dataset has > gaps in "z" direction. That means I have dataset of 15, 1.25 mm thick > slices > and between them 14, 1.25 mm thick gaps. Is there a way of interpolating > the > missing slices using ITK? Thank you for an answer. > > Tom?? P?orn > > > > -- > View this message in context: http://itk-insight-users. > 2283740.n2.nabble.com/ITK-users-Interleaved-dataset- > interpolation-tp7589763.html > Sent from the ITK Insight Users mailing list archive at Nabble.com. > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > -------------- next part -------------- An HTML attachment was scrubbed... URL: From matimontg at gmail.com Thu Mar 30 12:14:33 2017 From: matimontg at gmail.com (Matias) Date: Thu, 30 Mar 2017 09:14:33 -0700 (MST) Subject: [ITK-users] [ITK] SimpleITK Serieswriter and DicomTags In-Reply-To: <031C16D1-4B43-4BD8-9C80-91A2F9C72B6B@mail.nih.gov> References: <1490878156334-38050.post@n7.nabble.com> <031C16D1-4B43-4BD8-9C80-91A2F9C72B6B@mail.nih.gov> Message-ID: Yes, this is what I would need to migrate to C#: It basically reads a dicom directory and performs rotation on the volume, then writes the resulting images back to a directory, copying the tags from the original images. #include "itkImage.h" #include "itkGDCMImageIO.h" #include "itkGDCMSeriesFileNames.h" #include "itkImageSeriesReader.h" #include "itkResampleImageFilter.h" #include "itkEuler3DTransform.hxx" #include "gdcmUIDGenerator.h" #include "itkImageFileWriter.h" #include "itkImageSeriesWriter.h" #include "itkNumericSeriesFileNames.h" #include "itkTranslationTransform.h" #include "string.h"; #include #include #include #include static void CopyDictionary(itk::MetaDataDictionary &fromDict, itk::MetaDataDictionary &toDict); int main(int argc, char* argv[]) { if (argc < 8) { std::cerr << "Uso: " << std::endl; std::cerr << argv[0] << " Directorio_A_Rotar DirectorioResultante Gamma Beta Alfa CentroRotacionX CentroRotacionY CentroRotacionZ" << std::endl; return EXIT_FAILURE; } typedef signed short PixelType; const unsigned int Dimension = 3; const unsigned int Dimension_Serie = 2; typedef itk::Image< PixelType, Dimension > ImageType; typedef itk::Image ImageType_Serie; typedef itk::ImageSeriesReader< ImageType > ReaderType; ReaderType::Pointer reader = ReaderType::New(); typedef itk::GDCMImageIO ImageIOType; ImageIOType::Pointer gdcmIO = ImageIOType::New(); reader->SetImageIO(gdcmIO); typedef itk::GDCMSeriesFileNames NamesGeneratorType; NamesGeneratorType::Pointer nameGenerator = NamesGeneratorType::New(); nameGenerator->SetUseSeriesDetails(true); nameGenerator->AddSeriesRestriction("0008|0021"); nameGenerator->SetDirectory(argv[1]); try { std::cout << std::endl << "The directory: " << std::endl; std::cout << std::endl << argv[1] << std::endl << std::endl; std::cout << "Contains the following DICOM Series: "; std::cout << std::endl << std::endl; typedef std::vector< std::string > SeriesIdContainer; const SeriesIdContainer & seriesUID = nameGenerator->GetSeriesUIDs(); SeriesIdContainer::const_iterator seriesItr = seriesUID.begin(); SeriesIdContainer::const_iterator seriesEnd = seriesUID.end(); while (seriesItr != seriesEnd) { std::cout << seriesItr->c_str() << std::endl; ++seriesItr; } std::string seriesIdentifier; seriesIdentifier = seriesUID.begin()->c_str(); std::cout << std::endl << std::endl; std::cout << "Now reading series: " << std::endl << std::endl; std::cout << seriesIdentifier << std::endl; std::cout << std::endl << std::endl; typedef std::vector< std::string > FileNamesContainer; FileNamesContainer fileNames; fileNames = nameGenerator->GetFileNames(seriesIdentifier); reader->SetFileNames(fileNames); try { reader->Update(); } catch (itk::ExceptionObject &ex) { std::cout << ex << std::endl; return EXIT_FAILURE; } const ImageType * inputImage = reader->GetOutput(); /*int numerodedicoms = inputImage->GetLargestPossibleRegion().GetSize()[2]; int dicomcentral = numerodedicoms / 2; std::cout << "Dimenion " << dicomcentral << std::endl;*/ //itk::EncapsulateMetaData(dictionary, "0020|0032","-208\\-236\\66"); typedef itk::ResampleImageFilter FilterType; FilterType::Pointer FiltroResample = FilterType::New(); FiltroResample->SetInput(reader->GetOutput()); typedef itk::LinearInterpolateImageFunction InterpolatorType; InterpolatorType::Pointer interpolator = InterpolatorType::New(); FiltroResample->SetInterpolator(interpolator); FiltroResample->SetOutputDirection(inputImage->GetDirection()); FiltroResample->SetOutputOrigin(inputImage->GetOrigin()); ImageType::SizeType inputSize = inputImage->GetLargestPossibleRegion().GetSize(); FiltroResample->SetSize(inputSize); const ImageType::SpacingType& inputSpacing = inputImage->GetSpacing(); FiltroResample->SetOutputSpacing(inputSpacing); FiltroResample->SetDefaultPixelValue(-1000); //Cambiar por un parametro typedef itk::Euler3DTransform< double > TransformType; //Transform TransformType::Pointer transform = TransformType::New(); double alfa, beta, gamma, centro_rotacion_X, centro_rotacion_Y, centro_rotacion_Z; gamma = atof(argv[3]); beta= atof(argv[4]); alfa = atof(argv[5]); centro_rotacion_X = atof(argv[6]); centro_rotacion_Y = atof(argv[7]); centro_rotacion_Z = atof(argv[8]); transform->SetRotation(gamma, beta, alfa); //Radianes en el siguiente orden en ITK: Gamma, Beta, Alfa | Ibarra //double centro[3] = { -14.8371, -54.9443, 175.75 }; //XmmPromedio, YmmPromedio, Z Central (mm): Leer directorio y tomar la del medio double centro[3] = { centro_rotacion_X, centro_rotacion_Y, centro_rotacion_Z }; //XmmPromedio, YmmPromedio, Z Central (mm): Leer directorio y tomar la del medio transform->SetCenter(centro); std::cout << "Centro: " << std::endl << std::endl; std::cout << transform->GetCenter() << std::endl; FiltroResample->SetTransform(transform); //FiltroResample->SetMetaDataDictionary(dictionary); try { FiltroResample->Update(); } catch (itk::ExceptionObject &ex) { return EXIT_FAILURE; } ReaderType::DictionaryRawPointer inputDict = (*(reader->GetMetaDataDictionaryArray()))[0]; ReaderType::DictionaryArrayType outputArray; //std::cout << "array: " << std::endl << outputArray[0] << std::endl; // To keep the new series in the same study as the original we need // to keep the same study UID. But we need new series and frame of // reference UID's. gdcm::UIDGenerator suid; //std::string seriesUID = suid.Generate(); gdcm::UIDGenerator fuid; std::string frameOfReferenceUID = fuid.Generate(); std::string studyUID; std::string sopClassUID; itk::ExposeMetaData(*inputDict, "0020|000d", studyUID); itk::ExposeMetaData(*inputDict, "0008|0016", sopClassUID); gdcmIO->KeepOriginalUIDOn(); using namespace std; double myArray_Z[70]; //Cambiar esto por un argumento que especifica la cantidad de imagenes. double myArray_X[70]; //Cambiar esto por un argumento que especifica la cantidad de imagenes. double myArray_Y[70]; //Cambiar esto por un argumento que especifica la cantidad de imagenes. ifstream file("file.txt"); if (file.is_open()) { for (int i = 0; i < 70; ++i) //Recordar cambiar por el argumento que especifica cantidad de imagenes { file >> myArray_Z[i]; } } std::cout << "valor primer Z array: " << std::endl << std::endl; std::cout << myArray_Z[0] << std::endl; for (unsigned int f = 0; f < inputSize[2]; f++) { // Create a new dictionary for this slice ReaderType::DictionaryRawPointer dict = new ReaderType::DictionaryType; // Copy the dictionary from the first slice CopyDictionary(*inputDict, *dict); // Set the UID's for the study, series, SOP and frame of reference itk::EncapsulateMetaData(*dict, "0020|000d", studyUID); //itk::EncapsulateMetaData(*dict, "0020|000e", seriesUID); itk::EncapsulateMetaData(*dict, "0020|0052", frameOfReferenceUID); gdcm::UIDGenerator sopuid; std::string sopInstanceUID = sopuid.Generate(); itk::EncapsulateMetaData(*dict, "0008|0018", sopInstanceUID); itk::EncapsulateMetaData(*dict, "0002|0003", sopInstanceUID); // Change fields that are slice specific std::ostringstream value; value.str(""); value << f + 1; // Image Number itk::EncapsulateMetaData(*dict, "0020|0013", value.str()); // Series Description - Append new description to current series // description std::string oldSeriesDesc; itk::ExposeMetaData(*inputDict, "0008|103e", oldSeriesDesc); value.str(""); value << oldSeriesDesc << ": Resampled with pixel spacing " << inputSpacing[0] << ", " << inputSpacing[1] << ", " << inputSpacing[2]; // This is an long string and there is a 64 character limit in the // standard unsigned lengthDesc = value.str().length(); std::string seriesDesc(value.str(), 0, lengthDesc > 64 ? 64 : lengthDesc); itk::EncapsulateMetaData(*dict, "0008|103e", seriesDesc); // Series Number value.str(""); value << 1001; itk::EncapsulateMetaData(*dict, "0020|0011", value.str()); // Derivation Description - How this image was derived value.str(""); for (int i = 0; i < argc; i++) { value << argv[i] << " "; } lengthDesc = value.str().length(); std::string derivationDesc(value.str(), 0, lengthDesc > 1024 ? 1024 : lengthDesc); itk::EncapsulateMetaData(*dict, "0008|2111", derivationDesc); // Image Position Patient: This is calculated by computing the // physical coordinate of the first pixel in each slice. ImageType::PointType position; ImageType::IndexType index; index[0] = 0; index[1] = 0; index[2] = myArray_Z[f]; FiltroResample->GetOutput()->TransformIndexToPhysicalPoint(index, position); //El origen que calculamos en el proyecto no se toca. (Origen = origen - average) //Cambiamos el ImageOrientationPatient SOLAMENTE si el valor original en la imagen es: 1\0\0\0\1\0. En el caso que se cambia el signo, se debe cambiar el signo del origen //value.str(""); //value << -1 << "\\" << 0 << "\\" << 0 << "\\" << 0 << "\\" << -1 << "\\" << 0; //PASAR ESTO POR ARGUMENTO!!! //itk::EncapsulateMetaData(*dict, "0020|0037", value.str()); value.str(""); value << -235.1629 << "\\" << -195.0557 << "\\" << myArray_Z[f]; //PASAR ESTO POR ARGUMENTO!!! El origen - Centro itk::EncapsulateMetaData(*dict, "0020|0032", value.str()); // Slice Location: For now, we store the z component of the Image // Position Patient. value.str(""); value << position[2]; itk::EncapsulateMetaData(*dict, "0020|1041", value.str()); // Slice Thickness: For now, we store the z spacing value.str(""); value << inputSpacing[2]; itk::EncapsulateMetaData(*dict, "0018|0050", value.str()); // Spacing Between Slices itk::EncapsulateMetaData(*dict, "0018|0088", value.str()); // Save the dictionary outputArray.push_back(dict); } typedef itk::ImageFileWriter< ImageType > WriterType; WriterType::Pointer writer = WriterType::New(); typedef itk::ImageSeriesWriter< ImageType, ImageType_Serie > SeriesWriterType; SeriesWriterType::Pointer seriesWriter = SeriesWriterType::New(); seriesWriter->SetInput(FiltroResample->GetOutput()); writer->SetFileName(argv[2]); writer->SetInput(FiltroResample->GetOutput()); itksys::SystemTools::MakeDirectory("Test"); //PASAR ESTO POR ARGUMENTO!! typedef itk::NumericSeriesFileNames OutputNamesGeneratorType; OutputNamesGeneratorType::Pointer outputNames = OutputNamesGeneratorType::New(); std::string seriesFormat("Test"); //PASAR ESTO POR ARGUMENTO!! seriesFormat = seriesFormat + "/" + "IM%d.dcm"; outputNames->SetSeriesFormat(seriesFormat.c_str()); outputNames->SetStartIndex(1); outputNames->SetEndIndex(inputSize[2]); seriesWriter->SetImageIO(gdcmIO); seriesWriter->SetFileNames(outputNames->GetFileNames()); seriesWriter->SetMetaDataDictionaryArray(&outputArray); std::cout << "Escribiendo la imagen como..." << std::endl << std::endl; std::cout << argv[2] << std::endl << std::endl; try { writer->Update(); seriesWriter->Update(); } catch (itk::ExceptionObject &ex) { std::cout << ex << std::endl; return EXIT_FAILURE; } } catch (itk::ExceptionObject &ex) { std::cout << ex << std::endl; return EXIT_FAILURE; } return EXIT_SUCCESS; } void CopyDictionary(itk::MetaDataDictionary &fromDict, itk::MetaDataDictionary &toDict) { typedef itk::MetaDataDictionary DictionaryType; DictionaryType::ConstIterator itr = fromDict.Begin(); DictionaryType::ConstIterator end = fromDict.End(); typedef itk::MetaDataObject< std::string > MetaDataStringType; while (itr != end) { itk::MetaDataObjectBase::Pointer entry = itr->second; MetaDataStringType::Pointer entryvalue = dynamic_cast(entry.GetPointer()); if (entryvalue) { std::string tagkey = itr->first; std::string tagvalue = entryvalue->GetMetaDataObjectValue(); itk::EncapsulateMetaData(toDict, tagkey, tagvalue); } ++itr; } } El jue., 30 de mar. de 2017 a la(s) 11:25, Lowekamp, Bradley (NIH/NLM/LHC) [C] [via ITK - Users] escribi?: > Hello, > > Writing correct DICOM continues to be a struggle with SimpleITK and ITK. > It is generally recommended to directly use GDCM or DCMTK to write a proper > DICOM series. > > SimpleITK tries to keep things, well, simple and straight forward. But ITK > ties to do some smart things, which get in the way for certain uses with > SimpleITK. We are trying to document and develop a nominal set of DICOM > output operations that work in SimpleITK. > > Do you have working C++ code that works for your intended operation? Can > you share a small section of code which does what you expect it C++? > > Thank, > Brad > > > > > > On Mar 30, 2017, at 8:49 AM, Matias <[hidden email] > > wrote: > > > > Hi, > > > > I've been dealing with ITK for years in C++ and now I would need to use > > SimpleITK and C# as far as I can in a new proyect. > > > > Is the SimpleITK SeriesWriter working for Dicom Files? Last time I tried > to > > use it I had problems with the DicomTags, these would not copy or there > was > > no method to copy the tags to the resulting slices. > > > > Currently, I read a volume of slices, apply rotation and then I need to > > write the resulting image as another set of slices AND keeping tag > > information such as patient name, etc. > > > > Thank you, > > > > Matias. > > > > > > > > -- > > View this message in context: > http://itk-users.7.n7.nabble.com/SimpleITK-Serieswriter-and-DicomTags-tp38050.html > > Sent from the ITK - Users mailing list archive at Nabble.com. > > _____________________________________ > > Powered by www.kitware.com > > > > Visit other Kitware open-source projects at > > http://www.kitware.com/opensource/opensource.html > > > > Kitware offers ITK Training Courses, for more information visit: > > http://www.kitware.com/products/protraining.php > > > > Please keep messages on-topic and check the ITK FAQ at: > > http://www.itk.org/Wiki/ITK_FAQ > > > > Follow this link to subscribe/unsubscribe: > > http://public.kitware.com/mailman/listinfo/insight-users > > _______________________________________________ > > Community mailing list > > [hidden email] > > http://public.kitware.com/mailman/listinfo/community > > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > > > ------------------------------ > If you reply to this email, your message will be added to the discussion > below: > > http://itk-users.7.n7.nabble.com/SimpleITK-Serieswriter-and-DicomTags-tp38050p38052.html > To unsubscribe from SimpleITK Serieswriter and DicomTags, click here > > . > NAML > > -- Matias -- View this message in context: http://itk-users.7.n7.nabble.com/SimpleITK-Serieswriter-and-DicomTags-tp38050p38056.html Sent from the ITK - Users mailing list archive at Nabble.com. -------------- next part -------------- An HTML attachment was scrubbed... URL: From aharr8 at uwo.ca Thu Mar 30 14:13:05 2017 From: aharr8 at uwo.ca (Andrew Harris) Date: Thu, 30 Mar 2017 14:13:05 -0400 Subject: [ITK-users] [ITK] Normalized Cross Correlation returns perfect alignment with images not even overlapping Message-ID: Hi, I'm hoping someone can guide me toward an explanation of this. I run my pipeline on various ultrasound image sets and get an NCC between 0.65 and 0.8 for good alignments, but on some sets the NCC returns 1.0 when the images aren't even overlapping. I have the black areas of the image masked out, and have even tried cranking up the threshold to be sure the darker areas aren't being included to no avail. Any thoughts? -- AH ----------------------------------------------------------------------------------------------- *This email and any attachments thereto may contain private, confidential, and privileged materials for the sole use of the intended recipient. Any reviewing, copying, or distribution of this email (or any attachments thereto) by other than the intended recipient is strictly prohibited. If you are not the intended recipient, please contact the sender immediately and permanently destroy this email and any attachments thereto.* -------------- next part -------------- An HTML attachment was scrubbed... URL: From dzenanz at gmail.com Thu Mar 30 19:25:42 2017 From: dzenanz at gmail.com (=?UTF-8?B?RMW+ZW5hbiBadWtpxIc=?=) Date: Thu, 30 Mar 2017 19:25:42 -0400 Subject: [ITK-users] [ITK] Normalized Cross Correlation returns perfect alignment with images not even overlapping In-Reply-To: References: Message-ID: Hi Andrew, your masks might be inverted. If NCC gets all black pixels in both images, the correlation will be perfect. Regards, D?enan On Thu, Mar 30, 2017 at 2:13 PM, Andrew Harris wrote: > Hi, I'm hoping someone can guide me toward an explanation of this. I run > my pipeline on various ultrasound image sets and get an NCC between 0.65 > and 0.8 for good alignments, but on some sets the NCC returns 1.0 when the > images aren't even overlapping. I have the black areas of the image masked > out, and have even tried cranking up the threshold to be sure the darker > areas aren't being included to no avail. Any thoughts? > > -- > > AH > > > ------------------------------------------------------------ > ----------------------------------- > > *This email and any attachments thereto may contain private, > confidential, and privileged materials for the sole use of the intended > recipient. Any reviewing, copying, or distribution of this email (or any > attachments thereto) by other than the intended recipient is strictly > prohibited. If you are not the intended recipient, please contact the > sender immediately and permanently destroy this email and any attachments > thereto.* > > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From zeinsalah at gmail.com Fri Mar 31 04:42:09 2017 From: zeinsalah at gmail.com (Zein Salah) Date: Fri, 31 Mar 2017 10:42:09 +0200 Subject: [ITK-users] Otsu Filter in Statistic and Review/statistics Message-ID: Hi, I had a strange behavior regarding otsu filter. My code is as simple as this: typedef itk::Statistics::ScalarImageToHistogramGenerator ScalarImageToHistogramGeneratorType; typedef ScalarImageToHistogramGeneratorType::HistogramType HistogramType; typedef itk::OtsuMultipleThresholdsCalculator OtsuCalculatorType; ScalarImageToHistogramGeneratorType::Pointer scalarImageToHistogramGenerator = ScalarImageToHistogramGeneratorType::New(); scalarImageToHistogramGenerator->SetNumberOfBins(128); scalarImageToHistogramGenerator->SetInput(itkImage); scalarImageToHistogramGenerator->Compute(); OtsuCalculatorType::Pointer otsuCalculator = OtsuCalculatorType::New(); otsuCalculator->SetNumberOfThresholds(numberOfThresholds); otsuCalculator->SetInputHistogram(scalarImageToHistogramGenerator->GetOutput()); otsuCalculator->Update(); const OtsuCalculatorType::OutputType& thresholdVector = otsuCalculator->GetOutput(); HistogramType::MeasurementType threshold = thresholdVector[usedThreshold]; I tested this with itk configured with ITK_USE_REVIEW_STATISTICS set to ON and once to OFF. With some images, the results is not the same. Is this a known issue? thanks, Zein -------------- next part -------------- An HTML attachment was scrubbed... URL: From zeinsalah at gmail.com Fri Mar 31 04:42:09 2017 From: zeinsalah at gmail.com (Zein Salah) Date: Fri, 31 Mar 2017 10:42:09 +0200 Subject: [ITK-users] Otsu Filter in Statistic and Review/statistics Message-ID: Hi, I had a strange behavior regarding otsu filter. My code is as simple as this: typedef itk::Statistics::ScalarImageToHistogramGenerator ScalarImageToHistogramGeneratorType; typedef ScalarImageToHistogramGeneratorType::HistogramType HistogramType; typedef itk::OtsuMultipleThresholdsCalculator OtsuCalculatorType; ScalarImageToHistogramGeneratorType::Pointer scalarImageToHistogramGenerator = ScalarImageToHistogramGeneratorType::New(); scalarImageToHistogramGenerator->SetNumberOfBins(128); scalarImageToHistogramGenerator->SetInput(itkImage); scalarImageToHistogramGenerator->Compute(); OtsuCalculatorType::Pointer otsuCalculator = OtsuCalculatorType::New(); otsuCalculator->SetNumberOfThresholds(numberOfThresholds); otsuCalculator->SetInputHistogram(scalarImageToHistogramGenerator->GetOutput()); otsuCalculator->Update(); const OtsuCalculatorType::OutputType& thresholdVector = otsuCalculator->GetOutput(); HistogramType::MeasurementType threshold = thresholdVector[usedThreshold]; I tested this with itk configured with ITK_USE_REVIEW_STATISTICS set to ON and once to OFF. With some images, the results is not the same. Is this a known issue? thanks, Zein -------------- next part -------------- An HTML attachment was scrubbed... URL: From cr at neuro.ma.uni-heidelberg.de Fri Mar 31 08:07:13 2017 From: cr at neuro.ma.uni-heidelberg.de (Chr. Rossmanith) Date: Fri, 31 Mar 2017 14:07:13 +0200 Subject: [ITK-users] Patch for ApproximateSignedDistanceMapImageFilter In-Reply-To: References: <874f690f-ff74-bb01-6d1e-bc479abeb547@neuro.ma.uni-heidelberg.de> Message-ID: Hi, 2nd attempt using approach 1) (see below). What about typos in comments I removed during bug fixing? Include into this patch as well or keep them separate? Additionally you find a small application creating an image with a bright square on dark background which displays the image together with the result of ApproximateSignedDistanceMapImageFilter. The pixel value of the square is 1 by default but can be changed via command line. Regards, Christina On 29.03.2017 15:12, Francois Budin wrote: > Hello Christina, > > I see different paths to try to solve this issue and I am not sure > which one is the best one: > 1) You could modify the itkIsoContourDistanceImageFilter class so that > m_LevelSetValue is of some real type. When looking in the > implementation of this filter, you can see that sometimes, > m_LevelSetValue is casted to a real type [1], so maybe it makes sense > to do that. > 2) Casting is one solution, but you have to be careful if you want to > cast to float or double. If you cast to float, and the input is of > type double, you will loose precision. If you always cast to double, > you might use a lot of memory. Sadly, in the itkNumericTraits, there > is no way of asking for "the smallest floating type that contains my > current type". You can call "RealType" which will be "double", or > "FloatType" which will be float. One strength of casting, is that if > you perform it in place, it can actually not do anything if it doesn't > need to [2]. > 3) To avoid casting when you don't need to (your type is float or > double), you could use the SFINAE concept like it is used here [3]. > This is more complex and may not be worth it. > > Beware that images may contain pixels that are not only scalar values, > but also RGB, RGBA, vectors. I am not sure if the ApproximateDistance > filter supports these types, but it is good to be careful, when > modifying the code, to not restrict the usage of a filter to scalar if > not required. To avoid that kind of issues, and to answer your > original question, you can use the Rebind structure [4]. > > I hope this helps. > I will be out of town for a week, and most likely will have limited to > no access to the internet, so don't be surprised if I do not answer > your next message within the next week. > > Thanks for helping! > Francois > > [1] > https://github.com/InsightSoftwareConsortium/ITK/blob/master/Modules/Filtering/DistanceMap/include/itkIsoContourDistanceImageFilter.hxx#L314 > [2] > https://github.com/InsightSoftwareConsortium/ITK/blob/master/Modules/Filtering/ImageFilterBase/include/itkCastImageFilter.hxx#L42 > [3] > https://github.com/InsightSoftwareConsortium/ITK/blob/master/Modules/IO/ImageBase/include/itkConvertPixelBuffer.h#L153-L161 > [4] > https://github.com/InsightSoftwareConsortium/ITK/blob/master/Modules/Filtering/Smoothing/include/itkSmoothingRecursiveGaussianImageFilter.h#L84-L85 > > On Wed, Mar 29, 2017 at 7:10 AM, Chr. Rossmanith > > > wrote: > > Hi Francois, > > I'm getting back to this issue. I'll introduce an intermediate > image in the mini pipeline used in > ApproximateSignedDistanceMapImageFilter which has a floating type > for pixel values. Given > > /** Type for input image. */ > typedef TInputImage InputImageType; > > how can I define a corresponding image type FloatImageType > replacing the unknown pixel type by float? I can't write > itk::Image< float, xxx > because I don't know xxx. > > Is there a way to query the pixel type to avoid applying the > CastImageFilter in case we already get floating valued pixels? > > Christina > > > > On 03.03.2017 14:58, Francois Budin wrote: >> Hi Christina, >> >> Maybe your idea was good but needs more work (e.g. cast the input >> image to the output type? at least if input is not a float, or >> maybe something else). I am glad you found a solution that works >> for you. If you need your software to be faster, you can also >> replace the SignedDanielssonDistanceMap with the >> SignedMauerDistanceMap [1]. >> >> Hope this helps, and thanks for your contribution. Do not >> hesitate to submit a new patch to solve your original problem if >> you find a solution. >> >> Francois >> [1] >> https://itk.org/Doxygen/html/classitk_1_1SignedMaurerDistanceMapImageFilter.html >> >> >> On Fri, Mar 3, 2017 at 8:23 AM, Chr. Rossmanith >> > > wrote: >> >> Hi Francois, >> >> really strange, on Wednesday changing the data type made my >> application work as expected (but obviously there must have >> been an additional change which really made the application >> work...). When trying to build a small example for you, I >> failed. I still think that feeding a 0/1 image into >> ApproximateSignedDistanceMapImageFilter makes sense. >> >> Originally I'm interested in ContourExtractor2D, which >> operates on a distance map using 0 as contour level. Unlike >> in the ContourExtractor2D example I've decided to use >> SignedDanielssonDistanceMap which works fine without any patches. >> >> So send the patch to /dev/null for the moment... >> >> Christina >> >> >> On 02.03.2017 16:17, Francois Budin wrote: >>> Hello Christina, >>> >>> I just reviewed you patch. You are changing the type of the >>> variable levelSetValue to OutputPixelType which is suppose >>> to be a floating point value. >>> However, the computation is done with InputPixelType >>> variables (m_InsideValue and m_OutsideValue) and divided by >>> an integer. Additionally, the resulting value is used in: >>> m_IsoContourFilter->SetLevelSetValue(levelSetValue); >>> >>> which accepts values of InputPixelType [1] since >>> IsoContourType is defined as: >>> typedef IsoContourDistanceImageFilter< InputImageType, >>> OutputImageType > IsoContourType; >>> >>> I am not sure if your patch solves the problem that you >>> mentioned. Do you have a test that would verify that the new >>> behavior corresponds to your expectations? Based on the code >>> review I have done, I would not expect the behavior of the >>> filter to change. >>> >>> Let me know if I missed a detail. Thank you for your >>> contribution! >>> Francois >>> >>> [1] >>> https://itk.org/Doxygen/html/classitk_1_1IsoContourDistanceImageFilter.html >>> >>> >>> On Wed, Mar 1, 2017 at 8:12 AM, Chr. Rossmanith >>> >> > wrote: >>> >>> For binary images with 0 for background and 1 for >>> objects with an integer input pixel type there is a >>> problem representing the average of 0 and 1 = 0.5 with >>> the input pixel type. The output pixel type is required >>> to be a floating pixel type (filter documentation), so >>> it should be safe to change the type of levelSetValue to >>> OutputPixelType. >>> >>> Regards, >>> Christina >>> >>> >>> _____________________________________ >>> Powered by www.kitware.com >>> >>> Visit other Kitware open-source projects at >>> http://www.kitware.com/opensource/opensource.html >>> >>> >>> Kitware offers ITK Training Courses, for more >>> information visit: >>> http://www.kitware.com/products/protraining.php >>> >>> >>> Please keep messages on-topic and check the ITK FAQ at: >>> http://www.itk.org/Wiki/ITK_FAQ >>> >>> >>> Follow this link to subscribe/unsubscribe: >>> http://public.kitware.com/mailman/listinfo/insight-users >>> >>> >>> >> >> > > -------------- next part -------------- An HTML attachment was scrubbed... URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: 0001-BUG-calculate-levelSetValue-for-IsoContourFilter-wit.patch Type: text/x-patch Size: 4861 bytes Desc: not available URL: -------------- next part -------------- A non-text attachment was scrubbed... Name: ApproximateSignedDistanceMapImageFilter.cxx Type: text/x-c++src Size: 2704 bytes Desc: not available URL: From blowekamp at mail.nih.gov Fri Mar 31 15:52:35 2017 From: blowekamp at mail.nih.gov (Lowekamp, Bradley (NIH/NLM/LHC) [C]) Date: Fri, 31 Mar 2017 19:52:35 +0000 Subject: [ITK-users] [ANN] SimpleITK 1.0 Release Candidate 2 Message-ID: We are pleased to announce the release of the SimpleITK 1.0 Release Candidate 3! This is expected to be the final release candidate before version 1.0! Please download and test the binaries. For this release candidate in addition to the source code distributions, the language specific ?front-ends? and a wide selection for binary Python wheels, we have added Conda packages too. The Conda python packages have been uploaded to the `SimpleITK` channel under the `dev` label. (https://anaconda.org/simpleitk/repo/files?type=all&label=dev) The proper package can be downloaded with: conda install -c simpleitk/label/dev simpleitk A complete set of binary Python wheels are available for download and testing. It is important to have the latest version form pip to ensure correct wheel compatibility. To install the SimpleITK package run: pip install --upgrade pip pip install --pre -f https://github.com/SimpleITK/SimpleITK/releases/tag/v1.0rc3 SimpleITK There are a number of language specific "front-ends? which can be used to build SimpleITK: - Python - https://github.com/SimpleITK/SimpleITKPythonPackage - R - https://github.com/SimpleITK/SimpleITKRInstaller - Lua - https://github.com/SimpleITK/SimpleITKLuaRock -Conda - https://github.com/SimpleITK/SimpleITKCondaRecipe Release Candidate 3 Notes: - Additional Improvements: - Added multi-hash ExternalData support for sha512 - Added R Documentation files - Update Python and Java documentation strings files - Doxygen fixes - Fix allowing undefined symbols when building standalone language wrapping - More minor bug fixes Release Candidate 2 Notes: - Additional Improvements: - Updated ITK version along 4.11 release branch - Reorganized examples directory - Reorganized filter libraries to match ITK modules - Improved compilation with more specific ITK module usage - Now using modern CMake 3 style properties for exported libraries - API Changes - Depricated CMake variables with "SITK" prefix, now consistenly using the "SimpleITK" prefix for configurable CMake variables - Removed `ImageSeriesReader::GetGDCMSeriesFileNames` parameter `loadPrivateTags` parameter. This removes an overloaded version of the class method. - Added `sitkWallClock` enum for a sentinel value for random number seed to indicate initialization from the clock Release Candidate 1 Notes: * Key Improvements: - Improved Python data bridge - New Python method `GetArrayViewFromImage` provides copy free read-only access - Updated Python data structures to use `memory view` objects - Building SimpleITK wrappers: - R devtools based installer (https://github.com/SimpleITK/SimpleITKRInstaller). - Python: scripts for building wheels (https://github.com/SimpleITK/SimpleITKPythonPackage) and a Conda recipe (https://github.com/SimpleITK/SimpleITKCondaRecipe). - Support use of virtual image domain in the `ImageRegistrationMethod`. - OnePlusOneOptimizer added to registration framework. - Improved support for R: propogating C++ exceptions into R, additional R tests. - Additional tests for Java. - Python and R notebooks repository illustrating the basics and more advanced functionality of SimpleITK (https://github.com/InsightSoftwareConsortium/SimpleITK-Notebooks). - Added continous integration via CircleCI. - Updated version and improved integration of Google Test. - Updated ITK version to 4.11 - Updated minimal required CMake version to 3.0, and numerous CMake changes to support various build configurations. - Updated to usage of SWIG 3.0.11 ( using the latest SIWG is strongly recommended for R ) - Reorganized examples directory into example based sub-directories with multiple languages - Improvements to documentation transmogrification scripts - Many bug fixes and improvement to the build system! * API changes: - R methods which previously unnecessarily returned self return void. - New method `Image::GetNumberOfPixels` - New method `LabelMapContourOverlayImageFilter::SetColormap` - New method `LabelMapToRGBImageFilter::SetColormap` - New method `ImageRegistrationMethod::SetVirtualDomain` - New method `ImageRegistrationMethod::SetVirtualDomainFromImage` - New seed parameter to `ImageRegistrationMethod::AddMetricSamplingSeed` method - `CastImageFilter::SetOutputPixelType` method no longer accepts the pixel ID by value, uses only enumerated type. Please try out SimpleITK 1.0rc3, and report any issues! Enjoy! Bradley Lowekamp -------------- next part -------------- An HTML attachment was scrubbed... URL: From blowekamp at mail.nih.gov Fri Mar 31 16:00:51 2017 From: blowekamp at mail.nih.gov (Lowekamp, Bradley (NIH/NLM/LHC) [C]) Date: Fri, 31 Mar 2017 20:00:51 +0000 Subject: [ITK-users] [ANN] SimpleITK 1.0 Release Candidate 3 Message-ID: <89971EAD-762E-4D7C-8FBC-D27809BCD27E@mail.nih.gov> We are pleased to announce the release of the SimpleITK 1.0 Release Candidate 3! (Apologize for the double post. The prior e-mail was sent with the incorrect subject line.) This is expected to be the final release candidate before version 1.0! Please download and test the binaries. For this release candidate in addition to the source code distributions, the language specific ?front-ends? and a wide selection for binary Python wheels, we have added Conda packages too. The Conda python packages have been uploaded to the `SimpleITK` channel under the `dev` label. (https://anaconda.org/simpleitk/repo/files?type=all&label=dev) The proper package can be downloaded with: conda install -c simpleitk/label/dev simpleitk A complete set of binary Python wheels are available for download and testing. It is important to have the latest version form pip to ensure correct wheel compatibility. To install the SimpleITK package run: pip install --upgrade pip pip install --pre -f https://github.com/SimpleITK/SimpleITK/releases/tag/v1.0rc3 SimpleITK There are a number of language specific "front-ends? which can be used to build SimpleITK: - Python - https://github.com/SimpleITK/SimpleITKPythonPackage - R - https://github.com/SimpleITK/SimpleITKRInstaller - Lua - https://github.com/SimpleITK/SimpleITKLuaRock -Conda - https://github.com/SimpleITK/SimpleITKCondaRecipe Release Candidate 3 Notes: - Additional Improvements: - Added multi-hash ExternalData support for sha512 - Added R Documentation files - Update Python and Java documentation strings files - Doxygen fixes - Fix allowing undefined symbols when building standalone language wrapping - More minor bug fixes Release Candidate 2 Notes: - Additional Improvements: - Updated ITK version along 4.11 release branch - Reorganized examples directory - Reorganized filter libraries to match ITK modules - Improved compilation with more specific ITK module usage - Now using modern CMake 3 style properties for exported libraries - API Changes - Depricated CMake variables with "SITK" prefix, now consistenly using the "SimpleITK" prefix for configurable CMake variables - Removed `ImageSeriesReader::GetGDCMSeriesFileNames` parameter `loadPrivateTags` parameter. This removes an overloaded version of the class method. - Added `sitkWallClock` enum for a sentinel value for random number seed to indicate initialization from the clock Release Candidate 1 Notes: * Key Improvements: - Improved Python data bridge - New Python method `GetArrayViewFromImage` provides copy free read-only access - Updated Python data structures to use `memory view` objects - Building SimpleITK wrappers: - R devtools based installer (https://github.com/SimpleITK/SimpleITKRInstaller). - Python: scripts for building wheels (https://github.com/SimpleITK/SimpleITKPythonPackage) and a Conda recipe (https://github.com/SimpleITK/SimpleITKCondaRecipe). - Support use of virtual image domain in the `ImageRegistrationMethod`. - OnePlusOneOptimizer added to registration framework. - Improved support for R: propogating C++ exceptions into R, additional R tests. - Additional tests for Java. - Python and R notebooks repository illustrating the basics and more advanced functionality of SimpleITK (https://github.com/InsightSoftwareConsortium/SimpleITK-Notebooks). - Added continous integration via CircleCI. - Updated version and improved integration of Google Test. - Updated ITK version to 4.11 - Updated minimal required CMake version to 3.0, and numerous CMake changes to support various build configurations. - Updated to usage of SWIG 3.0.11 ( using the latest SIWG is strongly recommended for R ) - Reorganized examples directory into example based sub-directories with multiple languages - Improvements to documentation transmogrification scripts - Many bug fixes and improvement to the build system! * API changes: - R methods which previously unnecessarily returned self return void. - New method `Image::GetNumberOfPixels` - New method `LabelMapContourOverlayImageFilter::SetColormap` - New method `LabelMapToRGBImageFilter::SetColormap` - New method `ImageRegistrationMethod::SetVirtualDomain` - New method `ImageRegistrationMethod::SetVirtualDomainFromImage` - New seed parameter to `ImageRegistrationMethod::AddMetricSamplingSeed` method - `CastImageFilter::SetOutputPixelType` method no longer accepts the pixel ID by value, uses only enumerated type. Please try out SimpleITK 1.0rc3, and report any issues! Enjoy! Bradley Lowekamp _______________________________________________ Community mailing list Community at itk.org http://public.kitware.com/mailman/listinfo/community -------------- next part -------------- An HTML attachment was scrubbed... URL: From zivrafael.yaniv at nih.gov Fri Mar 31 18:17:37 2017 From: zivrafael.yaniv at nih.gov (Yaniv, Ziv Rafael (NIH/NLM/LHC) [C]) Date: Fri, 31 Mar 2017 22:17:37 +0000 Subject: [ITK-users] [ITK] SimpleITK Serieswriter and DicomTags In-Reply-To: References: <1490878156334-38050.post@n7.nabble.com> <031C16D1-4B43-4BD8-9C80-91A2F9C72B6B@mail.nih.gov> Message-ID: <54518069-C5F9-445E-983C-FDD5A2EDA798@mail.nih.gov> Hello Matias, Please take a look at the following github pull request (https://github.com/SimpleITK/SimpleITK/pull/134), this branch should provide the functionality you are looking for. See the Python example script included in the commit for the usage of the DICOM series writing. hope this helps Ziv From: Matias Date: Thursday, March 30, 2017 at 12:14 PM To: "insight-users at itk.org" Subject: Re: [ITK-users] [ITK] SimpleITK Serieswriter and DicomTags Yes, this is what I would need to migrate to C#: It basically reads a dicom directory and performs rotation on the volume, then writes the resulting images back to a directory, copying the tags from the original images. #include "itkImage.h" #include "itkGDCMImageIO.h" #include "itkGDCMSeriesFileNames.h" #include "itkImageSeriesReader.h" #include "itkResampleImageFilter.h" #include "itkEuler3DTransform.hxx" #include "gdcmUIDGenerator.h" #include "itkImageFileWriter.h" #include "itkImageSeriesWriter.h" #include "itkNumericSeriesFileNames.h" #include "itkTranslationTransform.h" #include "string.h"; #include #include #include #include static void CopyDictionary(itk::MetaDataDictionary &fromDict, itk::MetaDataDictionary &toDict); int main(int argc, char* argv[]) { if (argc < 8) { std::cerr << "Uso: " << std::endl; std::cerr << argv[0] << " Directorio_A_Rotar DirectorioResultante Gamma Beta Alfa CentroRotacionX CentroRotacionY CentroRotacionZ" << std::endl; return EXIT_FAILURE; } typedef signed short PixelType; const unsigned int Dimension = 3; const unsigned int Dimension_Serie = 2; typedef itk::Image< PixelType, Dimension > ImageType; typedef itk::Image ImageType_Serie; typedef itk::ImageSeriesReader< ImageType > ReaderType; ReaderType::Pointer reader = ReaderType::New(); typedef itk::GDCMImageIO ImageIOType; ImageIOType::Pointer gdcmIO = ImageIOType::New(); reader->SetImageIO(gdcmIO); typedef itk::GDCMSeriesFileNames NamesGeneratorType; NamesGeneratorType::Pointer nameGenerator = NamesGeneratorType::New(); nameGenerator->SetUseSeriesDetails(true); nameGenerator->AddSeriesRestriction("0008|0021"); nameGenerator->SetDirectory(argv[1]); try { std::cout << std::endl << "The directory: " << std::endl; std::cout << std::endl << argv[1] << std::endl << std::endl; std::cout << "Contains the following DICOM Series: "; std::cout << std::endl << std::endl; typedef std::vector< std::string > SeriesIdContainer; const SeriesIdContainer & seriesUID = nameGenerator->GetSeriesUIDs(); SeriesIdContainer::const_iterator seriesItr = seriesUID.begin(); SeriesIdContainer::const_iterator seriesEnd = seriesUID.end(); while (seriesItr != seriesEnd) { std::cout << seriesItr->c_str() << std::endl; ++seriesItr; } std::string seriesIdentifier; seriesIdentifier = seriesUID.begin()->c_str(); std::cout << std::endl << std::endl; std::cout << "Now reading series: " << std::endl << std::endl; std::cout << seriesIdentifier << std::endl; std::cout << std::endl << std::endl; typedef std::vector< std::string > FileNamesContainer; FileNamesContainer fileNames; fileNames = nameGenerator->GetFileNames(seriesIdentifier); reader->SetFileNames(fileNames); try { reader->Update(); } catch (itk::ExceptionObject &ex) { std::cout << ex << std::endl; return EXIT_FAILURE; } const ImageType * inputImage = reader->GetOutput(); /*int numerodedicoms = inputImage->GetLargestPossibleRegion().GetSize()[2]; int dicomcentral = numerodedicoms / 2; std::cout << "Dimenion " << dicomcentral << std::endl;*/ //itk::EncapsulateMetaData(dictionary, "0020|0032","-208\\-236\\66"); typedef itk::ResampleImageFilter FilterType; FilterType::Pointer FiltroResample = FilterType::New(); FiltroResample->SetInput(reader->GetOutput()); typedef itk::LinearInterpolateImageFunction InterpolatorType; InterpolatorType::Pointer interpolator = InterpolatorType::New(); FiltroResample->SetInterpolator(interpolator); FiltroResample->SetOutputDirection(inputImage->GetDirection()); FiltroResample->SetOutputOrigin(inputImage->GetOrigin()); ImageType::SizeType inputSize = inputImage->GetLargestPossibleRegion().GetSize(); FiltroResample->SetSize(inputSize); const ImageType::SpacingType& inputSpacing = inputImage->GetSpacing(); FiltroResample->SetOutputSpacing(inputSpacing); FiltroResample->SetDefaultPixelValue(-1000); //Cambiar por un parametro typedef itk::Euler3DTransform< double > TransformType; //Transform TransformType::Pointer transform = TransformType::New(); double alfa, beta, gamma, centro_rotacion_X, centro_rotacion_Y, centro_rotacion_Z; gamma = atof(argv[3]); beta= atof(argv[4]); alfa = atof(argv[5]); centro_rotacion_X = atof(argv[6]); centro_rotacion_Y = atof(argv[7]); centro_rotacion_Z = atof(argv[8]); transform->SetRotation(gamma, beta, alfa); //Radianes en el siguiente orden en ITK: Gamma, Beta, Alfa | Ibarra //double centro[3] = { -14.8371, -54.9443, 175.75 }; //XmmPromedio, YmmPromedio, Z Central (mm): Leer directorio y tomar la del medio double centro[3] = { centro_rotacion_X, centro_rotacion_Y, centro_rotacion_Z }; //XmmPromedio, YmmPromedio, Z Central (mm): Leer directorio y tomar la del medio transform->SetCenter(centro); std::cout << "Centro: " << std::endl << std::endl; std::cout << transform->GetCenter() << std::endl; FiltroResample->SetTransform(transform); //FiltroResample->SetMetaDataDictionary(dictionary); try { FiltroResample->Update(); } catch (itk::ExceptionObject &ex) { return EXIT_FAILURE; } ReaderType::DictionaryRawPointer inputDict = (*(reader->GetMetaDataDictionaryArray()))[0]; ReaderType::DictionaryArrayType outputArray; //std::cout << "array: " << std::endl << outputArray[0] << std::endl; // To keep the new series in the same study as the original we need // to keep the same study UID. But we need new series and frame of // reference UID's. gdcm::UIDGenerator suid; //std::string seriesUID = suid.Generate(); gdcm::UIDGenerator fuid; std::string frameOfReferenceUID = fuid.Generate(); std::string studyUID; std::string sopClassUID; itk::ExposeMetaData(*inputDict, "0020|000d", studyUID); itk::ExposeMetaData(*inputDict, "0008|0016", sopClassUID); gdcmIO->KeepOriginalUIDOn(); using namespace std; double myArray_Z[70]; //Cambiar esto por un argumento que especifica la cantidad de imagenes. double myArray_X[70]; //Cambiar esto por un argumento que especifica la cantidad de imagenes. double myArray_Y[70]; //Cambiar esto por un argumento que especifica la cantidad de imagenes. ifstream file("file.txt"); if (file.is_open()) { for (int i = 0; i < 70; ++i) //Recordar cambiar por el argumento que especifica cantidad de imagenes { file >> myArray_Z[i]; } } std::cout << "valor primer Z array: " << std::endl << std::endl; std::cout << myArray_Z[0] << std::endl; for (unsigned int f = 0; f < inputSize[2]; f++) { // Create a new dictionary for this slice ReaderType::DictionaryRawPointer dict = new ReaderType::DictionaryType; // Copy the dictionary from the first slice CopyDictionary(*inputDict, *dict); // Set the UID's for the study, series, SOP and frame of reference itk::EncapsulateMetaData(*dict, "0020|000d", studyUID); //itk::EncapsulateMetaData(*dict, "0020|000e", seriesUID); itk::EncapsulateMetaData(*dict, "0020|0052", frameOfReferenceUID); gdcm::UIDGenerator sopuid; std::string sopInstanceUID = sopuid.Generate(); itk::EncapsulateMetaData(*dict, "0008|0018", sopInstanceUID); itk::EncapsulateMetaData(*dict, "0002|0003", sopInstanceUID); // Change fields that are slice specific std::ostringstream value; value.str(""); value << f + 1; // Image Number itk::EncapsulateMetaData(*dict, "0020|0013", value.str()); // Series Description - Append new description to current series // description std::string oldSeriesDesc; itk::ExposeMetaData(*inputDict, "0008|103e", oldSeriesDesc); value.str(""); value << oldSeriesDesc << ": Resampled with pixel spacing " << inputSpacing[0] << ", " << inputSpacing[1] << ", " << inputSpacing[2]; // This is an long string and there is a 64 character limit in the // standard unsigned lengthDesc = value.str().length(); std::string seriesDesc(value.str(), 0, lengthDesc > 64 ? 64 : lengthDesc); itk::EncapsulateMetaData(*dict, "0008|103e", seriesDesc); // Series Number value.str(""); value << 1001; itk::EncapsulateMetaData(*dict, "0020|0011", value.str()); // Derivation Description - How this image was derived value.str(""); for (int i = 0; i < argc; i++) { value << argv[i] << " "; } lengthDesc = value.str().length(); std::string derivationDesc(value.str(), 0, lengthDesc > 1024 ? 1024 : lengthDesc); itk::EncapsulateMetaData(*dict, "0008|2111", derivationDesc); // Image Position Patient: This is calculated by computing the // physical coordinate of the first pixel in each slice. ImageType::PointType position; ImageType::IndexType index; index[0] = 0; index[1] = 0; index[2] = myArray_Z[f]; FiltroResample->GetOutput()->TransformIndexToPhysicalPoint(index, position); //El origen que calculamos en el proyecto no se toca. (Origen = origen - average) //Cambiamos el ImageOrientationPatient SOLAMENTE si el valor original en la imagen es: 1\0\0\0\1\0. En el caso que se cambia el signo, se debe cambiar el signo del origen //value.str(""); //value << -1 << "\\" << 0 << "\\" << 0 << "\\" << 0 << "\\" << -1 << "\\" << 0; //PASAR ESTO POR ARGUMENTO!!! //itk::EncapsulateMetaData(*dict, "0020|0037", value.str()); value.str(""); value << -235.1629 << "\\" << -195.0557 << "\\" << myArray_Z[f]; //PASAR ESTO POR ARGUMENTO!!! El origen - Centro itk::EncapsulateMetaData(*dict, "0020|0032", value.str()); // Slice Location: For now, we store the z component of the Image // Position Patient. value.str(""); value << position[2]; itk::EncapsulateMetaData(*dict, "0020|1041", value.str()); // Slice Thickness: For now, we store the z spacing value.str(""); value << inputSpacing[2]; itk::EncapsulateMetaData(*dict, "0018|0050", value.str()); // Spacing Between Slices itk::EncapsulateMetaData(*dict, "0018|0088", value.str()); // Save the dictionary outputArray.push_back(dict); } typedef itk::ImageFileWriter< ImageType > WriterType; WriterType::Pointer writer = WriterType::New(); typedef itk::ImageSeriesWriter< ImageType, ImageType_Serie > SeriesWriterType; SeriesWriterType::Pointer seriesWriter = SeriesWriterType::New(); seriesWriter->SetInput(FiltroResample->GetOutput()); writer->SetFileName(argv[2]); writer->SetInput(FiltroResample->GetOutput()); itksys::SystemTools::MakeDirectory("Test"); //PASAR ESTO POR ARGUMENTO!! typedef itk::NumericSeriesFileNames OutputNamesGeneratorType; OutputNamesGeneratorType::Pointer outputNames = OutputNamesGeneratorType::New(); std::string seriesFormat("Test"); //PASAR ESTO POR ARGUMENTO!! seriesFormat = seriesFormat + "/" + "IM%d.dcm"; outputNames->SetSeriesFormat(seriesFormat.c_str()); outputNames->SetStartIndex(1); outputNames->SetEndIndex(inputSize[2]); seriesWriter->SetImageIO(gdcmIO); seriesWriter->SetFileNames(outputNames->GetFileNames()); seriesWriter->SetMetaDataDictionaryArray(&outputArray); std::cout << "Escribiendo la imagen como..." << std::endl << std::endl; std::cout << argv[2] << std::endl << std::endl; try { writer->Update(); seriesWriter->Update(); } catch (itk::ExceptionObject &ex) { std::cout << ex << std::endl; return EXIT_FAILURE; } } catch (itk::ExceptionObject &ex) { std::cout << ex << std::endl; return EXIT_FAILURE; } return EXIT_SUCCESS; } void CopyDictionary(itk::MetaDataDictionary &fromDict, itk::MetaDataDictionary &toDict) { typedef itk::MetaDataDictionary DictionaryType; DictionaryType::ConstIterator itr = fromDict.Begin(); DictionaryType::ConstIterator end = fromDict.End(); typedef itk::MetaDataObject< std::string > MetaDataStringType; while (itr != end) { itk::MetaDataObjectBase::Pointer entry = itr->second; MetaDataStringType::Pointer entryvalue = dynamic_cast(entry.GetPointer()); if (entryvalue) { std::string tagkey = itr->first; std::string tagvalue = entryvalue->GetMetaDataObjectValue(); itk::EncapsulateMetaData(toDict, tagkey, tagvalue); } ++itr; } } El jue., 30 de mar. de 2017 a la(s) 11:25, Lowekamp, Bradley (NIH/NLM/LHC) [C] [via ITK - Users] <[hidden email]> escribi?: Hello, Writing correct DICOM continues to be a struggle with SimpleITK and ITK. It is generally recommended to directly use GDCM or DCMTK to write a proper DICOM series. SimpleITK tries to keep things, well, simple and straight forward. But ITK ties to do some smart things, which get in the way for certain uses with SimpleITK. We are trying to document and develop a nominal set of DICOM output operations that work in SimpleITK. Do you have working C++ code that works for your intended operation? Can you share a small section of code which does what you expect it C++? Thank, Brad > On Mar 30, 2017, at 8:49 AM, Matias <[hidden email]> wrote: > > Hi, > > I've been dealing with ITK for years in C++ and now I would need to use > SimpleITK and C# as far as I can in a new proyect. > > Is the SimpleITK SeriesWriter working for Dicom Files? Last time I tried to > use it I had problems with the DicomTags, these would not copy or there was > no method to copy the tags to the resulting slices. > > Currently, I read a volume of slices, apply rotation and then I need to > write the resulting image as another set of slices AND keeping tag > information such as patient name, etc. > > Thank you, > > Matias. > > > > -- > View this message in context: http://itk-users.7.n7.nabble.com/SimpleITK-Serieswriter-and-DicomTags-tp38050.html > Sent from the ITK - Users mailing list archive at Nabble.com. > _____________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Kitware offers ITK Training Courses, for more information visit: > http://www.kitware.com/products/protraining.php > > Please keep messages on-topic and check the ITK FAQ at: > http://www.itk.org/Wiki/ITK_FAQ > > Follow this link to subscribe/unsubscribe: > http://public.kitware.com/mailman/listinfo/insight-users > _______________________________________________ > Community mailing list > [hidden email] > http://public.kitware.com/mailman/listinfo/community _____________________________________ Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Kitware offers ITK Training Courses, for more information visit: http://www.kitware.com/products/protraining.php Please keep messages on-topic and check the ITK FAQ at: http://www.itk.org/Wiki/ITK_FAQ Follow this link to subscribe/unsubscribe: http://public.kitware.com/mailman/listinfo/insight-users ________________________________ If you reply to this email, your message will be added to the discussion below: http://itk-users.7.n7.nabble.com/SimpleITK-Serieswriter-and-DicomTags-tp38050p38052.html To unsubscribe from SimpleITK Serieswriter and DicomTags, click here. NAML -- Matias ________________________________ View this message in context: Re: [ITK-users] [ITK] SimpleITK Serieswriter and DicomTags Sent from the ITK - Users mailing list archive at Nabble.com. -------------- next part -------------- An HTML attachment was scrubbed... URL: