I am getting wrong result while extracting the text
2 views (last 30 days)
Show older comments
%texthide
c = imread('Ramya.jpg');
message = 'Ramyashree'
message = strtrim(message);
m = length(message) * 8;
AsciiCode = uint8(message);
binaryString = transpose(dec2bin(AsciiCode,8));
binaryString = binaryString(:);
N = length(binaryString);
b = zeros(N,1); %b is a vector of bits
for k = 1:N
if(binaryString(k) == '1')
b(k) = 1;
else
b(k) = 0;
end
end
s = c;
height = size(c,1);
width = size(c,2);
k = 1;
for i = 1 : height
for j = 1 : width
LSB = mod(double(c(i,j)), 2);
if (k>m || LSB == b(k))
s(i,j) = c(i,j);
else
if(LSB == 1)
s(i,j) = c(i,j) - 1;
else
s(i,j) = c(i,j) + 1;
end
k = k + 1;
end
end
end
imwrite(s, 'Ramya_hiddenmsgimage.jpg');
%extract.m
s = imread('Ramya_hiddenmsgimage.jpg');
height = size(s,1);
width = size(s,2);
%For this example the max size is 100 bytes, or 800 bits, (bytes * = bits
m = 800;
k = 1;
for i = 1 : height
for j = 1 : width
if (k <= m)
b(k) = mod(double(s(i,j)),2);
k = k + 1;
end
end
end
binaryVector = b;
binValues = [ 128 64 32 16 8 4 2 1 ];
binaryVector = binaryVector(:);
if mod(length(binaryVector),8) ~= 0
error('Length of binary vector must be a multiple of 8.');
end
binMatrix = reshape(binaryVector,8,100);
display(binMatrix);
textString = char(binValues*binMatrix);
disp(textString);
Output is:À òꪪªªªÿÿ° ÿÿÕRÿÿ÷Ô ` Àyÿá?ÿÀ *?ÿ½ÒÅJ ÿáØ 1þ
2 Comments
Jan
on 25 Jun 2023
N = length(binaryString);
b = zeros(N,1); %b is a vector of bits
for k = 1:N
if(binaryString(k) == '1')
b(k) = 1;
else
b(k) = 0;
end
end
% Simplification:
b = (binaryString == '1');
Accepted Answer
DGM
on 25 Jun 2023
Moved: Cris LaPierre
on 26 Jun 2023
You're writing to non-consecutive pixels based on their original values and the values of the embedded message. When you read the marked image, you're reading a fixed number of consecutive pixels with no knowledge of which pixels were altered or what the original values were (either the image or the message).
% inputs
testfilename = 'test.png';
cleanpict = imread('cameraman.tif'); % you're presuming that the input is single-channel
message = 'Potato';
% simplify things for testing
cleanpict = cleanpict(1,:);
% convert message to a logical column vector (binary representation at 8b/char)
message = strtrim(message);
b = dec2bin(message,8) == '1'; % convert the whole thing first; don't need to cast uint8
b = reshape(b.',[],1); % then do all the reshaping
m = numel(b); % this just seems safer
markedpict = cleanpict;
height = size(cleanpict,1);
width = size(cleanpict,2);
k = 1;
idx = []; % just for testing
for i = 1 : height
for j = 1 : width
LSB = mod(double(cleanpict(i,j)), 2);
if (k>m || LSB == b(k))
% skip if remainder matches message
markedpict(i,j) = cleanpict(i,j);
else
% if remainder differs from message
if(LSB == 1)
% if odd, make even
markedpict(i,j) = cleanpict(i,j) - 1;
else
% if even, make odd
markedpict(i,j) = cleanpict(i,j) + 1;
end
k = k + 1;
idx = [idx; j]; % keep track of which indices are altered
end
end
end
imwrite(markedpict, testfilename);
% the indices that are altered are not consecutive
idx.'
% demonstrate that the payload can be recovered
b = mod(markedpict(idx),2); % with knowledge of altered indices
key = '01';
b = reshape(key(b+1),8,[]).'; % convert to char representation of binary
b = char(bin2dec(b).') % convert to numeric -> char
Also, there's no reason to assume that any such watermarking would survive being written to a JPG anyway.
More Answers (0)
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!