码迷,mamicode.com
首页 > 其他好文 > 详细

数字水印

时间:2020-07-06 19:53:21      阅读:58      评论:0      收藏:0      [点我收藏+]

标签:图像   技术   水印   info   可见   swa   http   png   amp   

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代码。

数字水印

标签:图像   技术   水印   info   可见   swa   http   png   amp   

原文地址:https://www.cnblogs.com/cyssmile/p/13256299.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!