您的位置:首页 > 编程语言 > C语言/C++

C++ RGB图片亮度调整

2016-07-26 16:29 495 查看
int clamp(
const int x)
{
if (x > 255)
return 255;
if (x < 0)
return 0;

return x;
}

int imgBrightness(
const Mat									srcImg,//输入图片
const float									brightness,//亮度比值
Mat 										&outImg)//输出图片
{
if(!srcImg.data){
LOOGE<<"[image error!]";
return -1;
}

//
int nRet = 0;
int row, col;
int srcWidth, srcHeight;
int rgbmeans[3];
double redSum, greenSum, blueSum;
double total;
int pixelValue;

//r、g、b像素值累加
redSum = 0;
greenSum = 0;
blueSum = 0;
//
srcWidth = srcImg.cols;
srcHeight = srcImg.rows;
total = srcWidth * srcHeight;

//获取rgb means
for(row = 0; row < srcHeight; row++){
auto ptr = srcImg.ptr<uchar>(row);
int tr = 0, tg = 0, tb = 0;
for(col = 0; col < srcWidth; col++){
tr =  ptr[2];
tg =  ptr[1];
tb =  ptr[0];

redSum += tr;
greenSum += tg;
blueSum +=tb;

ptr += 3;
}
}
rgbmeans[0] = (int)(redSum / total);
rgbmeans[1] = (int)(greenSum / total);
rgbmeans[2] = (int)(blueSum / total);

// 调整亮度
outImg = srcImg.clone();
for(row = 0; row < srcHeight; row++) {
auto ptr = srcImg.ptr<uchar>(row);
auto qtr = outImg.ptr<uchar>(row);
int tr = 0, tg = 0, tb = 0;
for(col = 0; col < srcWidth; col++) {
//获取r、g、b值
tr =  ptr[2];
tg =  ptr[1];
tb =  ptr[0];

// 均值消减
tr -=rgbmeans[0];
tg -=rgbmeans[1];
tb -=rgbmeans[2];

// 亮度调整
tr += (int)(rgbmeans[0] * brightness);
tg += (int)(rgbmeans[1] * brightness);
tb += (int)(rgbmeans[2] * brightness);

//为目标输出图片赋值
qtr[0] = clamp(tb);
qtr[1] = clamp(tg);
qtr[2] = clamp(tr);

ptr += 3;
qtr += 3;
}
}

return nRet;
}


参考:C++ Mat 读取imagedata内的数据


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 图片 opencv