Ошибка в itk::BinaryImageToLabelMapFilter для изображений с 1 строкой и N столбцами

Я новичок в C++ и ITK (а также новичок в stackru). Я возился с тестовым кодом в учебных целях. Ниже приведен простой фрагмент кода для считывания изображения в градациях серого, порогового значения для получения двоичного изображения и получения из него карты меток. Я использую MS VS2010 и ITK v4.5.1.

typedef itk::Image< unsigned char, 2 >  ScalarImageType;

typedef itk::ImageFileWriter< ScalarImageType > WriterType;
typedef itk::ImageFileReader< ScalarImageType > ReaderType;

typedef itk::OtsuThresholdImageFilter< ScalarImageType, ScalarImageType > OtsuThresholdImageFilterType;
typedef itk::BinaryImageToLabelMapFilter< ScalarImageType > BinaryImageToLabelMapFilterType;

// read a grayscale image
ReaderType::Pointer reader = ReaderType::New();
reader->SetFileName("test_grey.jpg");
try
{
    reader->Update();
}
catch( itk::ExceptionObject &err )
{
    std::cerr << "ExceptionObject caught !" << std::endl;
    std::cerr << err << std::endl;
    return(FALSE);
}

// threshold the grayscale image
OtsuThresholdImageFilterType::Pointer otsuThresImgFilter = OtsuThresholdImageFilterType::New();
otsuThresImgFilter->SetInput(reader->GetOutput());
otsuThresImgFilter->SetInsideValue(255);
otsuThresImgFilter->SetOutsideValue(0);
try
{
    otsuThresImgFilter->Update();
}
catch( itk::ExceptionObject &err )
{
    std::cerr << "ExceptionObject caught !" << std::endl;
    std::cerr << err << std::endl;
    return(FALSE);
}

// get a label map from the binary image
BinaryImageToLabelMapFilterType::Pointer binarytoLabelmapFilter = BinaryImageToLabelMapFilterType::New();
binarytoLabelmapFilter->SetInput(otsuThresImgFilter->GetOutput());
try
{
    binarytoLabelmapFilter->Update();
}
catch( itk::ExceptionObject &err )
{
    std::cerr << "ExceptionObject caught !" << std::endl;
    std::cerr << err << std::endl;
    return(FALSE);
}

Это прекрасно работает для всех изображений, кроме тех, которые имеют только 1 строку и N столбцов (что интересно, 1 x 1 изображения проходят нормально).

Так, для 1 x N изображений программа вылетает в режиме релиза. В режиме отладки я получаю ошибку "векторный индекс вне диапазона". Проходя по коду, я обнаружил, что сбой происходит на линии binarytoLabelmapFilter->Update(); моего кода.

Стек вызовов:

msvcr100d.dll!_CrtDbgBreak()  Line 85   C
msvcr100d.dll!_VCrtDbgReportW(int nRptType, const wchar_t * szFile, int nLine, const wchar_t * szModule, const wchar_t * szFormat, char * arglist)  Line 502    C
msvcr100d.dll!_CrtDbgReportWV(int nRptType, const wchar_t * szFile, int nLine, const wchar_t * szModule, const wchar_t * szFormat, char * arglist)  Line 241 + 0x1d bytes   C++
msvcr100d.dll!_CrtDbgReportW(int nRptType, const wchar_t * szFile, int nLine, const wchar_t * szModule, const wchar_t * szFormat, ...)  Line 258 + 0x1d bytes   C++
msvcp100d.dll!std::_Debug_message(const wchar_t * message, const wchar_t * file, unsigned int line)  Line 13 + 0x16 bytes   C++
HelloWorld.exe!std::vector<std::vector<itk::BinaryImageToLabelMapFilter<itk::Image<unsigned char,2>,itk::LabelMap<itk::LabelObject<unsigned long,2> > >::runLength,std::allocator<itk::BinaryImageToLabelMapFilter<itk::Image<unsigned char,2>,itk::LabelMap<itk::LabelObject<unsigned long,2> > >::runLength> >,std::allocator<std::vector<itk::BinaryImageToLabelMapFilter<itk::Image<unsigned char,2>,itk::LabelMap<itk::LabelObject<unsigned long,2> > >::runLength,std::allocator<itk::BinaryImageToLabelMapFilter<itk::Image<unsigned char,2>,itk::LabelMap<itk::LabelObject<unsigned long,2> > >::runLength> > > >::operator[](unsigned int _Pos)  Line 932 + 0x17 bytes C++
HelloWorld.exe!itk::BinaryImageToLabelMapFilter<itk::Image<unsigned char,2>,itk::LabelMap<itk::LabelObject<unsigned long,2> > >::ThreadedGenerateData(const itk::ImageRegion<2> & outputRegionForThread, unsigned int threadId)  Line 190 + 0x1c bytes  C++
HelloWorld.exe!itk::ImageSource<itk::LabelMap<itk::LabelObject<unsigned long,2> > >::ThreaderCallback(void * arg)  Line 295 + 0x25 bytes    C++
HelloWorld.exe!itk::MultiThreader::SingleMethodProxy(void * arg)  Line 375 + 0xe bytes  C++
msvcr100d.dll!_callthreadstartex()  Line 314 + 0xf bytes    C
msvcr100d.dll!_threadstartex(void * ptd)  Line 297  C
kernel32.dll!773f338a()     
[Frames below may be incorrect and/or missing, no symbols loaded for kernel32.dll]  
ntdll.dll!77a49f72()    
ntdll.dll!77a49f45() 

Есть идеи, что происходит? Любые советы о том, как расследовать дальше? Будучи новичком, я не уверен, является ли это проблемой в ITK, которую я должен поднять как ошибку, или это связано с чем-то, что я делаю неправильно.

1 ответ

Решение

Кажется, проблема связана с количеством потоков, используемых BinaryImageToLabelMapFilter. Ошибка исчезнет, ​​если я установлю количество потоков на 1, добавив строку

binarytoLabelmapFilter->SetNumberofThreads(1);

перед обновлением фильтра.

Кажется, это ошибка в ITK. Тема обсуждения в списке рассылки ITK - http://public.kitware.com/pipermail/community/2014-July/003110.html

Другие вопросы по тегам