基于LSB的数字图像水印处理(灰度水印、彩色水印)

基于LSB的数字图像水印算法的基本原理及水印图像的嵌入和提取算法

最低有效位(LSB)是指一个二进制数中的第0位(即最低位),其对图像的视觉效果影响最小。

基于数字图像最低有效位(LSB)的数字图像水印算法是一种常见的数字水印嵌入和提取技术。该算法将一个需要隐藏的二值图像信息嵌入载体图像的最低有效位,即将载体图像的最低有效位层替换为当前需要隐的二值图像,从而实现将二值图像隐藏的目的由于二值图像处于载体图像的最低有效位上,所以对于载体图像的影响非常不明显,其具有较高的隐酸性,并且在必要时直接将载体图像的最低有效位层提取出来,即可得到嵌入在该位上的二值图像,达到提取秘密信息的目的。

数字图像水印算法的处理过程分为嵌入过程和提取过程,嵌入过程主要将载体图像的第0 个位平面替换为数字水印信息(一幅二值图像);提取过程主要将载体图像的最低有效位所构成的第0 个位平面提取出来,从而得到数字水印信息。

嵌入过程的主要过程为:1.先将载体图像处理位二进制形式,并且标记出其最低有效位;2.在嵌入水印前,通过阈值处理先将水印信息处理为二进制二值水印信息;3.将载体图像的最低有效位替换为二进制水印图像,完成水印的嵌入;4.将含水印载体图像的二进制图像转为十进制。由于信息的最低有效位对值的大小影响有限,因此,将载体图像最低有效位的值用水印信息替换后,载体图像作素的值并没有发生太大变化,人眼不足以看出区别,水印具有较高的隐藏性

提取过程的主要过程为:1.先将含水印载体图像的像素值转换为二进制形式;2.将其最低有效位提取出来,从而得到水印信息。得到的水印信息为二进制信息,可以根据需要通过阈值处理将其中为1的像素点转换位255,从而得到含有0和 255 两个值的二值水印图像。

二值水印图像的嵌入和提取

嵌入算法:

1.读取原始图像和水印图像;2. 对水印进行预处理,将其像素值调整为二进制二值水印信息;3.遍历载体图像像素,将其像素值调整为二进制;3.将水印图像中的信息替换载体图像的LSB;4.生成水印后的图像。

提取算法:

1. 读取水印后的图像;2.遍历图像像素;3.提取每个像素的LSB;4.将提取出来的水印信息组合成水印图像;5. 对还原的水印图像进行必要的后处理。

% 读取原始图像和水印图像
originalImage = imread('boy.tif');
watermarkImage = imread('szu.bmp');

[m,n] = size(watermarkImage);
binaryImage = originalImage;
%嵌入算法
% 遍历像素
for i = 1:m
    for j = 1:n
        %将原始图像像素值十进制转换为二进制
        b = dec2bin(binaryImage(i,j));
        [b1,b2] = size(b);
        % LSB替换
        if(watermarkImage(i,j) == 0)
            b(b2) = '0';
        else
            b(b2) = '1'; 
        end
        d = bin2dec(b);
        binaryImage(i,j) = d;
    end
end


%生成图像
figure;

subplot(1,3,1);
imshow(originalImage);
title('原图');

subplot(1,3,2);
imshow(watermarkImage);
title('水印');

subplot(1,3,3);
imshow(binaryImage);
title('嵌入水印后图像');

%提取算法
extractpic = zeros(m,n);
for i= 1:m
    for j = 1:n
        c = dec2bin(binaryImage(i,j));
        [c1,c2] = size(c);
        e = str2num(c(c2));
        extractpic(i,j) = e;
    end
end

figure;

subplot(1,3,1);
imshow(originalImage);
title('原图');

subplot(1,3,2);
imshow(binaryImage);
title('嵌入后的图像');

subplot(1,3,3);
imshow(extractpic);
title('提取出的水印');

 

 灰度水印嵌入灰度载体图像

当水印图片为灰度图像时,我们需要将灰度图像像素值转换成二进制格式,从而进行嵌入操作。

若我们将灰度图像先转化为二进制二值图像并进行嵌入和提取操作,很显然嵌入和提取得到的水印图像会变成二值图像,导致较多信息的缺失,因此我们不考虑这种操作。

嵌入操作:当水印为灰度图像时,我们先将水印图像和载体图像遍历像素点,使像素值转为二进制格式,之后我们将水印图像的每个像素的最后四位信息分别嵌入到载体图像的相应像素中,从而实现嵌入操作。注意:在该操作中,我们使用了bitget函数,因此我们需要确保载体图像和水印图像两者尺度大小一致。

photo2Bin(b2) = num2str(bitget(wmark(i,j),8));

提取操作:我们需要在嵌入水印的图像中提取出水印图像,因此我们要将嵌入操作中水印的每个像素的最后四位信息依次提取出来,并按照其原有的顺序加权重新组合成新的水印图像像素信息

photo1 = imread('boy.tif');
wmark = imread('lena_gray.tif');

figure;
subplot(131);imshow(photo1);title('原图');
subplot(132);imshow(wmark);title('灰度水印');

% LSB 数字灰度图像水印嵌入
photo2 = photo1;
[m,n] = size(wmark);

 for i = 1:m
   for j = 1:n
       markBin = dec2bin(wmark(i,j));%将像素调整为二进制
       photo2Bin = dec2bin(photo2(i,j));
       [b1,b2] = size(photo2Bin);
       photo2Bin(b2) = num2str(bitget(wmark(i,j),8));%依次将灰度水印图像的每个像素的最后4位嵌入到载体图像的相应像素中
       photo2Bin(b2-1) = num2str(bitget(wmark(i,j),7));
       photo2Bin(b2-2) = num2str(bitget(wmark(i,j),6));
       photo2Bin(b2-3) = num2str(bitget(wmark(i,j),5));
       photo2(i,j) = bin2dec(photo2Bin);
   end
end
subplot(133);imshow(photo2);title('插入水印后的图像')

% LSB 数字灰度图像水印提取
tmp8 = zeros(m,n);%创建一些空矩阵,用于存放
tmp7 = zeros(m,n);
tmp6 = zeros(m,n);
tmp5 = zeros(m,n);
photo3 = zeros(m,n);
photo4 = zeros(m,n);

for i = 1:m
   for j = 1:n
       k = dec2bin(photo2(i,j));
       tmp8(i,j) = bitget(photo2(i,j),1);%依次提取图像像素的最后四位
       tmp7(i,j) = bitget(photo2(i,j),2);
       tmp6(i,j) = bitget(photo2(i,j),3);
       tmp5(i,j) = bitget(photo2(i,j),4);
       photo3(i,j) = tmp8(i,j)*128 + tmp7(i,j)*64 + tmp6(i,j)*32;%使用最后三位加权得到的水印
       photo4(i,j) = tmp8(i,j)*128 + tmp7(i,j)*64 + tmp6(i,j)*32+tmp5(i,j)*16;%使用最后四位加权得到的水印
   end
end
photo3 = uint8(photo3);
photo4 = uint8(photo4);

figure;
subplot(231);imshow(tmp8);title('提取第八个位平面')
subplot(232);imshow(tmp7);title('提取第七个位平面')
subplot(233);imshow(tmp6);title('提取第六个位平面')
subplot(234);imshow(tmp5);title('提取第五个位平面')
subplot(235);imshow(photo3);title('合成水印')
subplot(236);imshow(photo5);title('合成水印')

图二得到的两个不同水印:前者使用最后三位加权得到,而后者使用最后四位加权得到,可以看出信息越多,提取得到的水印更加接近原水印图像。

彩色水印嵌入彩色图像及提取

当水印是一副彩色的图像时,由于彩色图形存在RGB三种不同的通道,因此我们需要将水印中不同通道的像素信息分别嵌入到载体图像相应的像素位置,才能得到较好的效果,且当提取时,也不会损失较多的信息。

嵌入操作:我们首先将载体图像和水印图像的三个颜色通道依次提取出来并存放在不同的地方,之后通过bitset和bitget函数实现遍历水印图像的每个像素,并将水印图像的最后三位分别嵌入到输入图像的红色通道、绿色通道和蓝色通道的最低三位中。最后将修改后的三个通道合成嵌入后的图像。

提取操作:在这里,我们将上述三种通道分别加权得到水印信息(偷懒了,具体提取思路和灰度图像相近)。

photo1 = imread("baboon.jpg");
wmark = imread("lena_std.bmp");

figure;
subplot(221);imshow(photo1);title('原图');
subplot(222);imshow(wmark);title('水印');

% LSB 数字彩色图像水印嵌入
photoR = photo1(:,:,1);
photoG = photo1(:,:,2);
photoB = photo1(:,:,3);
markR = wmark(:,:,1);
markG = wmark(:,:,2);
markB = wmark(:,:,3);
[m,n,z] = size(wmark);

for i = 1:m
    for j = 1:n
        photoR(i,j) = bitset(photoR(i,j),1,bitget(markR(i,j),8));%分别将水印中不同通道的信息嵌入到载体相关位置
        photoR(i,j) = bitset(photoR(i,j),2,bitget(markR(i,j),7));
        photoR(i,j) = bitset(photoR(i,j),3,bitget(markR(i,j),6));
        photoG(i,j) = bitset(photoG(i,j),1,bitget(markG(i,j),8));
        photoG(i,j) = bitset(photoG(i,j),2,bitget(markG(i,j),7));
        photoG(i,j) = bitset(photoG(i,j),3,bitget(markG(i,j),6));
        photoB(i,j) = bitset(photoB(i,j),1,bitget(markB(i,j),8));
        photoB(i,j) = bitset(photoB(i,j),2,bitget(markB(i,j),7));
        photoB(i,j) = bitset(photoB(i,j),3,bitget(markB(i,j),6));
    end
end

photo3(:,:,1) = photoR;
photo3(:,:,2) = photoG;
photo3(:,:,3) = photoB;
subplot(223);imshow(photo3);title('嵌入水印后的图像');

 % LSB 数字彩色图像水印提取
tmp = zeros(m,n,3);
for i = 1:m
    for j = 1:n
        tmp(i,j,1) = bitget(photo3(i,j,1),1)*128 + bitget(photo3(i,j,1),2)*64 + bitget(photo3(i,j,1),3)*32;
        tmp(i,j,2) = bitget(photo3(i,j,2),1)*128 + bitget(photo3(i,j,2),2)*64 + bitget(photo3(i,j,2),3)*32;
        tmp(i,j,3) = bitget(photo3(i,j,3),1)*128 + bitget(photo3(i,j,3),2)*64 + bitget(photo3(i,j,3),3)*32;
    end
end

tmp = uint8(tmp);
subplot(224);imshow(tmp);title('提取水印')

  • 24
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值