MATLAB编程:原始载体图片和秘密图像为灰度图的bmp图像,将秘密图像隐写到原始载体图像内,编写函数PSNR,计算LSB隐写算法中含密图像和载体图像的峰值信噪比PSNR
时间: 2024-02-23 10:58:33 浏览: 91
好的,这是一个图像隐写的问题,需要用到MATLAB编程。
首先,我们需要读入原始载体图片和秘密图像,并将其转换为灰度图。可以使用MATLAB自带的`imread`函数和`rgb2gray`函数实现:
```matlab
carrier = imread('carrier.bmp'); % 读入原始载体图片
secret = imread('secret.bmp'); % 读入秘密图像
carrier_gray = rgb2gray(carrier); % 转换为灰度图
secret_gray = rgb2gray(secret); % 转换为灰度图
```
接下来,我们需要进行隐写操作。这里采用最简单的LSB隐写算法,即将秘密图像的每个像素的最低位替换为原始载体图片的对应像素的最低位。可以使用MATLAB的逐元素运算实现:
```matlab
carrier_stego = bitset(carrier_gray, 1, bitget(secret_gray, 1)); % LSB隐写
```
其中,`bitset`函数可以将某个整数的指定位设置为指定的值,`bitget`函数可以获取某个整数的指定位的值。
最后,我们可以计算含密图像和载体图像的PSNR。PSNR的计算公式如下:
$$
\text{PSNR} = 10 \log_{10} \frac{L^2}{\text{MSE}}
$$
其中,$L$为像素值的最大值(在灰度图中通常为255),$\text{MSE}$为均方误差,可以使用MATLAB的`immse`函数计算:
```matlab
mse = immse(carrier_gray, carrier_stego); % 计算均方误差
psnr = 10 * log10(255^2 / mse); % 计算PSNR
```
最终的完整代码如下:
```matlab
carrier = imread('carrier.bmp'); % 读入原始载体图片
secret = imread('secret.bmp'); % 读入秘密图像
carrier_gray = rgb2gray(carrier); % 转换为灰度图
secret_gray = rgb2gray(secret); % 转换为灰度图
carrier_stego = bitset(carrier_gray, 1, bitget(secret_gray, 1)); % LSB隐写
mse = immse(carrier_gray, carrier_stego); % 计算均方误差
psnr = 10 * log10(255^2 / mse); % 计算PSNR
disp(['PSNR = ' num2str(psnr) ' dB']); % 显示结果
```
阅读全文