double Converter::convert ( double oldValue, casa::SpectralCoordinate spectralCoordinate ) { std::vector<double> sourceValues( 1 ); sourceValues[0] = oldValue; casa::Vector<double> destValues = convert( sourceValues, spectralCoordinate ); double result = destValues[0]; return result; }
bool AcceptMatch(VertexDescriptorType target, VertexDescriptorType source, float& computedEnergy) const { itk::Index<2> targetPixel = ITKHelpers::CreateIndex(target); itk::ImageRegion<2> targetRegion = ITKHelpers::GetRegionInRadiusAroundPixel(targetPixel, HalfWidth); itk::Index<2> sourcePixel = ITKHelpers::CreateIndex(source); itk::ImageRegion<2> sourceRegion = ITKHelpers::GetRegionInRadiusAroundPixel(sourcePixel, HalfWidth); // Get the pixels to use in the target region std::vector<typename TImage::PixelType> validPixelsTargetRegion = MaskOperations::GetValidPixelsInRegion(Image, MaskImage, targetRegion); // Get the pixels to use in the source region std::vector<itk::Offset<2> > validOffsets = MaskImage->GetValidOffsetsInRegion(targetRegion); std::vector<itk::Index<2> > sourcePatchValidPixelIndices = ITKHelpers::OffsetsToIndices(validOffsets, sourceRegion.GetIndex()); std::vector<typename TImage::PixelType> validPixelsSourceRegion = ITKHelpers::GetPixelValues(Image, sourcePatchValidPixelIndices); assert(validPixelsSourceRegion.size() == validPixelsTargetRegion.size()); unsigned int numberOfPixels = validPixelsTargetRegion.size(); float totalHistogramDifference = 0.0f; for(unsigned int component = 0; component < Image->GetNumberOfComponentsPerPixel(); ++component) { std::vector<float> targetValues(numberOfPixels); std::vector<float> sourceValues(numberOfPixels); for(unsigned int pixelId = 0; pixelId < numberOfPixels; ++pixelId) { targetValues[pixelId] = validPixelsTargetRegion[pixelId][component]; sourceValues[pixelId] = validPixelsSourceRegion[pixelId][component]; } float minTargetValue = *(std::min_element(targetValues.begin(), targetValues.end())); float minSourceValue = *(std::min_element(sourceValues.begin(), sourceValues.end())); float maxTargetValue = *(std::max_element(targetValues.begin(), targetValues.end())); float maxSourceValue = *(std::max_element(sourceValues.begin(), sourceValues.end())); float minValue = std::min(minTargetValue, minSourceValue); float maxValue = std::max(maxTargetValue, maxSourceValue); std::vector<float> targetHistogram = Histogram::ScalarHistogram(targetValues, 20, minValue, maxValue); std::vector<float> sourceHistogram = Histogram::ScalarHistogram(sourceValues, 20, minValue, maxValue); // We normalize the histograms because the magnitude of the histogram difference should not // change based on the number of pixels that were in the valid region of the patches. Helpers::NormalizeVector(targetHistogram); Helpers::NormalizeVector(sourceHistogram); float channelHistogramDifference = Helpers::VectorSumOfAbsoluteDifferences(targetHistogram, sourceHistogram); totalHistogramDifference += channelHistogramDifference; } // Compute the difference computedEnergy = totalHistogramDifference; std::cout << "HistogramDifferenceAcceptanceVisitor Energy: " << computedEnergy << std::endl; if(computedEnergy < DifferenceThreshold) { std::cout << "HistogramDifferenceAcceptanceVisitor: Match accepted (less than " << DifferenceThreshold << ")" << std::endl; return true; } else { std::cout << "HistogramDifferenceAcceptanceVisitor: Match rejected (greater than " << DifferenceThreshold << ")" << std::endl; return false; } };
bool AcceptMatch(VertexDescriptorType target, VertexDescriptorType source, float& computedEnergy) const { itk::Index<2> targetPixel = ITKHelpers::CreateIndex(target); itk::ImageRegion<2> targetRegion = ITKHelpers::GetRegionInRadiusAroundPixel(targetPixel, HalfWidth); itk::Index<2> sourcePixel = ITKHelpers::CreateIndex(source); itk::ImageRegion<2> sourceRegion = ITKHelpers::GetRegionInRadiusAroundPixel(sourcePixel, HalfWidth); // Compute the average of the valid pixels in the target region std::vector<typename TImage::PixelType> targetRegionPixels = MaskOperations::GetValidPixelsInRegion(Image, MaskImage, targetRegion); // The next line is the only thing that changed versus HistogramDifferenceAcceptanceVisitor std::vector<itk::Offset<2> > targetRegionHoleOffsets = MaskImage->GetHoleOffsetsInRegion(targetRegion); std::vector<itk::Index<2> > sourcePatchPixelIndices = ITKHelpers::OffsetsToIndices(targetRegionHoleOffsets, sourceRegion.GetIndex()); std::vector<typename TImage::PixelType> sourceRegionPixels = ITKHelpers::GetPixelValues(Image, sourcePatchPixelIndices); assert(sourceRegionPixels.size() == targetRegionPixels.size()); float totalHistogramDifference = 0.0f; for(unsigned int component = 0; component < Image->GetNumberOfComponentsPerPixel(); ++component) { std::vector<float> targetValues(targetRegionPixels.size()); std::vector<float> sourceValues(sourceRegionPixels.size()); for(unsigned int pixelId = 0; pixelId < targetRegionPixels.size(); ++pixelId) { targetValues[pixelId] = targetRegionPixels[pixelId][component]; } for(unsigned int pixelId = 0; pixelId < sourceRegionPixels.size(); ++pixelId) { sourceValues[pixelId] = sourceRegionPixels[pixelId][component]; } std::vector<float> targetHistogram = Histogram<int>::ScalarHistogram(targetValues, 20, Mins[component], Maxs[component]); std::vector<float> sourceHistogram = Histogram<int>::ScalarHistogram(sourceValues, 20, Mins[component], Maxs[component]); // We normalize the histograms because the magnitude of the histogram difference should not change based on the number of pixels that were in the valid region of the patches. Helpers::NormalizeVector(targetHistogram); Helpers::NormalizeVector(sourceHistogram); float channelHistogramDifference = Helpers::VectorSumOfAbsoluteDifferences(targetHistogram, sourceHistogram); totalHistogramDifference += channelHistogramDifference; } // Compute the difference computedEnergy = totalHistogramDifference; std::cout << "HoleHistogramDifferenceAcceptanceVisitor Energy: " << computedEnergy << std::endl; if(computedEnergy < DifferenceThreshold) { std::cout << "HoleHistogramDifferenceAcceptanceVisitor: Match accepted (less than " << DifferenceThreshold << ")" << std::endl; return true; } else { std::cout << "HoleHistogramDifferenceAcceptanceVisitor: Match rejected (greater than " << DifferenceThreshold << ")" << std::endl; return false; } };