2019-02-28 02:14:54 +00:00
|
|
|
#include "StdAfx.h"
|
|
|
|
#include "ImageAdjustColors.h"
|
|
|
|
|
|
|
|
|
|
|
|
CImageAdjustColors::CImageAdjustColors(void)
|
|
|
|
{
|
|
|
|
lut.create(1, 256, CV_8UC1);
|
|
|
|
setAdjustColors(0, 0, 1.0);
|
|
|
|
}
|
|
|
|
|
|
|
|
CImageAdjustColors::CImageAdjustColors(float fBrightness, float fContrast, float fGamma)
|
|
|
|
{
|
|
|
|
lut.create(1, 256, CV_8UC1);
|
|
|
|
setAdjustColors(fBrightness, fContrast, fGamma);
|
|
|
|
}
|
|
|
|
|
|
|
|
CImageAdjustColors::~CImageAdjustColors(void)
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void CImageAdjustColors::apply(cv::Mat& pDib,int side)
|
|
|
|
{
|
|
|
|
if (m_fBrightness != 0|| m_fContrast != 0|| m_fGamma != 1.0)
|
|
|
|
{
|
2019-11-14 08:42:24 +00:00
|
|
|
//FileTools::write_log("D:\\1.txt", "Enter CImageAdjustColors apply");
|
2019-02-28 02:14:54 +00:00
|
|
|
cv::LUT(pDib, lut, pDib);
|
2019-11-14 08:42:24 +00:00
|
|
|
//FileTools::write_log("D:\\1.txt", "Exit CImageAdjustColors apply");
|
2019-02-28 02:14:54 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void CImageAdjustColors::setAdjustColors(float fBrightness, float fContrast, float fGamma)
|
|
|
|
{
|
|
|
|
m_fBrightness = fBrightness;
|
|
|
|
m_fContrast = getRealContrast(fContrast);
|
|
|
|
m_fGamma = fGamma;
|
|
|
|
updata();
|
|
|
|
}
|
2019-11-14 08:42:24 +00:00
|
|
|
int CImageAdjustColors::getContrast()
|
|
|
|
{
|
|
|
|
return m_fContrast;
|
|
|
|
}
|
|
|
|
int CImageAdjustColors::getBrightness()
|
|
|
|
{
|
|
|
|
return m_fBrightness;
|
|
|
|
}
|
|
|
|
double CImageAdjustColors::getGamma()
|
|
|
|
{
|
|
|
|
return m_fGamma;
|
|
|
|
}
|
|
|
|
void CImageAdjustColors::setContrast(int contrast)
|
|
|
|
{
|
|
|
|
m_fContrast = cv::max(-127, cv::min(contrast, 127));
|
|
|
|
updata();
|
|
|
|
}
|
|
|
|
void CImageAdjustColors::setBrightness(int brightness)
|
|
|
|
{
|
|
|
|
m_fBrightness = cv::max(-255, cv::min(brightness, 255));
|
|
|
|
updata();
|
|
|
|
}
|
|
|
|
void CImageAdjustColors::setGamma(double gamma)
|
|
|
|
{
|
|
|
|
m_fGamma = cv::max(0.1, cv::min(gamma, 5.0));
|
|
|
|
updata();
|
|
|
|
}
|
2019-02-28 02:14:54 +00:00
|
|
|
void CImageAdjustColors::MapToMap(byte* mapsIn, byte* mapsOut)
|
|
|
|
{
|
|
|
|
for (int i = 0; i < 256; i++)
|
|
|
|
{
|
|
|
|
mapsOut[i] = mapsIn[mapsOut[i]];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
float CImageAdjustColors::getRealContrast(float twContrast)
|
|
|
|
{
|
|
|
|
float ret=0.0;
|
|
|
|
if (twContrast<=-1000.0)
|
|
|
|
{
|
|
|
|
ret=-36.0;
|
|
|
|
}
|
|
|
|
else if(twContrast>-1000.0&&twContrast<=-666.0)
|
|
|
|
{
|
|
|
|
ret=-24.0;
|
|
|
|
}
|
|
|
|
else if(twContrast>-666.0&&twContrast<=-333.0)
|
|
|
|
{
|
|
|
|
ret=-12.0;
|
|
|
|
}
|
|
|
|
else if (twContrast>= 333 && twContrast < 666)
|
|
|
|
{
|
|
|
|
ret=12.0;
|
|
|
|
}
|
|
|
|
else if (twContrast >= 666 && twContrast < 1000)
|
|
|
|
{
|
|
|
|
ret=24.0;
|
|
|
|
}
|
|
|
|
else if (twContrast >= 1000)
|
|
|
|
{
|
|
|
|
ret=36.0;
|
|
|
|
}
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
void CImageAdjustColors::CalculateMap(Range in, Range out, unsigned char* map)
|
|
|
|
{
|
|
|
|
double k = 0, b = 0;
|
|
|
|
|
|
|
|
if (in.getMax() != in.getMin())
|
|
|
|
{
|
|
|
|
k = (double)(out.getMax() - out.getMin()) / (double)(in.getMax() - in.getMin());
|
|
|
|
b = (double)(out.getMin()) - k * in.getMin();
|
|
|
|
}
|
|
|
|
|
|
|
|
for (int i = 0; i < 256; i++)
|
|
|
|
{
|
|
|
|
byte v = (byte)i;
|
|
|
|
|
|
|
|
if (v >= in.getMax())
|
|
|
|
v = (byte)out.getMax();
|
|
|
|
else if (v <= in.getMin())
|
|
|
|
v = (byte)out.getMin();
|
|
|
|
else
|
|
|
|
v = (byte)(k * v + b);
|
|
|
|
|
|
|
|
map[i] = v;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void CImageAdjustColors::updata()
|
|
|
|
{
|
|
|
|
Range inIR;
|
|
|
|
Range OutIR;
|
|
|
|
byte maps[256];
|
|
|
|
byte _maps[256];
|
|
|
|
|
|
|
|
for (int i = 0; i < 256; i++)
|
|
|
|
{
|
|
|
|
_maps[i] = maps[i] = (byte)i;
|
|
|
|
}
|
|
|
|
|
|
|
|
//if (m_fBrightness > 0)
|
|
|
|
//{
|
|
|
|
// inIR = Range(0, (int)(255 - m_fBrightness));
|
|
|
|
// OutIR = Range((int)m_fBrightness, 255);
|
|
|
|
//}
|
|
|
|
//else
|
|
|
|
//{
|
|
|
|
// inIR = Range((int)-m_fBrightness, 255);
|
|
|
|
// OutIR = Range(0, (int)(255 + m_fBrightness));
|
|
|
|
//}
|
|
|
|
|
|
|
|
//CalculateMap(inIR, OutIR, maps);
|
|
|
|
//MapToMap(maps, _maps);
|
|
|
|
|
|
|
|
//if (m_fContrast > 0)
|
|
|
|
//{
|
|
|
|
// inIR = Range(0, (int)(255 - m_fContrast));
|
|
|
|
// OutIR = Range((int)m_fContrast, 255);
|
|
|
|
//}
|
|
|
|
//else
|
|
|
|
//{
|
|
|
|
// inIR = Range((int)-m_fContrast, 255);
|
|
|
|
// OutIR = Range(0, (int)(255 + m_fContrast));
|
|
|
|
//}
|
|
|
|
//CalculateMap(inIR, OutIR, maps);
|
|
|
|
//MapToMap(maps, _maps);
|
|
|
|
|
|
|
|
double g = 1 / m_fGamma;
|
|
|
|
if (g != 1.0)
|
|
|
|
{
|
|
|
|
for (int i = 0; i < 256; i++)
|
|
|
|
{
|
|
|
|
maps[i] = (byte)MIN(255, (int)(pow(i / 255.0, g) * 255 + 0.5));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
for (int i = 0; i < 128; i++)
|
|
|
|
{
|
|
|
|
int color = GetRangeValue(0, 127, i - (int)m_fContrast);
|
|
|
|
color = GetRangeValue(0, 255, color + (int)m_fBrightness);
|
|
|
|
maps[i] = (byte)color;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (int i = 128; i < 256; i++)
|
|
|
|
{
|
|
|
|
int color = GetRangeValue(128, 255, i + (int)m_fContrast);
|
|
|
|
color = GetRangeValue(0, 255, color + (int)m_fBrightness);
|
|
|
|
maps[i] = (byte)color;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
MapToMap(maps, _maps);
|
|
|
|
|
|
|
|
memcpy(lut.data, _maps, sizeof(_maps));
|
|
|
|
}
|
|
|
|
|
|
|
|
int CImageAdjustColors::GetRangeValue(int low, int up, int value)
|
|
|
|
{
|
|
|
|
if (low > up)
|
|
|
|
{
|
|
|
|
return value;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (value<low)
|
|
|
|
{
|
|
|
|
return low;
|
|
|
|
}
|
|
|
|
if (value>up)
|
|
|
|
{
|
|
|
|
return up;
|
|
|
|
}
|
|
|
|
return value;
|
|
|
|
}
|