在matlab中的PSNR图像

时间:2016-11-03 07:07:15

标签: matlab steganography lsb

我对原始图像和加密图像之间的峰值信噪比(PSNR)感到困惑。据我所知,PSNR值越高意味着图像质量越好。我试着测试并计算PSNR值。我在文本隐写术中使用了LSB技术。

  1. 我尝试在图片中嵌入100个字符。结果为69.9696 dB。
  2. 我尝试在图片中嵌入5个字符。结果为68 dB。
  3. 现在,我的想法是:

    • 如果更多字符嵌入图像,产生较少的PSNR值,或者嵌入到图像中的字符较少,会产生较高的PSNR值吗?

    • 更多字符嵌入,意味着对像素进行更多操作。那么,PSNR值会变小吗?

    任何人都可以告诉我或纠正我的错误?

    ------附加编码------

    Str = 'after this, I tried calculate the PSNR value with original image and stego image. 100 character which is read from file is embedded into image, higher PSNR value. 5 character, less PSNR value.';%many character
    %Str = 'a';   %one character 
    
    Str=uint8(Str);    %converting to 8 bit numbers for proper calculation
    fprintf('%d ', Str);
    fprintf('\n');
    stringLength = length(Str);
    
    
    x=imread('lena.bmp');   %reading the image file
    x=uint8(x);                %conversion to 8 bit
    [x_row,x_col]=size(x);
    
    
    numPixelsInImage = numel(x);
    bitsPerLetter = 7;  % For ASCII, this is 7.
    numPixelsNeededForString = stringLength * bitsPerLetter;
    
    binaryAsciiString = dec2bin(Str)'
    whos binaryAsciiString
    binaryAsciiString = binaryAsciiString(:)'
    
     stegoImage = x;
     stegoImage(1:numPixelsInImage) = bitset(stegoImage(1:numPixelsInImage), 1, 0);
     oneIndexes = find(binaryAsciiString == '1'); 
     stegoImage(oneIndexes) = bitset(stegoImage(oneIndexes), 1, 1);
    
    
    
     imwrite(uint8(stegoImage),'stego123.bmp') 
    
    fprintf('\nPSNR: %9.7f dB\n\n', psnr(x,stegoImage));
    

    在此之后,我尝试用原始图像和隐秘图像计算PSNR值。从文件中读取的100个字符嵌入到图像中,PSNR值较高。 5个字符,PSNR值较低。

    这就是为什么我感到困惑。

    ---这是我的PSNR代码---

    function [PSNR,mse]=psnr(X,Y)
    % function [PSNR,mse]=psnr(X,Y)
    % Peak signal to noise ratio of the difference between images and the
    %mean square error
    % If the second input Y is missing then the PSNR and MSE of X itself
    % becomes the output (as if Y=0).
    if nargin<2, D=X;
    else
    if any(size(X)~=size(Y)), error('The input size is not equal to each other!'); end
    D=X-Y;
    end
    mse=sum(D(:).*D(:))/prod(size(X));
    PSNR=10*log10(255^2/mse);
    

    我只是调用PSNR的功能并打印原始图像和隐秘图像的PSNR值。

    lena original bmp

    我嵌入的很多角色,我得到51.1687256分贝。 我嵌入的一个字符,我得到51.1578686 dB。

    可以告诉我原因吗?

1 个答案:

答案 0 :(得分:0)

pnsr功能出错。两个输入都是uint8,它限制0-255范围内的所有值。这可能是D=X-Y的问题。

>> uint8(0) - uint8(1)
0
>> double(0) - double(1)
-1

更改为D = double(X) - double(Y)将为长字母和单字母字符串提供正确的值,分别为51.1576 dB和51.1578 dB。

但是,您的算法不是最理想的。在嵌入位之前,将像素的LSB设置为0。您可以有效地修改最多262144像素,同时您的消息更短。这大大降低了PSNR,并解释了为什么7和1536位长的消息的值非常相似。相反,您应该使用numPixelsNeededForString仅修改嵌入邮件所需的最小像素数。或者更紧凑,

cover = imread('lena512.png');
Str = 'after this, I tried calculate the PSNR value with original image and stego image. 100 character which is read from file is embedded into image, higher PSNR value. 5 character, less PSNR value.';
%Str = Str(1:1);

bits = dec2bin(Str, 7)';
bits = bits(:);

stego = cover;
stego(1:numel(bits)) = bitset(stego(1:numel(bits)), 1, str2num(bits)');

psnr(cover, stego)

如果长字符串的PSNR为73.9530 dB,单字母字符串的PSNR为95.3265 dB。