C++ RGB图片亮度调整

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(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(row);  
		auto qtr = outImg.ptr(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内的数据

 
  

你可能感兴趣的:(opencv,图形图像,C/C++)