OpenCV之 图像染色

        图像染色的算法很简单,首先指定一种渲染颜色,然后计算当前象素的平均值,用当前象素的平均值分别乘以渲染色的R、G、B分量值并除与255,将结果做为当前象素的最终颜色:

        1. 求出某个像素点的通道平均值

        2. 用平局值分别乘与颜色的R、G、B三个分量,再分别除与255

void OnChangeStaining(const Mat matSrc, Mat &matDst, COLORREF color)
{	
	// 准备数据
	int rows = matSrc.rows;
	int cols = matSrc.cols;
	int step = matSrc.step;	
	int channels = matSrc.channels();
	uchar *pSData = matSrc.data;
	uchar *pDData = matDst.data;

	byte r = GetRValue(color);
	byte g = GetGValue(color);
	byte b = GetBValue(color);

	// 使用数组形式修改Mat以达到高效的目的
	int index;	
	float avg;	
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			// 因为cols只是图片宽度,而图片是三通道的我们要修改三个通道的数据,必须要乘与通道数
			// step = cols * channels
			// i * step 表示一行的数据			
			// j * channels 表示第j列的数据
			index = i * step + j * channels;
			avg = (float)(pSData[index + 0] + pSData[index + 1] + pSData[index + 2]) / 3;

			// 因为Mat存储数据的方式就是BGR,所以第0位是B
			pDData[index + 0] = (byte)(b * avg / 255);
			pDData[index + 1] = (byte)(g * avg / 255);
			pDData[index + 2] = (byte)(r * avg / 255);
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ilson_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值