mirror of http://192.168.1.51:8099/lmh188/twain3
91 lines
2.2 KiB
C++
91 lines
2.2 KiB
C++
|
#include "ImageApplyAdjustColors.h"
|
||
|
|
||
|
CImageApplyAdjustColors::CImageApplyAdjustColors(void)
|
||
|
: m_brightness(0)
|
||
|
, m_contrast(0)
|
||
|
, m_gamma(1.0f)
|
||
|
, lut(1, 256, CV_8UC1)
|
||
|
{
|
||
|
update_lutData();
|
||
|
}
|
||
|
|
||
|
CImageApplyAdjustColors::CImageApplyAdjustColors(int brightness, int contrast, float gamma)
|
||
|
: lut(1, 256, CV_8UC1)
|
||
|
{
|
||
|
setAdjustColors(brightness, contrast, gamma);
|
||
|
}
|
||
|
|
||
|
CImageApplyAdjustColors::~CImageApplyAdjustColors(void)
|
||
|
{
|
||
|
|
||
|
}
|
||
|
|
||
|
void CImageApplyAdjustColors::apply(cv::Mat& pDib,int side)
|
||
|
{
|
||
|
(void)side;
|
||
|
if (pDib.empty()) return;
|
||
|
|
||
|
if (m_brightness != 0 || m_contrast != 0 || m_gamma < 0.999999f || m_gamma > 1.000001f)
|
||
|
cv::LUT(pDib, lut, pDib);
|
||
|
}
|
||
|
|
||
|
void CImageApplyAdjustColors::apply(std::vector<cv::Mat>& mats, bool isTwoSide)
|
||
|
{
|
||
|
(void)isTwoSide;
|
||
|
int i = 0;
|
||
|
for (cv::Mat& var : mats) {
|
||
|
if (i != 0 && isTwoSide == false)
|
||
|
break;
|
||
|
if(!var.empty())
|
||
|
apply(var, 0);
|
||
|
i++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CImageApplyAdjustColors::setAdjustColors(int brightness, int contrast, float gamma)
|
||
|
{
|
||
|
m_brightness = cv::max(-255, cv::min(brightness, 255));
|
||
|
m_contrast = cv::max(-127, cv::min(contrast, 127));
|
||
|
m_gamma = cv::max(0.1f, cv::min(gamma, 5.0f));
|
||
|
update_lutData();
|
||
|
}
|
||
|
|
||
|
void CImageApplyAdjustColors::setBrightness(int brightness)
|
||
|
{
|
||
|
m_brightness = cv::max(-255, cv::min(brightness, 255));
|
||
|
update_lutData();
|
||
|
}
|
||
|
|
||
|
void CImageApplyAdjustColors::setContrast(int contrast)
|
||
|
{
|
||
|
m_contrast = cv::max(-127, cv::min(contrast, 127));
|
||
|
update_lutData();
|
||
|
}
|
||
|
|
||
|
void CImageApplyAdjustColors::setGamma(float gamma)
|
||
|
{
|
||
|
m_gamma = cv::max(0.1f, cv::min(gamma, 5.0f));
|
||
|
update_lutData();
|
||
|
}
|
||
|
|
||
|
void CImageApplyAdjustColors::update_lutData()
|
||
|
{
|
||
|
unsigned char* ptr = lut.data;
|
||
|
|
||
|
uchar buffer[256];
|
||
|
for (int i = 0; i < 256; i++)
|
||
|
{
|
||
|
//update brightness
|
||
|
ptr[i] = static_cast<unsigned char>(cv::max(0, cv::min(i + m_brightness, 255)));
|
||
|
|
||
|
//update contrast
|
||
|
if (ptr[i] < 128)
|
||
|
ptr[i] = static_cast<unsigned char>(cv::max(0, cv::min(ptr[i] - m_contrast, 127)));
|
||
|
else
|
||
|
ptr[i] = static_cast<unsigned char>(cv::max(127, cv::min(ptr[i] + m_contrast, 255)));
|
||
|
}
|
||
|
float g = 1.0f / m_gamma;
|
||
|
for (int i = 0; i < 256; i++)
|
||
|
ptr[i] = static_cast<unsigned char>(cv::min(255, static_cast<int>(cv::pow(static_cast<float>(ptr[i]) / 255.0f, g) * 255.0f + 0.5f)));
|
||
|
}
|