[ITK] ITK-4.6 problem

Gib Bogle g.bogle at auckland.ac.nz
Tue Sep 16 01:15:09 EDT 2014


Hi all,

There definitely seems to be a problem with ITK-4.6, at least with the code that got installed while building Slicer.  This was carried out with ITKV3_COMPATIBILITY off.  I am doing some testing with this installation to try to understand why Slicer cannot handle big tiffs (on my Windows 7 system).

There is something a bit funny about the installed ITK-4.6, in that the compiler complained about some missing include files, vnl_*.h and others, which are in my ITK-4.0 installation but not in 4.6.  I just copied them across - I hope this is not a problem.

Anyway, I now find that my very simple program that uses ITK to create a tiff file now crashes when built with 4.6.  What is a big clue is that it fails while creating the image, i.e. writing to the buffer, on page 73 - it's surely more than a coincidence that Slicer fails when reading page 72 of a 4 GB tiff.   In this case only 73 bytes have been written to buffer when it fails.  The whole program is below.  It fails having written x=0, y=0, z=0...73 to the console.

Unless my code (which was fine with 4.0) is no longer OK with 4.6, this is a very basic bug, since all I do is set the image size, allocate memory, get a pointer to the buffer and start writing to it.

The program is short enough to paste in its entirety, but the relevant section is just a few lines.

#include <cstdio>
#include <vector>

#include <algorithm>
#include <math.h>
#include <string.h>
#include <string>
#include <sstream>
#include <assert.h>
#include <ctime>

#include "itkImage.h"
#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"
#include "itkSize.h"

typedef itk::Image<unsigned char,3> ImageType;
ImageType::Pointer im;
unsigned char *p;

#define V(a,b,c)  p[(c)*xysize+(b)*width+(a)]

int main(int argc, char**argv)
{
    int x1, x2, y1, y2, z1, z2;
    int x0, y0, z0, dx, dy, dz;
    int x, y, z, xx, yy, zz, n, comp_flag;
    long long width, height, depth, xysize;
    int R, R2;
    bool use_compression;
    bool use_sphere = false;

    if (argc != 4) {
        printf("Usage: makebig tiff_file N compress\n");
        printf("       the image will be NxNxN\n");
        printf("       set compress=1 to use compression, =0 otherwise\n");
        return 1;
    }

    printf("Output image file: %s\n",argv[1]);
    sscanf(argv[2],"%d",&n);
    sscanf(argv[3],"%d",&comp_flag);
    use_compression = (comp_flag == 1);
    x0 = n/2;
    y0 = n/2;
    z0 = n/2;
    R = 5;
    R2 = R*R;
    width = n;
    height = n;
    depth = n;
    xysize = width*height;
    printf("Desired image dimensions: width, height, depth: %d %d %d\n",width,height,depth);

    ImageType::Pointer im = ImageType::New();
    ImageType::SizeType imsize;
    imsize[0] = width;
    imsize[1] = height;
    imsize[2] = depth;
    ImageType::IndexType imstart;
    imstart[0] = 0;
    imstart[1] = 0;
    imstart[2] = 0;
    ImageType::RegionType imregion;
    imregion.SetSize(imsize);
    imregion.SetIndex(imstart);
    im->SetRegions(imregion);
    im->Allocate();
    p = (unsigned char *)(im->GetBufferPointer());

    width = im->GetLargestPossibleRegion().GetSize()[0];
    height = im->GetLargestPossibleRegion().GetSize()[1];
    depth = im->GetLargestPossibleRegion().GetSize()[2];
    printf("Requested image dimensions: width, height, depth: %d %d %d\n",width,height,depth);

    for (x=0; x<width; x++) {
        printf("x: %d\n",x);
        for (y=0; y<height; y++) {
            printf("y: %d\n",y);
            for (z=0; z<depth; z++)    {
                printf("z: %d\n",z);
                if (use_sphere) {
                    dx = x - x0;
                    dy = y - y0;
                    dz = z - z0;
                    if (dx*dx+dy*dy+dz*dz <= R2) {
                        V(x,y,z) = 255;
                    } else {
                        V(x,y,z) = 0;
                    }
                } else {
                    if (x < x0-R || x > x0+R) {
                        V(x,y,z) = 0;
                    } else {
                        V(x,y,z) = 255;
                    }
                }
            }
        }
    }

    typedef itk::ImageFileWriter<ImageType> FileWriterType;
    FileWriterType::Pointer writer = FileWriterType::New();
    writer->SetFileName(argv[1]);
    writer->SetInput(im);
    if (use_compression) {
        writer->UseCompressionOn();
    }
    printf("Writing tiff file\n");
    try
    {
        writer->Update();
    }
    catch (itk::ExceptionObject &e)
    {
        std::cout << e << std::endl;
        return 4;
    }
    if (use_compression) {
        printf("Created compressed image file: %s\n",argv[1]);
    } else {
        printf("Created uncompressed image file: %s\n",argv[1]);
    }

    return 0;
}

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/community/attachments/20140916/12efe70e/attachment-0002.html>


More information about the Community mailing list