From df670fe6607c451449c01c66f0e7d0e17a48cda1 Mon Sep 17 00:00:00 2001 From: Jordi Inglada <jordi.inglada@cesbio.cnes.fr> Date: Fri, 30 Sep 2016 16:24:25 +0200 Subject: [PATCH] REFAC: use a struct for histogram summary for code readability and avoid passign the vector to the method, which may allow changing the histogram implementation --- ...otbNeighborhoodMajorityVotingImageFilter.h | 35 ++++++++----- ...bNeighborhoodMajorityVotingImageFilter.txx | 49 ++++++++++--------- 2 files changed, 48 insertions(+), 36 deletions(-) diff --git a/Modules/Fusion/MajorityVoting/include/otbNeighborhoodMajorityVotingImageFilter.h b/Modules/Fusion/MajorityVoting/include/otbNeighborhoodMajorityVotingImageFilter.h index d603a82726..74fbefaecb 100644 --- a/Modules/Fusion/MajorityVoting/include/otbNeighborhoodMajorityVotingImageFilter.h +++ b/Modules/Fusion/MajorityVoting/include/otbNeighborhoodMajorityVotingImageFilter.h @@ -169,22 +169,31 @@ protected: const KernelIteratorType kernelEnd) ITK_OVERRIDE; void GenerateOutputInformation() ITK_OVERRIDE; + + //Type to store the useful information from the label histogram + struct HistoSummary + { + unsigned int freqCenterLabel; + unsigned int majorityFreq; + PixelType majorityLabel; + unsigned int secondFreq; + PixelType secondLabel; + }; + //Functor sort histogram in decreasing order + struct CompareHistoFequencies + { + typedef std::pair<PixelType, unsigned int> HistoValueType; + bool operator()(const HistoValueType& a, const HistoValueType& b) + { + return a.second > b.second; + } + }; //Get a histogram of frequencies of labels with the 2 highest frequencies sorted in decreasing order // and return the frequency of the label of the center pixel - unsigned int FillNeighborhoodHistogram(std::vector<std::pair<PixelType, unsigned int> >& histoNeigh, - const NeighborhoodIteratorType &nit, - const KernelIteratorType kernelBegin, - const KernelIteratorType kernelEnd) const; - - struct CompareHistoFequencies - { - typedef std::pair<PixelType, unsigned int> HistoValueType; - bool operator()(const HistoValueType& a, const HistoValueType& b) - { - return a.second > b.second; - } - }; + const HistoSummary FillNeighborhoodHistogram(const NeighborhoodIteratorType &nit, + const KernelIteratorType kernelBegin, + const KernelIteratorType kernelEnd) const; private: NeighborhoodMajorityVotingImageFilter(const Self&); //purposely not implemented diff --git a/Modules/Fusion/MajorityVoting/include/otbNeighborhoodMajorityVotingImageFilter.txx b/Modules/Fusion/MajorityVoting/include/otbNeighborhoodMajorityVotingImageFilter.txx index 1b656f1420..6684cf0d1a 100644 --- a/Modules/Fusion/MajorityVoting/include/otbNeighborhoodMajorityVotingImageFilter.txx +++ b/Modules/Fusion/MajorityVoting/include/otbNeighborhoodMajorityVotingImageFilter.txx @@ -51,37 +51,31 @@ typename NeighborhoodMajorityVotingImageFilter<TInputImage, TOutputImage, const KernelIteratorType kernelEnd) { const PixelType centerPixel = nit.GetCenterPixel(); - PixelType majorityLabel = centerPixel; //Value of the more representative pixels in the neighborhood - unsigned int majorityFreq = 1; //Number of pixels with the more representative value (majorityLabel) in the neighborhood - if (centerPixel != m_LabelForNoDataPixels) { - std::vector< std::pair<PixelType, unsigned int> > histoNeighVec; - //Get a histogram of label frequencies where the 2 highest are at the beginning and sorted - const unsigned int freqCenterLabel = this->FillNeighborhoodHistogram(histoNeighVec, nit, kernelBegin, kernelEnd); + + //Get a histogram of label frequencies where the 2 highest are at the beginning and sorted + const HistoSummary histoSummary = this->FillNeighborhoodHistogram(nit, kernelBegin, kernelEnd); - if(m_OnlyIsolatedPixels && freqCenterLabel > m_IsolatedThreshold) + if(m_OnlyIsolatedPixels && histoSummary.freqCenterLabel > m_IsolatedThreshold) { //If we want to filter only isolated pixels, keep the label if //there are enough pixels with the center label to consider that //it is not isolated - majorityLabel = centerPixel; + return centerPixel; } else { - //Extraction of the more representative Label in the neighborhood (majorityLabel) and its Frequency (majorityFreq) - majorityFreq = histoNeighVec[0].second; //Frequency - majorityLabel = histoNeighVec[0].first; //Label //If the majorityLabel is NOT unique in the neighborhood - if(histoNeighVec[1].second == majorityFreq && histoNeighVec[1].first != majorityLabel) + if(histoSummary.secondFreq == histoSummary.majorityFreq && histoSummary.secondLabel != histoSummary.majorityLabel) { if (m_KeepOriginalLabelBool == true) { - majorityLabel = centerPixel; + return centerPixel; } else { - majorityLabel = m_LabelForUndecidedPixels; + return m_LabelForUndecidedPixels; } } @@ -93,19 +87,19 @@ typename NeighborhoodMajorityVotingImageFilter<TInputImage, TOutputImage, //If (centerPixel == m_LabelForNoDataPixels) else { - majorityLabel = m_LabelForNoDataPixels; + return m_LabelForNoDataPixels; } - return majorityLabel; + return centerPixel; } template<class TInputImage, class TOutputImage, class TKernel> -unsigned int NeighborhoodMajorityVotingImageFilter<TInputImage, - TOutputImage, - TKernel>::FillNeighborhoodHistogram(std::vector<std::pair<PixelType, unsigned int> >& histoNeighVec, - const NeighborhoodIteratorType &nit, - const KernelIteratorType kernelBegin, - const KernelIteratorType kernelEnd) const +const typename NeighborhoodMajorityVotingImageFilter<TInputImage, TOutputImage, + TKernel>::HistoSummary NeighborhoodMajorityVotingImageFilter<TInputImage, + TOutputImage, + TKernel>::FillNeighborhoodHistogram(const NeighborhoodIteratorType &nit, + const KernelIteratorType kernelBegin, + const KernelIteratorType kernelEnd) const { std::map<PixelType, unsigned int> histoNeigh; PixelType centerPixel = nit.GetCenterPixel(); @@ -124,11 +118,20 @@ unsigned int NeighborhoodMajorityVotingImageFilter<TInputImage, histoNeigh[label] += 1; } } + + std::vector< std::pair<PixelType, unsigned int> > histoNeighVec; std::copy(histoNeigh.begin(), histoNeigh.end(), std::back_inserter(histoNeighVec)); const typename std::vector<std::pair<PixelType, unsigned int> >::iterator histoIt = histoNeighVec.begin(); std::nth_element(histoNeighVec.begin(), histoIt+1, histoNeighVec.end(), CompareHistoFequencies()); - return histoNeigh[centerPixel]; + typename NeighborhoodMajorityVotingImageFilter<TInputImage, TOutputImage, + TKernel>::HistoSummary result; + result.freqCenterLabel = histoNeigh[centerPixel]; + result.majorityFreq = histoNeighVec[0].first; + result.majorityLabel = histoNeighVec[0].second; + result.secondFreq = histoNeighVec[1].first; + result.secondLabel = histoNeighVec[1].second; + return result; } -- GitLab