#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); cv::LUT(pDib, lut, pDib); } } void CImageAdjustColors::setAdjustColors(float fBrightness, float fContrast, float fGamma) { m_fBrightness = fBrightness; m_fContrast = getRealContrast(fContrast); m_fGamma = fGamma; 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 (valueup) { return up; } return value; }