void segmentation::on_abnormalRegionSegButton_clicked() { fstream fin11, fin12; char* s11Txt = ("../data/ped/txt/15715_11.txt");//s11.txt char* s12Txt = ("../data/ped/txt/15715_12.txt"); int (*s11)[512] = new int[64][512]; int (*s12)[512] = new int[64][512]; int (*p)[512] = new int[64][512]; //read TXT fin11.open(s11Txt, ios::in); fin12.open(s12Txt, ios::in); //get the p matrix for(int z = 0; z < 64; z++) { for(int x = 0; x < 512; x++) { fin11>>s11[z][x]; fin12>>s12[z][x]; if(s12[z][x] - s11[z][x] > 5) //5 threshold p[z][x] = 1; else p[z][x] = 0; } } fin11.close(); fin12.close(); //read filtered MHD data typedef itk::Image<unsigned short, 3>InputImageType; typedef itk::Image<unsigned short, 3>OutputImageType; typedef itk::Image<unsigned char, 3>InitOutputImageType; InputImageType::Pointer inputImage = InputImageType::New(); OutputImageType::Pointer outputImage = OutputImageType::New(); InitOutputImageType::Pointer initOutputImage = InitOutputImageType::New(); typedef itk::ImageFileReader<InputImageType>ReaderType; ReaderType::Pointer reader = ReaderType::New(); reader->SetFileName(inputFileName);//读入原图像 reader->Update(); inputImage = reader->GetOutput(); InputImageType::IndexType voxelIndex; InitOutputImageType::IndexType initvoxelIndex; OutputImageType::IndexType newvoxelIndex; InputImageType::SizeType imgSize = inputImage->GetLargestPossibleRegion().GetSize(); OutputImageType::IndexType index; index[0] = 0; index[1] = 0; index[2] = 0; OutputImageType::SizeType size; size[0] = imgSize[0]; size[1] = imgSize[1]; size[2] = imgSize[2]; //create a region for initial result InitOutputImageType::RegionType initRegion; initRegion.SetIndex(index); initRegion.SetSize(size); initOutputImage->SetRegions( initRegion); initOutputImage->Allocate(); //create a region for enhance result OutputImageType::RegionType region; region.SetIndex(index); region.SetSize(size); outputImage->SetRegions(region); outputImage->Allocate(); //Initial result for PED segmentation (a binary image) for(int z = 0; z < imgSize[2]; z++) for(int x = 0; x < imgSize[0]; x++) { initvoxelIndex[0] = x; initvoxelIndex[2] = z; for(int y = 0; y < imgSize[1]; y++) { //set all background a black region initvoxelIndex[1] = y; initOutputImage->SetPixel(initvoxelIndex, 0); } //set the same intensity for all PED region (empirical value) if(p[z][x] == 1) { for(int y = s11[z][x]; y <= s12[z][x]; y++) { initvoxelIndex[1] = y; initOutputImage->SetPixel(initvoxelIndex, 255);//亮区域 } } } //输出中间分割结果 //文件前缀名 filePrefix = inputFileName;//char* to string filePrefix = filePrefix.substr(0, filePrefix.length() - 4); string strInitFileName; strInitFileName = filePrefix + "_initBinaryImg.mhd"; strcpy(initFileName, strInitFileName.c_str());//string to char* typedef itk::ImageFileWriter<InitOutputImageType>InitWriterType; InitWriterType::Pointer initWriter = InitWriterType::New(); initWriter->SetFileName(initFileName);//生成二值图 initWriter->SetInput(initOutputImage); initWriter->Update(); //Enhance PED region and overlay it on the original image for(int z = 0; z < imgSize[2]; z++) for(int x = 0; x < imgSize[0]; x++) { voxelIndex[0] = x; voxelIndex[2] = z; newvoxelIndex[0] = x; newvoxelIndex[2] = z; for(int y = 0; y < imgSize[1]; y++) { voxelIndex[1] = y; newvoxelIndex[1] = y; outputImage->SetPixel(newvoxelIndex, inputImage->GetPixel(voxelIndex)); } //set the same intensity for all PED region (empirical value) if(p[z][x] == 1) { for(int y = s11[z][x]; y <= s12[z][x]; y++) { newvoxelIndex[1] = y; outputImage->SetPixel(newvoxelIndex, 65535);//亮区域 } } } //释放内存不能缺省 delete[]s11; delete[]s12; delete[]p; typedef itk::ImageFileWriter<OutputImageType>WriterType; WriterType::Pointer writer = WriterType::New(); filePrefix = filePrefix + "_initResult.mhd"; strcpy(outputFileName, filePrefix.c_str());//string to char* initResultFileName = outputFileName;//输出初始分割结果,二值图重叠在原图像上面 writer->SetFileName(outputFileName); writer->SetInput(outputImage); writer->Update(); emit returnOutputFileName(outputFileName);//发出信号 }