2016-11-03 23 views
0

Я путаюсь с пиковым отношением сигнал/шум (PSNR) между исходным изображением и зашифрованным изображением. Как я знаю, более высокое значение PSNR означает лучшее качество изображения. Я попытался проверить и рассчитать значение PSNR. Я использовал технику LSB в текстовой стеганографии.PSNR изображения в matlab

  1. Я попытался вставить 100 символов в изображение. Это приводит к 69,9696 дБ.
  2. Я попытался вставить 5 символов в изображение. Это приводит к 68 дБ.

Теперь, что я думаю, что в моей голове есть:

  • Если более символов встроить в изображение, производят меньшее значение PSNR, или меньше символов встраивать в изображения, производить высокое значение PSNR?

  • Больше символов вставлять, значит больше манипуляции с пикселем. Значит, значение PSNR становится меньше?

Кто-нибудь может мне сказать или исправить ошибку?

------ Прикрепленный Coding ------

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 с исходным изображением и Stego изображения. 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 исходного изображения и Stego изображения.

lena original bmp

многочисленных символов я вставлять, я получаю 51.1687256 дБ. Один символ, который я вставляю, я получаю 51.1578686 дБ.

Можете сказать, почему?

+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 дБ и 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) 

Это даст вам PSNR от 73.9530 дБ для длинной строки и 95.3265 дБ для 1-буквенной струны.