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