binaryMessage(end+1) = char(bitget(yEcho(i), 1) + '0');报错双精度输入必须包含 ASSUMEDTYPE 范围内的整数值。
时间: 2024-05-22 22:16:36 浏览: 7
这个错误是因为在上述代码中,函数 bitget(yEcho(i), 1) 返回的是一个逻辑值(0 或 1),而在将其转换为 char 类型时,需要使用 ASCII 码。因此,正确的写法应该是:
binaryMessage(end+1) = char(bitget(yEcho(i), 1) + '0');
这里加上 '0' 的意思是将逻辑值转换为 ASCII 码对应的字符。
相关问题
1、用MATLAB函数实现LSB信息隐藏和提取;
以下是基本的LSB信息隐藏和提取MATLAB代码示例:
1. LSB信息隐藏
```matlab
% 加载载入图像
I = imread('lena.png');
% 提取图像的红色通道
R = I(:,:,1);
% 将待隐藏的信息编码成二进制字符串
message = 'Hello, World!';
binaryMessage = dec2bin(message, 8);
% 为每个像素的最低有效位设定二进制信息
binaryMessageIndex = 1;
for i = 1:size(R, 1)
for j = 1:size(R, 2)
binaryPixel = dec2bin(R(i,j), 8);
binaryPixel(8) = binaryMessage(binaryMessageIndex);
binaryMessageIndex = binaryMessageIndex + 1;
if binaryMessageIndex > length(binaryMessage)
break;
end
R(i,j) = bin2dec(binaryPixel);
end
if binaryMessageIndex > length(binaryMessage)
break;
end
end
% 将隐藏了信息的图像写入新的文件
I(:,:,1) = R;
imwrite(I, 'lena_stego.png');
```
2. LSB信息提取
```matlab
% 加载载入图像
I = imread('lena_stego.png');
% 提取图像的红色通道
R = I(:,:,1);
% 初始化二进制消息字符串
binaryMessage = '';
% 提取每个像素的最低有效位的二进制信息
for i = 1:size(R, 1)
for j = 1:size(R, 2)
binaryPixel = dec2bin(R(i,j), 8);
binaryMessage = strcat(binaryMessage, binaryPixel(8));
end
end
% 将二进制消息转换为文本消息
message = char(bin2dec(reshape(binaryMessage, 8, [])').');
% 输出提取的消息
disp(message);
```
lsb算法matlab代码
LSB算法(Least Significant Bit)是一种简单的信息隐藏算法,主要通过将要隐藏的信息嵌入到像素的最低有效位中,从而不影响人眼对图像的感知。
以下是基于MATLAB实现的LSB算法代码:
```matlab
% 加载图像
image = imread('original_image.jpg');
% 获取图像的尺寸
[m, n, ~] = size(image);
% 将要隐藏的信息
message = 'Hello, LSB algorithm!';
% 转换信息为二进制
binaryMessage = reshape(dec2bin(message, 8).' - '0', 1, []);
% 检查信息长度是否超过图像的容量
if length(binaryMessage) > m * n
error('Information length exceeds image capacity.');
end
% 嵌入信息
counter = 1; % 计数器
for i = 1:m
for j = 1:n
pixel = image(i, j, :);
% 获取像素的RGB值
r = pixel(1);
g = pixel(2);
b = pixel(3);
% 将信息嵌入到最低有效位中
if counter <= length(binaryMessage)
r = bitset(r, 1, binaryMessage(counter));
counter = counter + 1;
end
if counter <= length(binaryMessage)
g = bitset(g, 1, binaryMessage(counter));
counter = counter + 1;
end
if counter <= length(binaryMessage)
b = bitset(b, 1, binaryMessage(counter));
counter = counter + 1;
end
% 更新图像的RGB值
image(i, j, :) = [r, g, b];
end
end
% 保存图像
imwrite(image, 'stego_image.jpg');
% 提取隐藏的信息
extractedMessage = "";
counter = 1; % 计数器
for i = 1:m
for j = 1:n
pixel = image(i, j, :);
% 获取像素的最低有效位
rLSB = bitget(pixel(1), 1);
gLSB = bitget(pixel(2), 1);
bLSB = bitget(pixel(3), 1);
% 将提取的最低有效位组合为信息
if counter <= length(binaryMessage)
extractedMessage = extractedMessage + string(rLSB);
counter = counter + 1;
end
if counter <= length(binaryMessage)
extractedMessage = extractedMessage + string(gLSB);
counter = counter + 1;
end
if counter <= length(binaryMessage)
extractedMessage = extractedMessage + string(bLSB);
counter = counter + 1;
end
% 检查是否提取了足够的信息
if counter > length(binaryMessage)
break;
end
end
% 检查是否提取了足够的信息
if counter > length(binaryMessage)
break;
end
end
% 将二进制信息转换为字符串
extractedMessage = char(bin2dec(reshape(extractedMessage, 8, []).').');
% 显示提取的信息
disp(extractedMessage);
```
此代码实现了利用LSB算法隐藏信息并提取隐藏信息的功能。代码首先加载原始图像,然后将要隐藏的信息进行转换和分割,并逐像素地对图像进行处理,将信息嵌入到像素的最低有效位中。最后,代码保存包含隐藏信息的图像,并提取隐藏的信息,并将提取的信息显示出来。
需要注意的是,为了保证隐藏信息的成功提取,隐藏信息的长度不能超过图像的容量,否则会出现错误。