數字水印


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM