在matlab中将较小尺寸图像加水印到svd域中的较大主图像

时间:2011-09-04 21:00:49

标签: matlab watermark

我试图通过修改S矩阵的奇异值,使用简单的svd算法将大小为32 * 32的水印图像称为大小为256 * 256的主机图像。但是,如果能够将较小尺寸的图像水印到主机图像,则有人帮忙编码,我将感激不尽

2 个答案:

答案 0 :(得分:1)

我即将发表评论但它变得越来越大,所以即使问题仍然模糊,我也会将其作为答案发布。

正如Amro所说,您应该发布当前的代码并详细说明哪些内容无法正常工作(例如,使用相关的错误消息)。

如果没有这些精确度,我们只能猜出你的问题是什么。

有一个post on Matlab Central详细说明了使用SVD为图像添加水印的过程。

我猜您的问题是您的水印图像小于目标图像,因此您在某处遇到“尺寸不匹配”错误。一种解决方案是为您填充水印图像以适合目标图像(请参阅此question)。

这似乎可以通过这个快速尝试在我的电脑上运行。

% Image
Himg=100;
Wimg=100;
img=imread('stackoverflow.png');
img=imresize(img,[Himg Wimg]);
img=im2double(img);
for i=1:3
    [Uimg(:,:,i) Simg(:,:,i) Vimg(:,:,i)]=svd(img(:,:,i));
end
% Watermark
wat=imread('stackoverflow_logo.png');
Hwat=30;
Wwat=30;
wat=imresize(wat,[Hwat Wwat]);
wat=im2double(wat);
% Padding
wat=padarray(wat,[floor((Himg-Hwat)/2) floor((Wimg-Wwat)/2)], 'replicate','post');
wat=padarray(wat,[ceil((Himg-Hwat)/2) ceil((Wimg-Wwat)/2)], 'replicate','pre');
% Result
alpha=0.2;
Simg=Simg+alpha*wat;
for i=1:3
    [Ures(:,:,i) Sres(:,:,i) Vres(:,:,i)]=svd(Simg(:,:,i));
    res(:,:,i)=Uimg(:,:,i)*Sres(:,:,i)*Vimg(:,:,i)';
end
figure;
imshow(img);
figure;
imshow(wat);
figure;
imshow(res);

答案 1 :(得分:0)

您可以使用简单的空间域bit-planes watermarking,并在水印之前和之后进行一些调整。