PhotoShop算法实现--算术加法和减法(十二)

PhotoShop算法实现--算术加法和减法(十二)

kezunhai@gmail.com

http://blog.csdn.net/kezunhai

         基本代数加法和减法在图像处理中也是应用广泛(加法可以将两幅图像融合,而减法可以从图像中分离出目标)。

        实现原理:把两幅图像对应位置处的R、G、B三个颜色分量进行分离,然后对应相加,再合成作为目标像素值输出。

实现代码:

// ===================================================
// 原图像img1, img2(大小相等)
// alpha和beta分别表示img1和img2的权重
// dst为输出结果图
// 当alpha + beta = 01时, 即为减法
// 当alpha + beta = 1时, 即为加法
// ====================================================
void PhotoShop::AddSub(Mat& img1, float alpha, Mat& img2, float beta, Mat& dst )
{
	if ( alpha+ beta != 1.0 && alpha + beta !=0)
	{
		 alpha = beta = 0.5;
	}

	if ( dst.empty())
		dst.create( img1.rows, img1.cols, img1.type());

	dst = cv::Scalar::all(0);

	int i, j;
	Size size = img1.size();
	int chns = img1.channels();

	//int chns = dst.channels();

	if (img1.isContinuous() && img2.isContinuous() && dst.isContinuous())
	{
		size.width *= size.height; 
		size.height = 1;
	}

	for (  i= 0; i<size.height; ++i)
	{
		const unsigned char* src1 = (const unsigned char*)img1.data + img1.step*i;
		const unsigned char* src2 = (const unsigned char*)img2.data + img2.step*i;
		unsigned char* data = (unsigned char*)dst.data+dst.step*i;
		for (  j=0; j<size.width; ++j)
		{						
			data[j*chns] = saturate_cast<uchar>(alpha*src1[j*chns] + beta* src2[j*chns]+0.5);
			data[j*chns+1] =saturate_cast<uchar>(alpha*src1[j*chns+1] + beta* src2[j*chns+1]+0.5);
			data[j*chns+2] = saturate_cast<uchar>(alpha*src1[j*chns+2] + beta* src2[j*chns+2]+0.5);
		}
	}	
}
加法效果图:



在上面几张图中,下面的图像是上面两幅图像的合成图(alpha=0.9, beta =0.1),可以通过调节alpha和beta合成不同的图像。

         这下面的图像是两张图像相减的结果(通过图像相减可以判断两张图像是否相同,以及两张图像有什么不同,对于喜欢找不同点游戏的朋友,通过这个方法可以很快地找到两幅图像的不同点,快速打败对手):



作者:kezunhai 出处:http://blog.csdn.net/kezunhai 欢迎转载或分享,但请务必声明文章出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值