数字水印
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代码。