使用隐写术提取的图像是白色的
Extracted image with steganography is white
我正在尝试使用 lsb embedding method 将狒狒图像插入到 lena 图像中。当我尝试从隐写图像中提取狒狒时,它只显示一个白色图像。
谁能告诉我我的代码有什么问题以及如何解决这个问题?
这是我的狒狒图片。
这是我的 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);
你得到一张(大部分)白色图像,因为大多数像素为 255。来自 help bitset
:
C = bitset(A,BIT,V) sets the bit at position BIT according to V.
Zero values of V sets the bit to 0 (off), and non-zero values of
V sets the bit to 1 (on).
由于大多数狒狒像素不为零,因此在提取过程中会达到最大强度。
要解决此问题,请通过将每个像素向右移动 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)));
您得到白色图像的原因是因为命令
bitset(stego_image(ii,jj),1,secret_image(ii,jj));
在说"if secretimage(ii,jj)
is nonzero set the 1st bit of stego to 1, otherwise if it's zero set it to zero"。换句话说,这并没有按照您认为的那样去做。您正在对图像 "Baboon>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 图像现在看起来有点不那么平滑,好像颜色增加得更陡峭 'steps'。 (实际上是!4 位步长 + 狒狒噪声)。
以及狒狒图像的质量如何低于原始 8 位图像,因为它现在是 4 位图像(即使它已缩减为 8 位)。
另外,如果你仔细观察,你会发现狒狒的眼睛是一个微弱的影子,就在莉娜帽子的角上方!!!
我正在尝试使用 lsb embedding method 将狒狒图像插入到 lena 图像中。当我尝试从隐写图像中提取狒狒时,它只显示一个白色图像。
谁能告诉我我的代码有什么问题以及如何解决这个问题?
这是我的狒狒图片。
这是我的 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);
你得到一张(大部分)白色图像,因为大多数像素为 255。来自 help bitset
:
C = bitset(A,BIT,V) sets the bit at position BIT according to V.
Zero values of V sets the bit to 0 (off), and non-zero values of
V sets the bit to 1 (on).
由于大多数狒狒像素不为零,因此在提取过程中会达到最大强度。
要解决此问题,请通过将每个像素向右移动 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)));
您得到白色图像的原因是因为命令
bitset(stego_image(ii,jj),1,secret_image(ii,jj));
在说"if secretimage(ii,jj)
is nonzero set the 1st bit of stego to 1, otherwise if it's zero set it to zero"。换句话说,这并没有按照您认为的那样去做。您正在对图像 "Baboon>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 图像现在看起来有点不那么平滑,好像颜色增加得更陡峭 'steps'。 (实际上是!4 位步长 + 狒狒噪声)。
以及狒狒图像的质量如何低于原始 8 位图像,因为它现在是 4 位图像(即使它已缩减为 8 位)。
另外,如果你仔细观察,你会发现狒狒的眼睛是一个微弱的影子,就在莉娜帽子的角上方!!!