我对原始图像和加密图像之间的峰值信噪比(PSNR)感到困惑。据我所知,PSNR值越高意味着图像质量越好。我试着测试并计算PSNR值。我在文本隐写术中使用了LSB技术。
现在,我的想法是:
如果更多字符嵌入图像,产生较少的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值。
我嵌入的很多角色,我得到51.1687256分贝。 我嵌入的一个字符,我得到51.1578686 dB。
可以告诉我原因吗?
答案 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。