|
|
|
|
#include "stdafx.h"
|
|
|
|
|
#include "IntensityControl.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ͨ<><CDA8><EFBFBD>鱨<EFBFBD>ṹ<EFBFBD><E1B9B9><EFBFBD><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD>
|
|
|
|
|
bool QBStruIntensityControl(QBStru *qbData, int degree, bool bSrcFirst)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
// <20><>ֵ<EFBFBD>ж<EFBFBD>
|
|
|
|
|
if (qbData == NULL)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7>ֱ<EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD>false
|
|
|
|
|
if (qbData->image.bValid == false)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD>srcImg
|
|
|
|
|
if (bSrcFirst == true)
|
|
|
|
|
{
|
|
|
|
|
if (qbData->image.srcImg.buff != NULL &&
|
|
|
|
|
qbData->image.srcImg.ImgWidth > 0 &&
|
|
|
|
|
qbData->image.srcImg.ImgHeight > 0 &&
|
|
|
|
|
(qbData->image.srcImg.bitcount == 24 || qbData->image.srcImg.bitcount == 8))
|
|
|
|
|
{
|
|
|
|
|
return ImgStruIntensityControl(&qbData->image.srcImg, &qbData->image.dstImg, degree);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
if (qbData->image.dstImg.buff != NULL &&
|
|
|
|
|
qbData->image.dstImg.ImgWidth > 0 &&
|
|
|
|
|
qbData->image.dstImg.ImgHeight > 0 &&
|
|
|
|
|
(qbData->image.dstImg.bitcount == 24 || qbData->image.dstImg.bitcount == 8))
|
|
|
|
|
{
|
|
|
|
|
return ImgStruIntensityControl(&qbData->image.dstImg, &qbData->image.dstImg, degree);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
// <20>ȿ<EFBFBD>dstImg<6D>Ƿ<EFBFBD><C7B7><EFBFBD>Ч
|
|
|
|
|
if (qbData->image.dstImg.buff != NULL &&
|
|
|
|
|
qbData->image.dstImg.ImgWidth > 0 &&
|
|
|
|
|
qbData->image.dstImg.ImgHeight > 0 &&
|
|
|
|
|
(qbData->image.dstImg.bitcount == 24 || qbData->image.dstImg.bitcount == 8))
|
|
|
|
|
{
|
|
|
|
|
return ImgStruIntensityControl(&qbData->image.dstImg, &qbData->image.dstImg, degree);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
if (qbData->image.srcImg.buff != NULL &&
|
|
|
|
|
qbData->image.srcImg.ImgWidth > 0 &&
|
|
|
|
|
qbData->image.srcImg.ImgHeight > 0 &&
|
|
|
|
|
(qbData->image.srcImg.bitcount == 24 || qbData->image.srcImg.bitcount == 8))
|
|
|
|
|
{
|
|
|
|
|
return ImgStruIntensityControl(&qbData->image.srcImg, &qbData->image.dstImg, degree);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
catch(cv::Exception &e)
|
|
|
|
|
{
|
|
|
|
|
e.msg;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
catch(...)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ImgStru<72>ṹ<EFBFBD>µ<EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD>
|
|
|
|
|
//<2F><><EFBFBD>ܣ<EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD>
|
|
|
|
|
bool ImgStruIntensityControl(ImgStru* src, ImgStru* dst, int degree)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
// src dst <20><>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>֤
|
|
|
|
|
if (src == NULL || dst ==NULL ||
|
|
|
|
|
src->ImgWidth <=0 ||
|
|
|
|
|
src->ImgHeight <= 0 ||
|
|
|
|
|
src->bitcount <= 0 ||
|
|
|
|
|
src->buff == NULL)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(src->bitcount != 8 && src->bitcount != 24)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>Ը<EFBFBD><D4B8><EFBFBD>
|
|
|
|
|
dst->ImgWidth = src->ImgWidth;
|
|
|
|
|
dst->ImgHeight = src->ImgHeight;
|
|
|
|
|
dst->bitcount = src->bitcount;
|
|
|
|
|
dst->BoundingBox = src->BoundingBox;
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>롢<EFBFBD><EBA1A2><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>
|
|
|
|
|
cv::Mat src_Img;
|
|
|
|
|
|
|
|
|
|
if (src->bitcount == 8)
|
|
|
|
|
{
|
|
|
|
|
src_Img = cv::Mat(src->ImgHeight, src->ImgWidth, CV_8UC1);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
src_Img = cv::Mat(src->ImgHeight, src->ImgWidth, CV_8UC3);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int lineByte = src->ImgWidth * src->bitcount / 8;
|
|
|
|
|
unsigned int imgBufSize = static_cast<unsigned int>(src->ImgHeight * lineByte);
|
|
|
|
|
|
|
|
|
|
if (src_Img.empty() == true)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
memcpy(src_Img.data, src->buff, imgBufSize);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>
|
|
|
|
|
cv::Mat dst_Img;
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>cvMatIntensityControl<6F>㷨<EFBFBD><E3B7A8>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD>
|
|
|
|
|
if (cvMatIntensityControl(src_Img, dst_Img, degree) == true)
|
|
|
|
|
{
|
|
|
|
|
// <20><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD>
|
|
|
|
|
if (src == dst)
|
|
|
|
|
{
|
|
|
|
|
memcpy(dst->buff, dst_Img.data, imgBufSize);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
SAFE_DELETE_ARRAY(dst->buff);
|
|
|
|
|
dst->buff = new unsigned char[imgBufSize];
|
|
|
|
|
memcpy(dst->buff, dst_Img.data, imgBufSize);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
catch(cv::Exception &e)
|
|
|
|
|
{
|
|
|
|
|
e.msg;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
catch(...)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// OpenCV<43>ṹ<EFBFBD>µ<EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD>ȿ<EFBFBD><C8BF><EFBFBD>
|
|
|
|
|
bool cvMatIntensityControl(cv::Mat& src, cv::Mat& dst, int degree)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼ<EFBFBD><CDBC>Ϊ<EFBFBD>գ<EFBFBD>ֱ<EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD>false
|
|
|
|
|
if(src.empty() == true)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
if (src.type() != CV_8UC1 && src.type() != CV_8UC3)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>ȿ<EFBFBD><C8BF>Ƴ̶<C6B3> <20>жϺͲö<CDB2>
|
|
|
|
|
if(degree < 0)
|
|
|
|
|
{
|
|
|
|
|
degree = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(degree > 20)
|
|
|
|
|
{
|
|
|
|
|
degree = 20;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>degree = 10<31><30><EFBFBD><EFBFBD><EFBFBD>ȱ<EFBFBD><C8B1>ֲ<EFBFBD><D6B2><EFBFBD>
|
|
|
|
|
if (degree == 10)
|
|
|
|
|
{
|
|
|
|
|
// <20><><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD>
|
|
|
|
|
dst = src.clone();
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>Դ<EFBFBD><D4B4>㷨
|
|
|
|
|
|
|
|
|
|
// ٤<><D9A4>ϵ<EFBFBD><CFB5>
|
|
|
|
|
double gama = 1.0;
|
|
|
|
|
|
|
|
|
|
if (degree < 10) // gama Ϊ<><CEAA>ĸ <20><>1 5<><35>
|
|
|
|
|
{
|
|
|
|
|
gama = -0.4 * degree + 5;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
gama = 1.9 - 0.09 * degree; // gamaΪ <20>ݴΡ<DDB4>0.1 1<><31>
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD>Ե<EFBFBD>ͨ<EFBFBD><CDA8>
|
|
|
|
|
if (src.type() == CV_8UC1)
|
|
|
|
|
{
|
|
|
|
|
if (degree < 10)
|
|
|
|
|
{
|
|
|
|
|
if (abs(gama) > 0)
|
|
|
|
|
{
|
|
|
|
|
// dst = src * 1 / gama
|
|
|
|
|
src.convertTo(dst, CV_8UC1, 1.0 / gama);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
// ת<><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0 1<><31>
|
|
|
|
|
cv::Mat gray32;
|
|
|
|
|
src.convertTo(gray32, CV_32FC1, 1.0 / 255);
|
|
|
|
|
|
|
|
|
|
// gray32 = gray32 ^ gama
|
|
|
|
|
cv::pow(gray32, gama, gray32);
|
|
|
|
|
|
|
|
|
|
// dst = gray32 * 255
|
|
|
|
|
gray32.convertTo(dst, CV_8UC1, 255.0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else // <20><>ͨ<EFBFBD><CDA8>
|
|
|
|
|
{
|
|
|
|
|
// YCrCb ģ<><C4A3>
|
|
|
|
|
cv::Mat YCrCb;
|
|
|
|
|
cv::cvtColor(src, YCrCb, cv::COLOR_BGR2YCrCb);
|
|
|
|
|
|
|
|
|
|
// ͼ<><CDBC><EFBFBD><EFBFBD>֤
|
|
|
|
|
if (YCrCb.empty() == true)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
std::vector<cv::Mat> planes;
|
|
|
|
|
cv::split(YCrCb, planes);
|
|
|
|
|
|
|
|
|
|
// Y<><59><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
cv::Mat dstY;
|
|
|
|
|
cvMatIntensityControl(planes[0], dstY, degree); // Ƕ<><C7B6>
|
|
|
|
|
|
|
|
|
|
// ͨ<><CDA8><EFBFBD>ϲ<EFBFBD>
|
|
|
|
|
planes[0] = dstY;
|
|
|
|
|
cv::merge(planes, YCrCb);
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>
|
|
|
|
|
cv::cvtColor(YCrCb, dst, cv::COLOR_YCrCb2BGR);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
catch(cv::Exception &e)
|
|
|
|
|
{
|
|
|
|
|
e.msg;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
catch(...)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|