00001 #include "Histogram.h"
00002 #include <string>
00003 #include <cmath>
00004 #include <cstring>
00005
00006 Histogram::Histogram()
00007 {
00008 memset(data,0,sizeof(data));
00009
00010
00011 numberOfSamples =1;
00012 }
00013
00014 Histogram::~Histogram()
00015 {
00016 }
00017
00018 void Histogram::generateFromImage(unsigned char* frame, unsigned int frameWidth,
00019 unsigned int frameHeight, unsigned int minScanX, unsigned int maxScanX,
00020 unsigned int minScanY, unsigned int maxScanY, unsigned int XSpacing,
00021 unsigned int YSpacing)
00022 {
00023 memset(data,0,sizeof(data));
00024 numberOfSamples = 0;
00025
00026 if (maxScanX > frameWidth-1)
00027 maxScanX = frameWidth-1;
00028
00029 if (maxScanY > frameHeight-1)
00030 maxScanY = frameHeight-1;
00031
00032 for(unsigned int y = minScanY; y < maxScanY; y += YSpacing)
00033 for(unsigned int x = minScanX; x < maxScanX; x += XSpacing)
00034 {
00035 data[frame[y * frameWidth + x]]++;
00036 numberOfSamples++;
00037 }
00038 }
00039
00040 unsigned int Histogram::getAverageIntensity(void) const
00041 {
00042 if (!numberOfSamples)
00043 return 0;
00044
00045 long value = 0;
00046
00047 for(int i = 0; i < 256; i++)
00048 {
00049 value += data[i]*i;
00050 }
00051
00052 return value / numberOfSamples;
00053 }
00054
00055 unsigned int Histogram::getThresholdForPercentageOfPixels(float percentage)
00056 const
00057 {
00058 long value = 0;
00059
00060 for(int i = 255; i !=0; i--)
00061 {
00062 if (value > percentage*numberOfSamples)
00063 return i;
00064
00065 value += data[i];
00066 }
00067
00068 return 0;
00069 }
00070
00071 float Histogram::calculateSimilarityWith(const Histogram& other) const
00072 {
00073 long similar = 0;
00074
00075 for(unsigned int i = 0; i < 256; i++)
00076 {
00077 if (data[i] < other.data[i])
00078 similar += data[i];
00079 else
00080 similar += other.data[i];
00081 }
00082
00083
00084 return static_cast<float>(similar) / static_cast<float>(numberOfSamples);
00085 }
00086
00087
00088