ITK學習筆記-2:影象取樣
阿新 • • 發佈:2019-01-24
主要是利用ITK對RBG影象進行取樣處理。至於ITK的管道結構等基礎概念不在此進行討論,本文直接給出程式碼。
執行時候介面如下圖所示:
#include "itkImage.h" #include "itkIdentityTransform.h" #include "itkImageFileReader.h" #include "itkVectorResampleImageFilter.h" #include "itkVectorNearestNeighborInterpolateImageFunction.h" #include "itkRGBPixel.h" #include "QuickView.h" typedef itk::Image<itk::RGBPixel<unsigned char>, 2> ImageType; static void CreateImage(ImageType::Pointer image); int main(int argc, char *argv[]) { double factor = 2.0; // Create input image ImageType::Pointer input; if(argc < 2) { input = ImageType::New(); CreateImage(input); } else { typedef itk::ImageFileReader<ImageType> ReaderType; ReaderType::Pointer reader = ReaderType::New(); reader->SetFileName(argv[1]); reader->Update(); input = reader->GetOutput(); if (argc > 2) { factor = atof(argv[2]); } } ImageType::SizeType inputSize = input->GetLargestPossibleRegion().GetSize(); std::cout << "Input size: " << inputSize << std::endl; // Resize ImageType::SizeType outputSize; outputSize[0] = inputSize[0] * factor; outputSize[1] = inputSize[1] * factor; ImageType::SpacingType outputSpacing; outputSpacing[0] = input->GetSpacing()[0] * (static_cast<double>(inputSize[0]) / static_cast<double>(outputSize[0])); outputSpacing[1] = input->GetSpacing()[1] * (static_cast<double>(inputSize[1]) / static_cast<double>(outputSize[1])); typedef itk::IdentityTransform<double, 2> TransformType; typedef itk::VectorResampleImageFilter<ImageType, ImageType> ResampleImageFilterType; ResampleImageFilterType::Pointer resample = ResampleImageFilterType::New(); resample->SetInput(input); resample->SetSize(outputSize); resample->SetOutputSpacing(outputSpacing); resample->SetTransform(TransformType::New()); resample->UpdateLargestPossibleRegion(); typedef itk::VectorNearestNeighborInterpolateImageFunction< ImageType, double > NearestInterpolatorType; NearestInterpolatorType::Pointer nnInterpolator = NearestInterpolatorType::New(); ResampleImageFilterType::Pointer resampleNN = ResampleImageFilterType::New(); resampleNN->SetInput(input); resampleNN->SetSize(outputSize); resampleNN->SetOutputSpacing(outputSpacing); resampleNN->SetTransform(TransformType::New()); resampleNN->SetInterpolator(nnInterpolator);//相比較於,多了最近鄰插值 resampleNN->UpdateLargestPossibleRegion(); ImageType::Pointer output = resample->GetOutput(); std::cout << "Output size: " << output->GetLargestPossibleRegion().GetSize() << std::endl; QuickView viewer; viewer.AddRGBImage(input.GetPointer(), true, "Original"); viewer.AddRGBImage(output.GetPointer(), true, "Resampled"); viewer.AddRGBImage(resampleNN->GetOutput(), true, "Resampled NN"); viewer.Visualize(); return EXIT_SUCCESS; } void CreateImage(ImageType::Pointer image) { // Create a black image with 2 white regions ImageType::IndexType start; start.Fill(0); ImageType::SizeType size; size.Fill(200); ImageType::RegionType region(start,size); image->SetRegions(region); image->Allocate(); image->FillBuffer( itk::NumericTraits< ImageType::PixelType >::Zero); ImageType::PixelType pixel; pixel.SetRed(200); pixel.SetGreen(50); pixel.SetBlue(50); // Make a square for(unsigned int r = 20; r < 80; r++) { for(unsigned int c = 30; c < 100; c++) { ImageType::IndexType pixelIndex; pixelIndex[0] = r; pixelIndex[1] = c; image->SetPixel(pixelIndex, pixel); } } }
執行時候介面如下圖所示:
因為主程式中所取樣的是int main(int argc, char*argv[])
所以在執行exe的時候,通過dos視窗進行exe所在的目錄,後續的兩個引數分別為F:\DIPcode\SIMC\imagesrc\2.jpg 0.2
第一個引數用於指定待處理的影象,第二個引數說明取樣率。此處設定為0.2,則取樣後的影象為原始影象尺寸的0.2倍。如上圖可以看到,原始影象是512X512的影象,取樣之後影象的尺寸變為102X102,約為512*0.2。
執行結果如下圖所示: