Optimize median calculation

This commit is contained in:
2019-09-28 12:27:38 +02:00
parent 4cc58de7a1
commit eb307ea091
+4 -5
View File
@@ -84,6 +84,9 @@ public:
uint64_t sqrSum = 0; uint64_t sqrSum = 0;
uint64_t tMin = UINT64_MAX; uint64_t tMin = UINT64_MAX;
uint64_t tMax = 0; uint64_t tMax = 0;
uint32_t histogram[65536];
memset(histogram, 0, sizeof(histogram));
const int shift = sizeof(T)>2 ? sizeof(T)*8 - 16 : 0;
for(T i : m_img) for(T i : m_img)
{ {
@@ -91,6 +94,7 @@ public:
sqrSum += i*i; sqrSum += i*i;
tMin = tMin>i ? i : tMin; tMin = tMin>i ? i : tMin;
tMax = tMax<i ? i : tMax; tMax = tMax<i ? i : tMax;
histogram[i>>shift]++;
} }
if(mean)*mean = sum/m_img.size(); if(mean)*mean = sum/m_img.size();
@@ -98,14 +102,9 @@ public:
if(max)*max = tMax; if(max)*max = tMax;
if(stdDev)*stdDev = sqrt((sqrSum - (double)sum*sum/m_img.size()) / (double)(m_img.size()-1)); if(stdDev)*stdDev = sqrt((sqrSum - (double)sum*sum/m_img.size()) / (double)(m_img.size()-1));
const int shift = sizeof(T)>2 ? sizeof(T)*8 - 16 : 0;
if(median) if(median)
{ {
uint32_t histogram[65536];
memset(histogram, 0, sizeof(histogram));
for(T i : m_img)
histogram[i>>shift]++;
size_t medianSum = 0; size_t medianSum = 0;
for(int i=0;i<65536;i++) for(int i=0;i<65536;i++)
{ {