Stretch and calculate stats on demand
This commit is contained in:
+37
-16
@@ -52,17 +52,19 @@ int Type2CV(RawImage::ImgType type)
|
||||
|
||||
RawImage::RawImage()
|
||||
{
|
||||
m_stats = false;
|
||||
}
|
||||
|
||||
RawImage::RawImage(int w, int h, ImgType type)
|
||||
{
|
||||
m_img.create(h, w, Type2CV(type));
|
||||
m_stats = false;
|
||||
}
|
||||
|
||||
RawImage::RawImage(cv::Mat &img)
|
||||
{
|
||||
m_img = img;
|
||||
calcStats();
|
||||
m_stats = false;
|
||||
}
|
||||
|
||||
RawImage::RawImage(const RawImage &d)
|
||||
@@ -73,6 +75,8 @@ RawImage::RawImage(const RawImage &d)
|
||||
m_median = d.m_median;
|
||||
m_min = d.m_min;
|
||||
m_max = d.m_max;
|
||||
m_mad = d.m_mad;
|
||||
m_stats = d.m_stats;
|
||||
}
|
||||
|
||||
RawImage::RawImage(const QImage &img)
|
||||
@@ -91,33 +95,44 @@ RawImage::RawImage(const QImage &img)
|
||||
for(int i=0; i<tmp.height(); i++)
|
||||
std::memcpy(m_img.ptr(i), tmp.scanLine(i), tmp.width()*3);
|
||||
}
|
||||
calcStats();
|
||||
m_stats = false;
|
||||
}
|
||||
|
||||
bool RawImage::imageStats(double *mean, double *stdDev, double *median, double *min, double *max) const
|
||||
bool RawImage::imageStats(double *mean, double *stdDev, double *median, double *min, double *max, double *mad)
|
||||
{
|
||||
if(!m_stats)calcStats();
|
||||
if(mean)*mean = m_mean;
|
||||
if(stdDev)*stdDev = m_stdDev;
|
||||
if(median)*median = m_median;
|
||||
if(min)*min = m_min;
|
||||
if(max)*max = m_max;
|
||||
if(mad)*mad = m_mad;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void RawImage::calcStats()
|
||||
{
|
||||
if(m_stats)return;
|
||||
m_stats = true;
|
||||
|
||||
cv::Scalar meanS, stdDevS;
|
||||
|
||||
cv::meanStdDev(m_img, meanS, stdDevS);
|
||||
cv::minMaxIdx(m_img, &m_min, &m_max);
|
||||
|
||||
cv::Mat img;
|
||||
if(m_img.channels() == 1)img = m_img;
|
||||
else if (m_img.channels() == 3)cv::cvtColor(m_img, img, cv::COLOR_BGR2GRAY);
|
||||
else if (m_img.channels() == 4)cv::cvtColor(m_img, img, cv::COLOR_BGRA2GRAY);
|
||||
|
||||
int histSize = 256;
|
||||
if(m_img.type() == CV_16U || m_img.type() == CV_32F)histSize = 65536;
|
||||
if(img.type() == CV_16U || img.type() == CV_32F)histSize = 65536;
|
||||
float range[] = {0, (float)histSize};
|
||||
if(img.type() == CV_32F)range[1] = 1.0f;
|
||||
const float *ranges[] = {range};
|
||||
cv::Mat hist;
|
||||
cv::calcHist(&m_img, 1, nullptr, cv::Mat(), hist, 1, &histSize, ranges);
|
||||
cv::calcHist(&img, 1, nullptr, cv::Mat(), hist, 1, &histSize, ranges);
|
||||
|
||||
m_mean = meanS[0];
|
||||
m_stdDev = stdDevS[0];
|
||||
@@ -133,7 +148,7 @@ void RawImage::calcStats()
|
||||
}
|
||||
}
|
||||
cv::Mat absDev;
|
||||
m_img.convertTo(absDev, CV_32F, 1, -m_median);
|
||||
img.convertTo(absDev, CV_32F, 1, -m_median);
|
||||
absDev = cv::abs(absDev);
|
||||
cv::Mat madHist;
|
||||
medianSum = 0;
|
||||
@@ -218,6 +233,22 @@ RawImage::ImgType RawImage::type() const
|
||||
return CV2Type(m_img.type());
|
||||
}
|
||||
|
||||
uint32_t RawImage::norm() const
|
||||
{
|
||||
switch(m_img.type())
|
||||
{
|
||||
case CV_8U:
|
||||
case CV_8UC3:
|
||||
case CV_8UC4:
|
||||
return UINT8_MAX;
|
||||
case CV_16U:
|
||||
case CV_16UC3:
|
||||
return UINT16_MAX;
|
||||
default:
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
void* RawImage::data()
|
||||
{
|
||||
return m_img.ptr();
|
||||
@@ -227,13 +258,3 @@ const void *RawImage::data() const
|
||||
{
|
||||
return m_img.ptr();
|
||||
}
|
||||
|
||||
float RawImage::stretchFactor() const
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
double RawImage::MAD() const
|
||||
{
|
||||
return m_mad;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user