matlab编程实现一种简单的数字水印嵌入与提取方法

方法用LSB或者DCT法,图片跟水印图片名字就1.bmp跟2.bmp吧,

DCT    嵌入水印图片与DWT是擦不多的。在Matlab上直接用函数的话值是一样的,应该说DWT包含DCT。下面我说一下嵌入过程,程序就不写了。网上很多的。给你一个嵌入思路。

DWT方法。原图大小为(512,512)嵌入图片大小为(64,64)

嵌入:

    读取原图片。

    读取水印图片。

    原图片要处理为灰图。

    水印图片要处理为2值图。

    生成伪随机乱数(记住是怎么生成的,提取时用到)。

    随机乱数做成2值图K与水印图生成密钥WK的2值图(方法有很多种)。

    原图片做3次DWT处理(Matlab里函数是dwt2)得到图片DA,DB,DC,DD。

    取出DB或DC,或者DB,DC都用上,设一个嵌入强度Q,与密钥K一起嵌入到DB,DC中(方法有很多种)。

    将嵌入后的DB,DC与没有嵌入的DA,DD一起(DA,DB,DC,DD顺序不要错了)进行反DWT处理。

    得到嵌入水印后的图片进行保存。

提取:

    读取嵌入水印后的图片。

    嵌入水印后的图片做3次DWT,并得到DA,DB,DC,DD。

    定义Q(嵌入时的强度,比如5)。

    生成嵌入水印时的伪随机乱数并做成2值图K。

    取出,嵌入水印的成分(嵌入到DB的话取出DB,两个都用了就两个都取出,在这里用DB代替)。

    进行嵌入时的反计算。

    提取后的水印图片进行保存。

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-11-03
%%%%%%%%%%% 嵌入水印算法 %%%%%%%%%%%%%%
clear all;
clc;
%%%%%% 读取水印图象 %%%%%%%
I=imread('123.bmp');
omark=double(imread('123.bmp'))/255; % 把图像数据类型转换为双精度浮点类型%
mo=32;
no=32;
%%%%% 以下生成水印信息 %%%%%%
mark=omark;
alpha=200;
R1=randn(1,8); %产生标准正态分布的1*8矩阵
rand1=round(R1); %对R1进行四舍五入
R2=randn(1,8);
rand2=round(R2);
%%%%%%% 读取宿主图像 %%%%%%%
cimage=imread('lena.bmp');
figure(1);
subplot(2,3,1),imshow(cimage,[]),title('原始的宿主图像');
[mc,nc]=size(cimage);
cimage=double(cimage);
fun = @(block_struct)fft2(block_struct.data);
fft0=blockproc(cimage,[8,8],fun); % 对宿主图像进行分块的FFT运算。
相似回答