Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

LSB code

Asked by Aseel H on 26 Nov 2011
Latest activity Commented on by rasma khan on 8 Mar 2014

I want hide a text in image using LSB algorithm

for example:

X = image;
S = secret message;

I write:

X2(:)=bitset(X(:),1,S(:));

but when run i have an error

"??? Error using ==> bitset
Inputs must be non-negative integers."

after convert to binary i have another error

??? Undefined function or method 'bitset' for input arguments of type 'char'.

please help me.

1 Comment

Michael Chan on 21 Apr 2012

Similar methods are used in Matlab in the following example for static images:

http://www.mathworks.com/matlabcentral/fileexchange/36288-embedding-hiding-image-within-image-with-n-bit-lsb-steganography

http://www.mathworks.com/matlabcentral/fileexchange/36275-image-description-notes-with-n-bit-lsb-steganography

Aseel H

Products

No products are associated with this question.

5 Answers

Answer by Image Analyst on 27 Nov 2011
Accepted answer

Well here's my demo. It lets you hide an watermark image, which may be bigger or smaller than a cover image, into a user-specified bitplane of the cover (original) image. If the watermark is bigger than the original image, it scales it down. If the watermark is smaller, it tiles it. The watermark image can be grayscale and you can specify where you want it thresholded at. It uses standard MATLAB demo images. If the images are color, it takes the red channel - I haven't made it to work with color images. At the end it adds noise and recovers the watermark from the noise-free and noisy images, so you can see how lousy this method is as far as being robust to attack.

% Demo to watermark an image by hiding another image in a certain bit
% plane.  Sometimes called "LSB Watermarking" or something similar.
% User is asked which bit plane they want to hide the image in.
% By Image Analyst.
clc;    % Clear the command window.
close all;  % Close all figures (except those of imtool.)
imtool close all;  % Close all imtool figures.
clear;  % Erase all existing variables.
workspace;  % Make sure the workspace panel is showing.
fontSize = 12;
% Read in the image what will have another image hidden into it.
baseFileName='moon.tif';
% baseFileName='cameraman.tif';
folder = fullfile(matlabroot, '\toolbox\images\imdemos');
% Get the full filename, with path prepended.
fullFileName = fullfile(folder, baseFileName);
if ~exist(fullFileName, 'file')
	% Didn't find it there.  Check the search path for it.
	fullFileName = baseFileName; % No path this time.
	if ~exist(fullFileName, 'file')
		% Still didn't find it.  Alert user.
		errorMessage = sprintf('Error: %s does not exist.', fullFileName);
		uiwait(warndlg(errorMessage));
		return;
	end
end
originalImage = imread(fullFileName);
% Get the number of rows and columns in the original image.
[visibleRows visibleColumns numberOfColorChannels] = size(originalImage);
if numberOfColorChannels > 1
	% If it's color, extract the red channel.
	originalImage = originalImage(:,:,1);
end
% Display the original gray scale image.
subplot(3, 3, 4);
imshow(originalImage, []);
title('Original Grayscale Starting Image', 'FontSize', fontSize);
% Enlarge figure to full screen.
set(gcf, 'units','normalized','outerposition',[0 0 1 1]);
set(gcf,'name','Demo by ImageAnalyst','numbertitle','off') 
% read the message image you want to hide in the cover image
baseFileName='cameraman.tif';
% baseFileName='moon.tif';
% Get the full filename, with path prepended.
fullFileName = fullfile(folder, baseFileName);
if ~exist(fullFileName, 'file')
	% Didn't find it there.  Check the search path for it.
	fullFileName = baseFileName; % No path this time.
	if ~exist(fullFileName, 'file')
		% Still didn't find it.  Alert user.
		errorMessage = sprintf('Error: %s does not exist.', fullFileName);
		uiwait(warndlg(errorMessage));
		return;
	end
end
hiddenImage = imread(fullFileName);
% Get the number of rows and columns in the hidden image.
[hiddenRows hiddenColumns numberOfColorChannels] = size(hiddenImage);
if numberOfColorChannels > 1
	% If it's color, extract the red channel.
	hiddenImage = hiddenImage(:,:,1);
end
% Display the image.
subplot(3, 3, 1);
imshow(hiddenImage, []);
title('Image to be Hidden', 'FontSize', fontSize);
% Let's compute and display the histogram.
[pixelCount grayLevels] = imhist(hiddenImage);
subplot(3, 3, 2); 
bar(pixelCount);
title('Histogram of image to be hidden', 'FontSize', fontSize);
xlim([0 grayLevels(end)]); % Scale x axis manually.
grid on;
thresholdValue = 70;
binaryImage = hiddenImage < thresholdValue;
% Display the image.
subplot(3, 3, 3);
imshow(binaryImage, []);
caption = sprintf('Hidden Image Thresholded at %d', thresholdValue);
title(caption, 'FontSize', fontSize);
% Get the bit plane to hide the image in.
prompt = 'Enter the bit plane you want to hide the image in (1 - 8) ';
dialogTitle = 'Enter Bit Plane to Replace';
numberOfLines = 1;
defaultResponse = {'1'};
bitToSet = str2double(cell2mat(inputdlg(prompt, dialogTitle, numberOfLines, defaultResponse)));
% If image to be hidden is bigger than the original image, scale it down.
if hiddenRows > visibleRows || hiddenColumns > visibleColumns
	amountToShrink = min([visibleRows / hiddenRows, visibleColumns / hiddenColumns]);
	binaryImage = imresize(binaryImage, amountToShrink);
	% Need to update the number of rows and columns.
	[hiddenRows hiddenColumns] = size(binaryImage);
end
% Tile the hiddenImage, if it's smaller, so that it will cover the original image.
if hiddenRows < visibleRows || hiddenColumns < visibleColumns
	watermark = zeros(size(originalImage), 'uint8');
	for column = 1:visibleColumns
		for row = 1:visibleRows
			watermark(row, column) = binaryImage(mod(row,hiddenRows)+1, mod(column,hiddenColumns)+1);
		end
	end
	% Crop it to the same size as the original image.
	watermark = watermark(1:visibleRows, 1:visibleColumns);
else
	% Watermark is the same size as the original image.
	watermark = binaryImage;
end
% Display the thresholded binary image - the watermark alone.
subplot(3, 3, 5);
imshow(watermark, []);
caption = sprintf('Hidden Image\nto be Inserted into Bit Plane %d', bitToSet);
title(caption, 'FontSize', fontSize);
% Set the bit of originalImage(a copy, actually) to the value of the watermark.
watermarkedImage=originalImage;
for column = 1:visibleColumns
	for row = 1:visibleRows
		watermarkedImage(row, column)=bitset(originalImage(row, column), bitToSet, watermark(row, column));
	end
end
% Display the image.
subplot(3, 3, 6);
imshow(watermarkedImage, []);
caption = sprintf('Final Watermarked Image\nwithout added Noise');
title(caption, 'FontSize', fontSize);
% add noise to watermarked image
noisyWatermarkedImage = imnoise(watermarkedImage,'gaussian');
% Display the image.
subplot(3, 3, 7);
imshow(noisyWatermarkedImage, []);
caption = sprintf('Watermarked Image\nwith added Noise');
title(caption, 'FontSize', fontSize);
%====================================================================================
% Now let's pretend we are starting with the watermarked noisy corrupted image.
% We want to recover the watermark.
% Use the known bitplane of watermarked image to recover the watermark.
recoveredWatermark = zeros(size(noisyWatermarkedImage));
recoveredNoisyWatermark = zeros(size(noisyWatermarkedImage));
for column = 1:visibleColumns
	for row = 1:visibleRows
		recoveredWatermark(row, column) = bitget(watermarkedImage(row, column), bitToSet);
		recoveredNoisyWatermark(row, column) = bitget(noisyWatermarkedImage(row, column), bitToSet);
	end
end
% Scale the recovered watermark to 0=255
recoveredWatermark = uint8(255 * recoveredWatermark);
recoveredNoisyWatermark = uint8(255 * recoveredNoisyWatermark);
% Display the images.
subplot(3, 3, 8);
imshow(recoveredWatermark, []);
caption = sprintf('Watermark Recovered\nfrom Bit Plane %d of\nNoise-Free Watermarked Image', bitToSet);
title(caption, 'FontSize', fontSize);
% Display the images.
subplot(3, 3, 9);
imshow(recoveredNoisyWatermark, []);
caption = sprintf('Watermark Recovered\nfrom Bit Plane %d of\nNoisy Watermarked Image', bitToSet);
title(caption, 'FontSize', fontSize);
msgbox('Done with demo!');

3 Comments

Aseel H on 27 Nov 2011

thank you very much for demo

but I need to hide text in image by simple code
such as:
text = 'abcdef';
imge = imread('x.jpg');
binary = str2bin(text);

after that I want hide (binary) in (imge) using LSB algorithm
please help me
thanks

Image Analyst on 27 Nov 2011

No problem. Perhaps it will help someone who wants to hide an image in another image. Use Chandra's code below if you want to hide text in an image.

rasma khan on 8 Mar 2014

Thank u so much for the help!

Image Analyst
Answer by Walter Roberson on 26 Nov 2011

What data types are X and S? That is, what does class() report for each of them?

Your S must be a vector of values, each 0 or 1. It cannot be '0' or '1', and it cannot be (e.g) 72 (which corresponds to the coding for 'H')

1 Comment

Aseel H on 27 Nov 2011

X is a variable to identify the image
S is a variable to identify the text that i want hide it in image
please if you have code hide text in image using LSB algorithm send me
thanks

Walter Roberson
Answer by pratiksha patil on 4 Mar 2012

But how can I again extract the original message file???????

2 Comments

Aseel H on 7 Mar 2012

cover = imread('watermarked.bmp');
cl = 10; % length of message character 'abcdefghij'
idk = 1;
for row = 1 : size(cover,1)
for col = 1 : size(cover,2)
if idk <= cl * 8
bin_vector(idk) = bitget(cover(row,col), 7);
idk = idk + 1;
end
end
end
for x = 1 : cl
bin(x,:) = bin_vector((x-1)*8 + 1 : x*8);
dec(x) = bin2dec(num2str(bin(x,:)));
end
message = char(dec);

Michael Chan on 21 Apr 2012

Similar methods are used in Matlab in the following example for static images:

http://www.mathworks.com/matlabcentral/fileexchange/36288-embedding-hiding-image-within-image-with-n-bit-lsb-steganography

http://www.mathworks.com/matlabcentral/fileexchange/36275-image-description-notes-with-n-bit-lsb-steganography

pratiksha patil
Answer by sha on 21 Mar 2012

This is my example of extraction..

hopefully you can try..

%determined the size of watermarked image
mw=size(image1,1); %heigth of the watermarked image
nw=size(image1,2); %width of the watermarked image
for ii = 1: mw
      for jj = 1 : nw
          watermark (ii,jj) = bitget(image1(ii,jj),1);
      end
  end    
figure(2)
imshow(watermark);  
title('extracted image');     % watermark image for watermarking 

1 Comment

ghassan78 on 27 Jan 2014

ok my bro , but i think this code don't work with color watermark ... just with gray

sha
Answer by vtmz on 29 Aug 2012

Can anyone help me how to hide 2 bits of n-bit message into 2 LSB bits of cover image? I would really appreciate your help. Thanks in advance

1 Comment

Walter Roberson on 29 Aug 2012

Please open a new Question for that topic.

vtmz

Contact us