我正在尝试使用lsb embedding method将狒狒图像插入到lena图像中。当我尝试从隐秘图像中提取狒狒时,它只显示一个白色图像。
有谁能告诉我我的代码有什么问题以及如何解决问题?
这是我的狒狒形象。
这是我的莉娜形象。
我的嵌入代码
file_name='lena.bmp';
cover_image=imread(file_name);
[row,col]=size(cover_image);
%secret image
file_name='baboon.bmp';
secret_image=imread(file_name);
secret_image=imresize(secret_image,[row,col]);
stego_image=cover_image;
for ii=1:row
for jj=1:col
stego_image(ii,jj)=bitset(stego_image(ii,jj),1,secret_image(ii,jj));
end
end
imwrite(uint8(stego_image),'Stegoimage.bmp')
我的提取代码
file_name='Stegoimage.bmp';
stego_image=imread(file_name);
[row,col]=size(stego_image);
for ii=1:row
for jj=1:col
extracted_image(ii,jj)=bitget(stego_image(ii,jj),1);
end
end
extracted_image=uint8(255*extracted_image);
答案 0 :(得分:1)
你得到(大部分)白色图像,因为大多数像素是255.来自help bitset
:
C = bitset(A,BIT,V)根据V设置位置BIT V的零值将该位设置为0(关闭),并将非零值设置为 V将该位设置为1(打开)。
由于大多数狒狒像素非零,因此在提取过程中会产生最大强度。
要解决此问题,请通过将每个像素向右移动7位来嵌入秘密图像的MSB。
cover_image = imread('lena.png');
[row,col] = size(cover_image);
secret_image = imresize(imread('baboon.png'),[row,col]);
stego_image = bitset(cover_image,1,bitshift(secret_image,-7));
imshow(uint8(255*bitget(stego_image,1)));
答案 1 :(得分:1)
您获取白色图片的原因是因为命令
bitset(stego_image(ii,jj),1,secret_image(ii,jj));
说"如果secretimage(ii,jj)
非零,则将stego的第1位设置为1,否则如果它为零,则将其设置为零"。换句话说,这不符合您的想法。您正在对图像进行编码"狒狒> 0"相反(这确实是一个主要是白色的二进制图像!)。
此外,我认为你可以负担得起更多的比特而不仅仅是最不重要的比特,你隐藏的图像看起来不会降低。这是下面的方法,它改变了Lena图像的前4位,并保留了其他4位。
%% Prepare images
Lena = imread('lena.bmp'); Lena = Lena(:,:,1);
Baboon = imread('baboon.bmp'); Baboon = Baboon(:,:,1);
Baboon = imresize(Baboon, size(Lena));
Baboon = floor(double(Baboon) / 16); % ensure valid integers up to 15 (i.e. 4 bits max)
%% Conceal
Stego = zeros(size(Baboon));
for i = 1 : numel(Lena)
Stego(i) = bitand(16+32+64+128, Lena(i)); % keep bits 5,6,7 and 8 only.
Stego(i) = bitor(Stego(i), Baboon(i)); % 'add' bits 1,2,3 and 4.
end
figure(1); imshow(Stego, []);
%% Reveal
Uncovered = zeros(size(Stego));
for i = 1 : numel(Stego)
Uncovered(i) = bitand(1+2+4+8, Stego(i)); % keep only the first four bits
end
Uncovered = Uncovered * 16; % back to usual uin8 pixel range
figure(2); imshow(Uncovered, [])
您现在已经成功隐藏并检索了8位图像中的4位图像 请注意Lena图像现在看起来有点不那么平滑,就像颜色在陡峭的步骤中增加一样。 (事实上它们是4位步+ +狒狒噪声。) 此外,狒狒图像的质量低于原始的8位图像,因为它现在是一个4位图像(即使它已经缩放到8位)。
另外,如果你看得太紧,你可以将BABOON的眼睛作为一个迷失的阴影,只能超过LENA的角度! < /强>