i am finding an error when i am executing the following code. kindly help me out?

2 次查看(过去 30 天)
error in 91 line.
DWT - SVD Watermarking
function [psnr_values, psnr2dB_values] = dwt_svd()
% clear workspace
clear all;
close all;
clc;
%change directory
folder_name = uigetdir(pwd, 'Select Directory Where the .m Files Reside');
if ( folder_name ~= 0 )
if ( strcmp(pwd, folder_name) == 0 )
cd(folder_name);
end
else
return;
end
% read cover image & watermark logo
[cover_fname, cover_pthname] = ...
uigetfile('*.jpg; *.png; *.tif; *.bmp', 'Select the Cover Image');
if (cover_fname ~= 0)
cover_image = strcat(cover_pthname, cover_fname);
cover_image = double( rgb2gray( imread( cover_image ) ) );
cover_image = imresize(cover_image, [512 512], 'bilinear');
else
return;
end
[watermark_fname, watermark_pthname] = ...
uigetfile('*.jpg; *.png; *.tif; *.bmp', 'Select the Watermark Logo');
if (watermark_fname ~= 0)
watermark_logo = strcat(watermark_pthname, watermark_fname);
watermark_logo = double( im2bw( rgb2gray( imread( watermark_logo ) ) ) );
watermark_logo = imresize(watermark_logo, [512 512], 'bilinear');
else
return;
end
% Set constant variables
numOfKeys = 20;
gaussian_plot = true;
print_figures = false;
if (gaussian_plot == false)
secret_key = 3; % random secret key
watermarked_image = watermark_embedding(cover_image, watermark_logo, ...
secret_key, print_figures);
watermark_extraction(watermarked_image, watermark_logo, secret_key, ...
print_figures, true);
else
% Set function parameters to not print any plots and not to do any
% signature authentication
% print_figures = false;
% Pre-allocate matrices
psnr_values = zeros(1, numOfKeys);
psnr2dB_values = zeros(1, numOfKeys);
decoded_correct = zeros(1, numOfKeys);
decoded_wrong = zeros(1, numOfKeys);
% [m, n] = size(watermark_logo);
% correctWatermarkDiff = zeros(1, m*n);
wrongWatermarkDiff = zeros(1, length(watermark_logo));
for key = 1:numOfKeys
% Embedding with the right key
[watermarked_image, original_signature] = ...
watermark_embedding(cover_image, watermark_logo, key, print_figures);
watermarked_images_dir = strcat(pwd, '\watermarked_images\', num2str(key), '.png');
imwrite(uint8(watermarked_image), watermarked_images_dir, 'png');
% Transform the original watermrak (i.e. the original signature) to
% the interval [-1, 1]
original_signature(find(original_signature == 0)) = -1;
% Measure the degree of distortion of the original and the watermarked
% image using PSNR (dB)
psnr_values(key) = psnr(cover_image, watermarked_image);
psnr2dB_values(key) = pow2db(psnr_values(key));
% Detection with the right key, message_correct is actually the
% watermark_logo because in essence that's what I'm hidding in the
% cover image. Whereas the watermark_correct is actually the signature
% which helps in the detection of false acceptance and false
% rejection
[~, ~, recon_sig_corr, LL4, HH4] = ...
watermark_extraction(watermarked_image, watermark_logo, key, ...
print_figures, true);
% transform the watermark_correct(i.e. the reconstructed_signature)
% and the watermark_wrong(i.e. the wrong reconstructed signature)
% to the interval [-1, 1]
recon_sig_corr(find(recon_sig_corr == 0)) = -1;
LL4 = LL4(:)';
HH4 = HH4(:)';
LL4 = LL4 - mean(LL4);
HH4 = HH4 - mean(HH4);
comb_HH4_LL4 = [LL4 HH4];
% decoded_correct(key) = (abs(comb_HH4_LL4) * recon_sig_corr')/512^2;
% decoded_correct(key) = sum(comb_HH4_LL4 .* recon_sig_corr)/512^2;
% Detection with the wrong key
[~, watermark_wrong, recon_sig_wrng, LL4wr, HH4wr] = ...
watermark_extraction(watermarked_image, watermark_logo, key+11, ...
print_figures, false);
watermark_wrong(find(watermark_wrong == 0)) = -1;
LL4wr = LL4wr(:)';
HH4wr = HH4wr(:)';
LL4wr = LL4wr - mean(LL4wr);
HH4wr = HH4wr - mean(HH4wr);
combwr_HH4_LL4 = [LL4wr HH4wr];
% decoded_wrong(key) = (abs(combwr_HH4_LL4) * watermark_wrong')/512^2;
% decoded_wrong(key) = sum(watermark_wrong .* original_signature)/512;
% Keep track of the correlation between the watermark_correct and
% the watermark_wrong
correlation_correct = corrcoef(comb_HH4_LL4, recon_sig_corr);
decoded_correct(key) = correlation_correct(2, 1);
correlation_wrong = corrcoef(combwr_HH4_LL4, watermark_wrong);
decoded_wrong(key) = correlation_wrong(2, 1);
% Calculate the difference between the correct extracted watermarks and
% the original watermark and the wrong extracted watermarks and the orignal
% correctKeyWatermarkDiff(key, :) = watermark_wrong - original_signature;
wrongWatermarkDiff(key, :) = watermark_wrong - original_signature;
clear('watermark_correct', 'comb_HH4_LL4', 'watermark_wrong', ...
'combwr_HH4_LL4', 'original_signature', ...
'LL4', 'HH4', 'LL4wr', 'HH4wr');
% Clear workspace
clear('watermark_logo_row', 'watermark_logo_extracted_correct', ...
'watermark_logo_extracted_wrong', 'watermarked_image', ...
'watermark_correct', 'watermark_wrong', 'message_correct', ...
'message_wrong', 'watermarked_image');
end
meanOfDecodCorr = mean(decoded_correct);
stdOfDecodCorr = std(decoded_correct);
meanOfDecodWrng = mean(decoded_wrong);
stdOfDecodWrng = std(decoded_wrong);
gaussians(meanOfDecodCorr, stdOfDecodCorr, meanOfDecodWrng, stdOfDecodWrng);
[Pfa, Pfr] = PfaPfr(meanOfDecodCorr, stdOfDecodCorr, meanOfDecodWrng, stdOfDecodWrng, numOfKeys);
% Measure bit error rate, and plot against threshold T of pfa,
% where T = pfa/pfr. Or equivalently plot BER & E versus pfa
BER = BitErrorRate(wrongWatermarkDiff);
end
end

采纳的回答

Jan
Jan 2016-4-22
编辑:Jan 2016-4-22
Please read the message. It tells you the exact line (while we can only guess which is the line 91) and even the character, which is the problem: There is a parenthesis, brace or bracket, which is closed before another one was opened. I assume, this problem should be easy to fix.
Perhaps this is the offending line:
[~, ~, recon_sig_corr, LL4, HH4] = ...
If you use an older Matlab version <=R2009a, the "~" are not allowed. Replace this by:
[dummy, dummy, recon_sig_corr, LL4, HH4] = ...
If this is the problem, if appears in the line "[~, watermark_wrong, recon_sig_wrng, LL4wr, HH4wr] = ..." also.
PS. A clear all on the top of a function is a waste of time, energy and power. There is simply no reason for a brutal clearing of an empty workspace.
  4 个评论
chaitanya g p
chaitanya g p 2016-4-22
??? Undefined function or method 'decimalToBinaryVector' for input arguments of type 'double'.
Error in ==> signature_embedding at 51 binary_coefficients{p} = decimalToBinaryVector(integer_part(p), 16);
if true
%%Signature embedding algorithm
function LL_inv = signature_embedding(LL, signature, print_figures)
% 1. Using Haar wavelet, further decompose LL band to the 4th level.
[LL_1, HL_1, LH_1, HH_1] = dwt2(LL, 'haar'); % 1st step DWT
[LL_2, HL_2, LH_2, HH_2] = dwt2(LL_1, 'haar'); % 2nd step DWT
[LL_3, HL_3, LH_3, HH_3] = dwt2(LL_2, 'haar'); % 3rd step DWT
[LL_4, HL_4, LH_4, HH_4] = dwt2(LL_3, 'haar'); % 4rth step DWT
if (print_figures == true)
% Images coding.
cod_cA = wcodemat(LL_4);
cod_cH = wcodemat(HL_4);
cod_cV = wcodemat(LH_4);
cod_cD = wcodemat(HH_4);
dec2dim = [cod_cA, cod_cH; cod_cV, cod_cD];
% Plot 4-th step decomposition
figure;
image(dec2dim);
title('4-th step DWT decomposition');
clear('dec2dim', 'cod_cA', 'cod_cH', 'cod_cV', 'cod_cD');
end
% 1. choose all in total 512 coefficients from LL_4 & HH_4
% reshape them to row vectors of size 1x256
LL_4 = reshape(LL_4, 1, length(LL_4)^2);
HH_4 = reshape(HH_4, 1, length(HH_4)^2);
% concatenate the above row vectors into a larger row vector of size 1x512
combined_LL4_and_HH4_coef = [LL_4 HH_4];
% keep record of the index position of negatives to put back the sign in
% inverse process
negative_idxs = combined_LL4_and_HH4_coef(logical(combined_LL4_and_HH4_coef)) < 0;
% keep only the positive integer parts
% combined_LL4_and_HH4_coeff_posint = round( abs( combined_LL4_and_HH4_coef ) );
% separate the integer from the decimal fraction
combined_LL4_and_HH4_coeff_pos = abs(combined_LL4_and_HH4_coef);
integer_part = fix(combined_LL4_and_HH4_coeff_pos);
fraction_part = abs(combined_LL4_and_HH4_coeff_pos - integer_part);
% Convert the integer part into the binary code of L=16 bits.
binary_coefficients = {};
for p = 1:length(integer_part)
% binary_coefficients{p} = bitget( uint16( integer_part(p) ), 16:-1:1 );
binary_coefficients{p} = decimalToBinaryVector(integer_part(p), 16);
end
% 2. Replace the n-th bit (10th bit) position of the coefficient with
% signature bit
for m = 1:length(signature)
for n = 1:16
if (n == 10)
binary_coefficients{1, m}(n) = signature(m);
end
end
end
% and then convert the binary code to its decimal representation
bin2decimal = zeros(1, length(binary_coefficients));
for x = 1:length(binary_coefficients)
bin2decimal(x) = binaryVectorToDecimal(double(binary_coefficients{1, x}));
end
% reconstruct orignal array from integer and decimal fraction parts
% cmb_coef = integer_part + fraction_part;
bin2decimal = bin2decimal + fraction_part;
% put back the negative signs
bin2decimal(find(negative_idxs == 1)) = - bin2decimal(find(negative_idxs == 1));
% Clear workspace
clear('LL_1', 'LL_2', 'LL_3', 'LL_4', 'HH_4', 'combined_LL4_and_HH4_coef',...
'negative_idxs', 'combined_LL4_and_HH4_coeff_pos', 'integer_part',...
'fraction_part', 'binary_coefficients', 'signature');
% reshape the modified LL_4 & HH_4 sub-bands to their original size 16x16
% each
LL_4_modified = bin2decimal(1:256);
HH_4_modified = bin2decimal(257:end);
LL_4_modified = reshape(LL_4_modified, 16, 16);
HH_4_modified = reshape(HH_4_modified, 16, 16);
% Clear workspace
clear('bin2decimal');
% 3. Apply the inverse DWT with modified LL4 and HH4 band coefficients.
LL_3_inv = idwt2(LL_4_modified, HL_4, LH_4, HH_4_modified, 'haar');
LL_2_inv = idwt2(LL_3_inv, HL_3, LH_3, HH_3, 'haar');
LL_1_inv = idwt2(LL_2_inv, HL_2, LH_2, HH_2, 'haar');
LL_inv = idwt2(LL_1_inv, HL_1, LH_1, HH_1, 'haar');
% Clear workspace
clear('LL_1_inv', 'LL_2_inv', 'LL_3_inv', 'LL_4_modified', ...
'HL_1', 'HL_2', 'HL_3', 'HL_4', ...
'LH_1', 'LH_2', 'LH_3', 'LH_4', ...
'HH_1', 'HH_2', 'HH_3', 'HH_4_modified');
end
end
binary_coefficients{p} = decimalToBinaryVector(integer_part(p), 16); error here
Jan
Jan 2016-4-22
编辑:Jan 2016-4-22
The error "??? Undefined function or method 'decimalToBinaryVector'" means, that you do not have this function in your Matlab path. When such a message appears, asking an internet search engine is a good idea. This reveals, that this function belongs to the Data Acquisition Toolbox: http://www.mathworks.com/help/daq/ref/decimaltobinaryvector.html . Do you have this toolbox? You can write this function by your own easily. Look at dec2bin and omit the final conversion to a char.

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Discrete Multiresolution Analysis 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by