twain2/ImageAdjustColors.cpp

215 lines
4.1 KiB
C++

#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)
{
//MessageBox(NULL,"Inter","Error",MB_OK);
//FileTools::write_log("D:\\1.txt", "Enter CImageAdjustColors apply");
cv::LUT(pDib, lut, pDib);
//FileTools::write_log("D:\\1.txt", "Exit CImageAdjustColors apply");
}
}
void CImageAdjustColors::setAdjustColors(float fBrightness, float fContrast, float fGamma)
{
m_fBrightness = fBrightness;
m_fContrast = getRealContrast(fContrast);
m_fGamma = fGamma;
updata();
}
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();
}
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;
}