Advertisement
Guest User

Image.cpp

a guest
Oct 24th, 2018
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.75 KB | None | 0 0
  1. #include "pch.h"
  2. #include "Image.hpp"
  3.  
  4.  
  5. Image::Image(
  6.     const std::vector<uint32_t>& dataBuffer,
  7.     const std::vector<uint32_t>& extents,
  8.     const uint32_t& downsamplingDegree):
  9.     mDataBuffer(dataBuffer),
  10.     mExtents(extents),
  11.     mDownsamplingDegree(downsamplingDegree)
  12. {}
  13.  
  14. Image::~Image()
  15. {}
  16.  
  17. Image::Image(const Image& rhs):
  18.     mDataBuffer(rhs.mDataBuffer),
  19.     mExtents(rhs.mExtents),
  20.     mDownsamplingDegree(rhs.mDownsamplingDegree)
  21. {}
  22.  
  23. Image& Image::operator=(const Image& rhs)
  24. {
  25.     mDataBuffer = rhs.mDataBuffer;
  26.     mExtents = rhs.mExtents;
  27.     mDownsamplingDegree = rhs.mDownsamplingDegree;
  28.     return *this;
  29. }
  30.  
  31. Image::Image(Image&& rhs):
  32.     mDataBuffer(std::move(rhs.mDataBuffer)),
  33.     mExtents(std::move(rhs.mExtents)),
  34.     mDownsamplingDegree(std::move(rhs.mDownsamplingDegree))
  35. {}
  36.  
  37. Image& Image::operator=(Image&& rhs)
  38. {
  39.     mDataBuffer = std::move(rhs.mDataBuffer);
  40.     mExtents = std::move(rhs.mExtents);
  41.     mDownsamplingDegree = std::move(rhs.mDownsamplingDegree);
  42.     return *this;
  43. }
  44.  
  45. void Image::GeneratedDownsampledImages()
  46. {
  47.     Display();
  48.  
  49.     std::vector<Image> result;
  50.  
  51.     uint32_t minimumExtent = GetMinimumLValue(mExtents);
  52.     for (uint32_t i = 1; i <= minimumExtent; i++)
  53.     {
  54.         // TODO: Sping up a thread for every call to GenerateDownsampledImage
  55.         result.push_back(GeneratedDownsampledImage(*this, i));
  56.         result[result.size() - 1].Display();
  57.     }
  58. }
  59.  
  60. void Image::Display()
  61. {
  62.     if (mDownsamplingDegree == 0)
  63.     {
  64.         std::cout << "Original Image:" << std::endl;
  65.     }
  66.     else
  67.     {
  68.         std::cout << mDownsamplingDegree << "-downsampled image:" << std::endl;
  69.     }
  70.  
  71.     std::vector<uint32_t> extentIndex;
  72.     for (int i = 0; i < mExtents.size(); i++)
  73.     {
  74.         extentIndex.push_back(0);
  75.     }
  76.  
  77.     int count = 0;
  78.     do
  79.     {
  80.         uint32_t offset = GetOffsetFromExtents(extentIndex);
  81.         std::cout << mDataBuffer[offset] << " ";
  82.  
  83.         count++;
  84.         uint32_t modValue = 1;
  85.         for (int i = 0; i < mExtents.size() - 1; i++)
  86.         {
  87.             modValue *= mExtents[i];
  88.             if (count % modValue == 0)
  89.             {
  90.                 std::cout << std::endl;
  91.             }
  92.         }
  93.  
  94.     } while (IncrementExtentIndeces(extentIndex, mExtents));
  95.  
  96.     std::cout << std::endl;
  97. }
  98.  
  99. bool Image::IncrementExtentIndeces(std::vector<uint32_t>& extents, const std::vector<uint32_t>& extentBounds, const uint32_t& amount)
  100. {
  101.     bool result = true;
  102.     bool incrementFlag = false;
  103.     int index = extents.size() - 1;
  104.    
  105.     while (index >= 0)  // If index goes negative, then we've incremented all possible values
  106.     {
  107.         if (!incrementFlag)
  108.         {   // Prevent incrementing twice if we exceed a dimensional bound
  109.             extents[index] += amount;
  110.             incrementFlag = false;
  111.         }
  112.  
  113.         if (extents[index] >= extentBounds[index])
  114.         {   // Reset this extent value and iterate the next most significant value
  115.             extents[index] = 0;
  116.             index--;
  117.  
  118.             if (index < 0)
  119.             {   // Make sure we don't exceed vector bounds before returning false
  120.                 result = false;
  121.                 break;
  122.             }
  123.  
  124.             extents[index] += amount;
  125.             incrementFlag = true; // Flag that we incremented beyond dimension bounds
  126.         }
  127.         else
  128.         {   // We haven't hit an extents bounds after this iteration, so we're done
  129.             break;
  130.         }
  131.     }
  132.    
  133.     return result;
  134. }
  135.  
  136. uint32_t Image::GetOffsetFromExtents(const std::vector<uint32_t>& indexExtents) const
  137. {
  138.     uint32_t result = 0;
  139.  
  140.     for (int i = 0; i < mExtents.size(); i++)
  141.     {
  142.         uint32_t extentValue = indexExtents[i];
  143.        
  144.         for (int j = i + 1; j < mExtents.size(); j++)
  145.         {   // Multiply the offset by the max size of all less significant extents
  146.             extentValue *= mExtents[j];
  147.         }
  148.  
  149.         result += extentValue; // Accumulate total offset
  150.     }
  151.  
  152.     return result;
  153. }
  154.  
  155. uint32_t Image::GetMinimumLValue(const std::vector<uint32_t>& extents) const
  156. {
  157.     uint32_t min = 0xFFFFFFFF;
  158.    
  159.     for (int i = 0; i < extents.size(); i++)
  160.     {
  161.         if (extents[i] < min)
  162.         {
  163.             min = extents[i];
  164.         }
  165.     }
  166.  
  167.     return log2(min);
  168. }
  169.  
  170. Image Image::GeneratedDownsampledImage(const Image& image, const uint32_t& downsamplingDegree)
  171. {
  172.     //std::cout << "Processing l-" << downsamplingDegree << " downsampling..." << std::endl;
  173.  
  174.     uint32_t blockSize = pow(2, downsamplingDegree);
  175.     std::vector<uint32_t> downsampleBuffer;
  176.     std::vector<uint32_t> extentIndex(mExtents.size());
  177.  
  178.     do
  179.     {
  180.         downsampleBuffer.push_back(ComputeDownsampledChunk(*this, extentIndex, blockSize));
  181.     }
  182.     while (IncrementExtentIndeces(extentIndex, mExtents, blockSize));
  183.  
  184.     std::vector<uint32_t> downsampledExtents(mExtents.size());
  185.     for (int i = 0; i < mExtents.size(); i++)
  186.     {   // Generate the extents of the downsampled image
  187.         downsampledExtents[i] = mExtents[i] / (pow(2, downsamplingDegree));
  188.     }
  189.     return Image(downsampleBuffer, downsampledExtents, downsamplingDegree);
  190. }
  191.  
  192. uint32_t Image::ComputeDownsampledChunk(const Image& image, const std::vector<uint32_t>& offsetExtents, const uint32_t& blockSize)
  193. {
  194.     std::vector<uint32_t> current(mExtents.size());
  195.     std::vector<uint32_t> bounds(mExtents.size());
  196.     for (int i = 0; i < mExtents.size(); i++)
  197.     {   // Establish extents for our local downsampling block
  198.         current[i] = 0;
  199.         bounds[i] = blockSize;
  200.     }
  201.  
  202.     std::vector<uint32_t> values;
  203.     do
  204.     {
  205.         std::vector<uint32_t> trueIndex(mExtents.size());
  206.         for (int i = 0; i < mExtents.size(); i++)
  207.         {   // Generate absolute indeces for our traversal
  208.             trueIndex[i] = offsetExtents[i] + current[i];
  209.         }
  210.         values.push_back(mDataBuffer[GetOffsetFromExtents(trueIndex)]);
  211.     } while (IncrementExtentIndeces(current, bounds));
  212.  
  213.     std::sort(values.begin(), values.end());
  214.     uint32_t mode = values[0];
  215.     uint32_t modeCount = 0;
  216.     uint32_t currentValue = values[0];
  217.     uint32_t currentCount = 0;
  218.     for (int i = 0; i < values.size(); i++)
  219.     {
  220.         if (currentValue == values[i])
  221.         {
  222.             currentCount++;
  223.         }
  224.         else
  225.         {
  226.             currentValue = values[i];
  227.         }
  228.    
  229.         if (currentCount > modeCount)
  230.         {
  231.             mode = currentValue;
  232.             modeCount = currentCount;
  233.             currentCount = 1;
  234.         }
  235.     }
  236.  
  237.     return mode;
  238. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement