typename PatchExtractor<PValue>::MaskType::Pointer PatchExtractor<PValue>::ExtractMask()
{
	ContIndexType startIndex;
	for(unsigned int i = 0; i < 2; i++)
	{
		startIndex[i] = m_Center[i] - (m_Size[i] / 2.0);
	}
	startIndex[2] = 0;


	typename ImageType::IndexType properIndex;
	for(unsigned int i = 0; i < 3; i++)
	{
		properIndex[i] = round(startIndex[i]);
	}

	for(unsigned int i = 0; i < 2; i++)
	{
		if(properIndex[i] < 0) properIndex[i] = 0;
		if((m_Size[i] + properIndex[i]) > (m_Image->GetLargestPossibleRegion().GetSize()[i]-1))
		{
			m_Size[i] = m_Image->GetLargestPossibleRegion().GetSize()[i]-1-properIndex[i];
		}
	}
	
	MaskType::RegionType region;
	region.SetIndex(properIndex);
	m_Size[2] = 1;
	region.SetSize(m_Size);

	MaskType::Pointer mask = MaskType::New();
	mask->SetDirection(m_Image->GetDirection());
	mask->SetSpacing(m_Image->GetSpacing());
	mask->SetOrigin(m_Image->GetOrigin());
	mask->SetRegions(m_Image->GetLargestPossibleRegion());
	mask->Allocate();
	mask->FillBuffer(0);

	itk::ImageRegionIterator<MaskType> imageIt(mask, region);
	while(!imageIt.IsAtEnd())
	{
		imageIt.Set(m_MaskValue);
		++imageIt;
	}

	return mask;
}
itk::Image<unsigned char, 3>::Pointer pdp::EMClassification::classify(itk::Image<float, 3>::Pointer img, itk::Image<unsigned char, 3>::Pointer mask)
{
	typedef itk::Vector< double, 1 > MeasurementVectorType;
	typedef itk::Image<unsigned char, 3> MaskType;
	typedef itk::Image<float, 3> ImageType;

	typedef itk::ImageRegionConstIterator< ImageType > ImageIteratorType;
	ImageIteratorType imgIt(img, img->GetLargestPossibleRegion());

	typedef itk::ImageRegionConstIterator< MaskType> MaskIteratorType;
	MaskIteratorType maskIt( mask, mask->GetLargestPossibleRegion());

	MaskType::Pointer correctImage = MaskType::New();
	correctImage->CopyInformation(mask);
	MaskType::RegionType outputRegion = mask->GetLargestPossibleRegion();
	correctImage->SetRegions( outputRegion );
	correctImage->Allocate();
	typedef itk::ImageRegionIterator<MaskType> IteratorType;
	IteratorType outputIt( correctImage, outputRegion);

	MeasurementVectorType mv;
	for ( imgIt.GoToBegin(), maskIt.GoToBegin(), outputIt.GoToBegin(); !maskIt.IsAtEnd(); ++maskIt, ++imgIt, ++outputIt)
	{

		if (maskIt.Get() == 255)
		{
			mv[0] = imgIt.Get();
			if (genLabel(mv) == 3)
			{
				outputIt.Set(255);
			}
		}
	}

	return correctImage;
}