1. 程式人生 > >ITK學習筆記-2:影象取樣

ITK學習筆記-2:影象取樣

主要是利用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。

執行結果如下圖所示: