ITK:CannyEdgeDetectionFilter问题

时间:2015-08-04 21:05:54

标签: c++ image-processing itk

我正在尝试使用CannyEdgeDetectionImageFilter,但GetPixel()方法似乎没有正确引用过滤后的图像。我尝试了很多不同的策略来尝试解决这个问题,但唯一可行的方法就是在磁盘上写入和读取图像(这并不理想)。我的代码如下:

typedef itk::Image<unsigned char, 2>    ImageType;
typedef itk::Image<float, 2>        floatImageType;

...

floatImageType::Pointer to_float(ImageType::Pointer image){
    typedef itk::CastImageFilter <ImageType, floatImageType> CastFilterType;
    CastFilterType::Pointer castToFloat = CastFilterType::New();

    castToFloat->SetInput( image );
    castToFloat->Update();

    return castToFloat->GetOutput();
}

...

ImageType::Pointer check(ImageType::Pointer image){
    typedef itk::ImageDuplicator        <ImageType>     ImageDuplicatorType;
    typedef itk::RescaleIntensityImageFilter
                        <floatImageType, ImageType>     RescaleFilter;
    typedef itk::CannyEdgeDetectionImageFilter 
                    <floatImageType, floatImageType>    CannyFilter;

    RescaleFilter::Pointer          Rescale       = RescaleFilter::New();
    CannyFilter::Pointer            Canny         = CannyFilter::New();
    ImageDuplicatorType::Pointer    Duplicator    = ImageDuplicatorType::New();
    ImageType::Pointer              cannyImage;

    Canny->SetVariance( 20 );
    Canny->SetUpperThreshold(  2 );
    Canny->SetLowerThreshold( 20 );

    Rescale->SetOutputMinimum(    0 );
    Rescale->SetOutputMaximum(  255 );

    Duplicator->SetInputImage(image);
    Duplicator->Update();
    ImageType::Pointer img_copy = Duplicator->GetOutput();

    floatImageType::Pointer floatImage  = to_float(img_copy);

    Canny->SetInput(floatImage);
    Rescale->SetInput( Canny->GetOutput() );
    Rescale->Update();
    cannyImage = Rescale->GetOutput();

    /* Insert odd work-around here */

    const ImageType::SizeType img_size = cannyImage->GetLargestPossibleRegion().GetSize();

    itk::Index<2> loc = {{img_size[0]/2, 0}};
    int top_edge = 0;
    bool contin = true;

    for (int i = 0; ((i < img_size[1]) && contin); i++){
        loc[1] = i;

        if (cannyImage->GetPixel(loc) != 0){
            top_edge = i;
            contin = false;
        }
    }
    ...
}

如果稍后的像素值为cannyImage,则该值应为0或(如果是边缘)255。但是,它会生成看似属于灰度图像的值。

但是,如果我在上面的部分中包含以下代码,它可以正常运行:

    std::string fname = "/tmp/canny_" + to_string(getpid()) + ".tmp";
    writeImage(cannyImage, fname);
    cannyImage = readImage(fname);

(方法writeImage(ImageType::Pointer image, std::string filename)ImageType::Pointer readImage(std::string filename)在程序之前已定义。)

任何人都知道我的计划出了什么问题?为什么通过磁盘IO推送它会导致它工作?

0 个答案:

没有答案