数字水印

1、简单的可见水印


这里的f为未添加水印的图像,常数为控制水印与称底图片的相对可见性。

代码实现:

/*
* 简单的可见水印
* 要求添加尺寸的图片应该大于水印
* F = (1-a)f + a*w
*/
void sampleImagesWaterMarking(Mat& src,Mat& waterMat,Mat& dst,double a) 
{
	int row = src.rows;
	int col = src.cols;

	int wr = waterMat.rows;
	int wc = waterMat.cols;
	dst = src.clone();
	for (int i = 0; i < wr; i++) 
	{
		for (int j = 0; j < wc; j++) 
		{
			Vec3b temp = waterMat.at<Vec3b>(i, j);
			dst.at<Vec3b>(row - wr + i, col - wc + j) = (1-a)*dst.at<Vec3b>(row - wr + i, col - wc + j)+ a*temp;
		}
	}
}

实验效果

=0.3时

这种水印是可见的。

LSB

LSB是一种不可见水印,它能抵抗偶然或故意删除它们的企图。但是这种方式的实现的鲁棒性很差。
常用的实现公式为
这里是将f的两个最低的比特置为0,w的最高两个比特移到最低两个比特位。

代码实现

void iLSB(Mat& src, Mat& waterMat, Mat& dst, double a)
{
	int row = src.rows;
	int col = src.cols;

	int wr = waterMat.rows;
	int wc = waterMat.cols;
	dst = src.clone();
	for (int i = 0; i < wr; i++)
	{
		for (int j = 0; j < wc; j++)
		{
			Vec3b temp = waterMat.at<Vec3b>(i, j);
			dst.at<Vec3b>(row - wr + i, col - wc + j) = 4*(dst.at<Vec3b>(row - wr + i, col - wc + j)/4) + temp/64;
		}
	}
}

实验效果


其实仔细看右边的图片还是能感觉到到水印的存在,这是应为选择的图片f的右下角本来就偏暗,而我要加入的水印的背景基本都是白色。
所以还是会有痕迹。

基于DCT的不可见鲁棒性水印

明天还要考试,后面再写。

其实本科的时候也学过,只是当时用的是老师给的matlab代码。

posted @ 2020-07-06 18:36  cyssmile  阅读(1244)  评论(0编辑  收藏  举报