LSB信息隱藏算法實驗內容(matlab)
https://github.com/SKPrimin/HomeWork/tree/main/DigitalWatermarking/BworkLSB%E4%BF%A1%E6%81%AF%E9%9A%90%E8%97%8F%E7%AE%97%E6%B3%95%E5%AE%9E%E9%AA%8C%E5%86%85%E5%AE%B9
1.將載體圖片分成8個位平面,並顯示。
2.制作水印圖片,可以嵌入1個位平面的、2個位平面的、3個位平面的。
3.使用LSB信息隱藏算法,分別嵌入1bit/pixel、2bit/pixel、3bit/pixel,並顯示偽裝圖像。
4.提取嵌入的秘密信息。
將載體圖片分成八個位平面,並顯示。
- 載體圖片
-
相關代碼
%% 第一張 風車 imgW = imread('7.bmp'); imgW=imresize(imgW,0.5); imgWsize=size(imgW); %提取bitplane bitPlaneW=zeros(imgWsize(1),imgWsize(2),8); for i =1:8 for ro=1:imgWsize(1) for co=1:imgWsize(2) bitPlaneW(ro,co,i)=bitget(imgW(ro,co), i); end end end % 繪制bitplane figure; for i =1:8 subplot(2,4,i) imshow(uint8(255*bitPlaneW(:,:,i))) title(['Bitplane' num2str(i)]) end
-
八位平面展示
制作水印圖片,嵌入1個位平面、嵌入2個位平面、嵌入3個位平面
- 選擇Lena圖片作為想要隱藏的圖片
-
相關代碼段
-
分別讀入載體照片和插入照片
%% 第一張 摩天輪 img = imread('7.bmp'); img=imresize(img,0.5); imgsize=size(img); %提取bitplane比特平面 bitPlane=zeros(imgsize(1),imgsize(2),8); for i =1:8 for ro=1:imgsize(1)% ro: row圖片行號,y for co=1:imgsize(2) %co: column圖片,x bitPlane(ro,co,i)=bitget(img(ro,co), i); end end end % 繪制bitplane figure; for i =1:8 subplot(2,4,i) imshow(uint8(255*bitPlane(:,:,i))) title(['Bitplane' num2str(i)]) end %% lena imgW = imread('9.bmp'); imgW=imresize(imgW,0.5); imgWsize=size(imgW); [length,width,~]=size(imgW); %提取bitplane bitPlaneW=zeros(imgWsize(1),imgWsize(2),8); for i =1:8 for ro=1:imgWsize(1) for co=1:imgWsize(2) bitPlaneW(ro,co,i)=bitget(imgW(ro,co), i); end end end % 繪制bitplane figure; for i =1:8 subplot(2,4,i) imshow(uint8(255*bitPlaneW(:,:,i))) title(['Bitplane' num2str(i)]) end
-
構造新的照片
- 嵌入1個位平面
%% 構造新的bitPlane newbitPlane=bitPlane; newbitPlane(:,:,1) = bitPlaneW(:,:,8);
- 嵌入2個位平面
%% 構造新的bitPlane newbitPlane=bitPlane; newbitPlane(:,:,2) = bitPlaneW(:,:,8); newbitPlane(:,:,1) = bitPlaneW(:,:,7);
- 嵌入3個位平面
%% 構造新的bitPlane newbitPlane=bitPlane; newbitPlane(:,:,3) = bitPlaneW(:,:,8); newbitPlane(:,:,2) = bitPlaneW(:,:,7); newbitPlane(:,:,1) = bitPlaneW(:,:,6);
-
合成新圖片及提取水印
%% 產生新圖片(含水印) newimg=zeros(256,256); for i =1:8 newimg=newimg+newbitPlane(:,:,i)*2^(i-1); end newimg=uint8(newimg); figure; imshow(newimg),title('含水印的新圖片'); %% 效果展示 %提取bitplane bitPlaneRec=zeros(imgsize(1),imgsize(2),8); for i =1:8 for ro=1:imgsize(1) for co=1:imgsize(2) bitPlaneRec(ro,co,i)=bitget(newimg(ro,co), i); end end end % 繪制bitplane figure; for i =1:8 subplot(2,4,i) imshow(uint8(255*bitPlaneRec(:,:,i))) title(['Bitplane' num2str(i)]) end
-
加水印的效果圖
-
嵌入1個位平面
-
嵌入2個位平面
-
嵌入3個位平面
-
提取嵌入的秘密信息
- 提取圖片的信息
%% 水印提取過程
%提取bitplane
bitPlaneRec=zeros(imgsize(1),imgsize(2),8);
for i =1:8
for ro=1:imgsize(1)
for co=1:imgsize(2)
bitPlaneRec(ro,co,i)=bitget(newimg(ro,co), i);
end
end
end
% 繪制bitplane
figure;
for i =1:8
subplot(2,4,i)
imshow(uint8(255*bitPlaneRec(:,:,i)))
title(['Bitplane' num2str(i)])
end
% 復原水印圖
newimgW=zeros(imgsize(1),imgsize(2));
for i = 1 % 兩個位平面時i=1:2 / 3個位平面時 i=1:3
newimgW=newimgW+bitPlaneRec(:,:,i)*2^(4+i);
end
figure;imshow(uint8(newimgW)),title('提取出的圖片')
- 從嵌入1個位平面圖中提取圖片
- 從嵌入2個位平面圖中提取圖片
- 從嵌入3個位平面圖中提取圖片
小結討論
-
了解了LSB信息隱藏算法的原理。通過圖片的權重分配,使得權重較小的位置可以藏匿我們想要的信息
-
對於低位來說:嵌入1個位平面時,受影響的值只有01;嵌入2個位平面時,受影響的值有04;嵌入3個位平面時,受影響的值也僅有011。這相對於常規圖片的0255來說影響不大。
-
而對於高位:嵌入1個位平面時,受影響的像素值就高達0127;嵌入2個位平面時,受影響的像素值達到了0190;嵌入3個位平面時,受影響的值更是漲到0~221。可以說具有舉足輕重的地位。
-
那么我們將嵌入照片的高位嵌入載體照片的地位,便可以保存嵌入照片的眾多信息的同時對載體照片影響微乎其微。由此可以實現信息隱藏。
平面時,受影響的值有04;嵌入3個位平面時,受影響的值也僅有011。這相對於常規圖片的0~255來說影響不大。 -
而對於高位:嵌入1個位平面時,受影響的像素值就高達0127;嵌入2個位平面時,受影響的像素值達到了0190;嵌入3個位平面時,受影響的值更是漲到0~221。可以說具有舉足輕重的地位。
-
那么我們將嵌入照片的高位嵌入載體照片的地位,便可以保存嵌入照片的眾多信息的同時對載體照片影響微乎其微。由此可以實現信息隱藏。