PhotoShop算法实现--算术乘法和除法(十三)

PhotoShop算法实现--算术乘法和除法(十三)

kezunhai@gmail.com

http://blog.csdn.net/kezunhai


         基本代数乘法和除法在图像处理中也是应用广泛(乘法可以作为掩膜屏蔽图像的某些区域,如需要保留的掩膜值255,需去除的掩膜置0;除法在气象学和医学图像方面有很大的应用)。

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

       两像素相乘其值有很大的可能超过255,所以需要进行按比例缩放,除以最大值255(如此一般会导致图像的亮度有所降低);而亮像素值相处,一般会导致其值很小,所以也需要按比例缩放,乘以最大值255(如此一般会导致的图像的亮度提高)。

       算法实现:

// ARITHMETICS op:运算,取值为MULTIPLY和DIVIDE

void PhotoShop::MulDiv(Mat& img1, Mat& img2, Mat& dst, ARITHMETICS op)
{
	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)
		{			
			if ( op == MULTIPLY)
			{
				data[j*chns] = saturate_cast<uchar>((src1[j*chns]*src2[j*chns])/255.0+0.5);
				data[j*chns+1] =saturate_cast<uchar>((src1[j*chns+1]*src2[j*chns+1])/255.0+0.5);
				data[j*chns+2] = saturate_cast<uchar>((src1[j*chns+2]*src2[j*chns+2])/255.0+0.5);
			}
			else
			{
				data[j*chns] = saturate_cast<uchar>((src1[j*chns]/(src2[j*chns]+1.0))*255.0+0.5);
				data[j*chns+1] =saturate_cast<uchar>((src1[j*chns+1]/(src2[j*chns+1]+1.0))*255.0+0.5);
				data[j*chns+2] = saturate_cast<uchar>((src1[j*chns+2]/(src2[j*chns+2]+1.0))*255.0+0.5);
			}		
		}
	}	
}
    除法效果:



       从上图可以看到,除法可以很容易找到2幅图像之间的不同点(像素相似相处后再缩放,其值接近255,而像素值相差较大的点会比较突出)。

       下图是除法效果:


      从图中可以看到,图像亮度有所降低。

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值