2016-11-03 10 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)); 

이 후, 원래의 이미지와 stego 화상과 PSNR 값을 계산하려고. 파일에서 읽은 100 문자가 이미지에 삽입되어 더 높은 PSNR 값을 갖습니다. PSNR 값이 5 자 미만입니다.

그래서 나는 혼란스러워합니다.

은 --- 여기

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의 함수를 호출하고 원래의 이미지와 stego 이미지의 PSNR 값을 인쇄 --- 내 PSNR 코드입니다.

lena original bmp

내가 포함 많은 캐릭터, 나는 51.1687256 dB를 얻을. 내가 삽입 한 한 문자는 51.1578686 dB입니다.

이유를 말해 줄 수 있습니까?

+0

정량적 측정의 문제점은 PSNR과 같은 측정 항목으로 정의 된 이미지 품질과 이미지 품질을 인식하는 방식이 완전히 다른 두 가지 점입니다. 주관적이며 개인에 따라 이미지 품질을 평가하기 위해 일반적으로 양적 측정 기준에 의존하지 않아야합니다. – rayryeng

+0

예. PSNR 값은 이미지 품질을 확인하는 측정 값 중 하나라는 것을 알고 있습니다. 더 많은 캐릭터가 이미지에 삽입되어 더 높은 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 dB 및 51.1578 dB 당신에게 올바른 값을 제공 할 것입니다.

그러나 알고리즘이 차선입니다. 비트를 삽입하기 전에 의 LSB를 모두 픽셀로 설정하십시오. 메시지가 훨씬 짧은 동안 최대 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 dB 당신에게 73.9530 dB의 PSNR을 줄 것이다.