2016-11-03 6 views
0

元の画像と暗号化された画像との間のピーク信号対ノイズ比(PSNR)と混同しています。私が知っているように、PSNR値が高いほど画質が良いことを意味します。私はPSNR値をテストして計算しようとしました。私はテキストステガノグラフィーでLSB技術を使用しました。matlabの画像のPSNR

  1. 私は100文字を画像に埋め込みました。結果は69.9696 dBです。
  2. イメージに5文字を埋め込みました。それは68dBとなる。私は私の心の中で何を考えて今

、次のとおりです。

  • は、複数の文字画像に埋め込むべき、あまり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)); 

、Iは原画像とステゴ画像とPSNR値を計算しようとしました。ファイルから読み込まれた100文字がイメージに埋め込まれ、高いPSNR値。 PSNR値が5文字未満です。

だからこそ、私は混乱する。

---ここに私の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デシベルを取得します。 私が埋め込んだ1文字は、51.1578686 dBです。

理由を教えてください。

+0

定量的尺度の問題は、PSNRのような測定基準によって画定される画質と、画質がどのように認識されるかが全く異なる2つのことです。これは主観的であり、それは人によって異なりますので、イメージ品質を評価するために定量的なメトリクスに頼るべきではありません。 – rayryeng

+0

はい私は知っているが、PSNR値は画質をチェックするための測定値の1つです。私はちょうどより多くのキャラクターが画像に埋め込まれ、より高いPSNRを生成するかどうかチェックしたいですか?小さい文字と比較すると画像に埋め込まれます。 – kenreal

+0

はい、私はPSNRがより多くの文字がエンコードされると低くなると思います。より具体的な回答が必要な場合は、観察している効果を示す小さなサンプルコードを投稿する必要があります。 – Tokkot

答えて

0

pnsr機能にエラーがあります。両方の入力はuint8で、0〜255の範囲のすべての値が制限されます。これはD=X-Yの問題です。

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

D = double(X) - double(Y)に変更すると、長いと1文字の文字列を、それぞれ51.1576デシベルと51.1578デシベルのためにあなたに正しい値が得られます。

ただし、アルゴリズムが最適ではありません。あなたのビットを埋め込む前に、の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) 

は、1文字の文字列の長い文字列と95.3265デシベルのためにあなたの73.9530デシベルのPSNRを与えるだろう。