opencv新人求助!在做亮度调整时不能还原成原始图像!

67373_ 2018-03-05 10:54:20
rt。这是随便调整后的图片
然后我想把它拉回原图,就变成这样空白图像了。
下面贴出相关代码:求助各位大佬看看,给萌新一个解决方案
/*************************************************
函数名: MyGammaCorrection
函数描述: 亮度调整核心函数
**************************************************/
void MyGammaCorrection(Mat& src, Mat& dst, float fGamma)
{
double alpha = 20;
double beta = 170;
CV_Assert(src.data); //若括号中的表达式为false,则返回一个错误的信息。
if(fGamma == 1.0)
{
alpha = 1.0;
beta = 0.0;
}

// accept only char type matrices
CV_Assert(src.depth() != sizeof(uchar));
dst = Mat::zeros(src.size(), src.type());
for (int i = 0; i < src.rows; ++i)
for (int j = 0; j < src.cols; ++j)
for (int k = 0; k < 3; ++k)
dst.at<Vec3b>(i, j)[k] = saturate_cast<uchar>(src.at<Vec3b>(i, j)[k] * alpha + beta);
//imshow("liangdu", dst);

// build look up table
unsigned char lut[256];
for (int i = 0; i < 256; i++)
{
lut[i] = saturate_cast<uchar>(pow((float)(i / 255.0), fGamma) * 255.0f);
}
//先归一化,i/255,然后进行预补偿(i/255)^fGamma,最后进行反归一化(i/255)^fGamma*255

dst = src.clone();
const int channels = dst.channels();
switch (channels)
{
case 1:
{
//运用迭代器访问矩阵元素
MatIterator_<uchar> it, end;
for (it = dst.begin<uchar>(), end = dst.end<uchar>(); it != end; it++)
*it = lut[(*it)];

break;
}
case 3:
{

MatIterator_<Vec3b> it, end;
for (it = dst.begin<Vec3b>(), end = dst.end<Vec3b>(); it != end; it++)
{
(*it)[0] = lut[((*it)[0])];
(*it)[1] = lut[((*it)[1])];
(*it)[2] = lut[((*it)[2])];
}
break;
}
}
}
/*************************************************
函数名: ContrastStretchRGB
函数描述: 亮度调整
输入参数:
pIn:输入图像
pOut:输出图像
width:图像宽度
height:图像高度
DibWidth:图像行宽字节数
nChannel:图像通道数
minValue: 亮度最小值
maxValue:亮度最大值
gamma:调节系数
输出参数:
返回值: 无
**************************************************/
void ContrastStretchRGB(byte pIn[], byte pOut[], int width, int height, int DibWidth, short nChannel, double gamma)
{
IplImage * src = byteToIplImage(pIn, width, height, DibWidth, nChannel);
if(!src)
{
return ;
}
Mat src_img, dst_img;
src_img = cvarrToMat(src);
dst_img = cvCreateMat(src_img.rows, src_img.cols, src_img.depth());
CvSize size;
size.height = height;
size.width = width;
IplImage * dst = cvCreateImage(size,src->depth,nChannel);
IplImage * dst1 = cvCreateImage(size,src->depth,nChannel);
IplImage * src1 = cvCreateImage(size,src->depth,nChannel);

MyGammaCorrection(src_img, dst_img, gamma);

dst1 = &IplImage(dst_img);
src1 = &IplImage(src_img);
cvCopy(dst1,dst);
int dst_size = dst->widthStep * dst->height;
byte * m_temp = (byte *)dst->imageData;
byte * m1_temp = (byte *)src1->imageData;

for (int i > 0;i < dst_size;i++)
{
pOut[i]=m_temp[i];
}

cvReleaseImage(&dst);
}
...全文
714 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-03-07
  • 打赏
  • 举报
回复
void gamma_correct(Mat& img, Mat& dst, double gamma) {
	Mat	temp;
	CvMat tmp;

	img.convertTo(temp,	CV_32FC1, 1.0/255.0, 0.0);
	tmp=temp;
	cvPow(&tmp,	&tmp, gamma);
	temp.convertTo(dst , CV_8UC1 , 255.0	, 0.0);
}
赵4老师 2018-03-07
  • 打赏
  • 举报
回复
标准不都是gamma为1时为原图吗? γ 校正后=校正前
67373_ 2018-03-06
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
gamma不允许是0吧。
我现在想做的是进行gamma调整后能回到原图,下面是能拉动的一个标签,在0的时候是原图
赵4老师 2018-03-05
  • 打赏
  • 举报
回复
gamma不允许是0吧。
67373_ 2018-03-05
  • 打赏
  • 举报
回复
我现在想做的是进行gamma调整后能回到原图,下面是能拉动的一个标签,在0的时候是原图

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧