Continue to Site

Eng-Tips is the largest engineering community on the Internet

Intelligent Work Forums for Engineering Professionals

  • Congratulations waross on being selected by the Eng-Tips community for having the most helpful posts in the forums last week. Way to Go!

matlabPyrTools Consultation

Status
Not open for further replies.

sisnarf

Computer
Mar 10, 2007
1
The codes at the last part of this post part of steg.m, I got this from (Matlab routines link), I also obtained the required matlabPyrTools folder from ftp://ftp.cis.upenn.edu/pub/eero/matlabPyrTools.tar.gz and extracted it to my 'd:\matlab7\work' folder. Then I added the 'matlab7\work' and 'matlab7\work\matlabPyrTools' and 'matlab7\work\matlabPyrTools\MEX' folder to my classpath. I've already run the program, editing its first line to read a specific image because there were no lines to read the image:

im = imread('d:\sisnarf\ako.jpg')

But I still get numerous warnings and errors. These are the errors I am encountering:

ERROR: You should compile the MEX version of "corrDn.c",
found in the MEX subdirectory of matlabPyrTools, and put it in your matlab path. It is MUCH faster, and provides more boundary-handling options.




----------------------------------------------

Here is my modified program.

%%% Detecting Steganographic Messages in Digital Images
%%% H. Farid
%%%
%%% Technical Report, TR2001-412, Dartmouth College, Computer Science
%%% (%%%
%%% Copyright (c), 2000, Trustees of Dartmouth College (Institute for
%%% Security Technology Studies). All rights reserved.

%%% ----------------------------------------------------------------------

%%% PART I: COLLECT WAVELET STATISTICS
%%% PART II: CLASSIFIER - TRAINING
%%% PART III: CLASSIFIER - TESTING

%%% ----------------------------------------------------------------------
%%%
%%% PART I: COLLECT WAVELET STATISTICS
%%% You will need the matlabPyrTools by E.P. Simoncelli
%%% ftp://ftp.cis.upenn.edu/pub/eero/matlabPyrTools.tar.gz
%%%
%%% Given an image (im) the code below will construct the wavelet
%%% coefficient feature vector.
%%%

%the following line is my newly added line to read a %specific image. This is the only line i've added so far
im = imread('d:\sisnarf\ako.jpg');

%%% BUILD WAVELET PYRAMID
[pyr,ind] = buildWpyr(im,4);

%%% COLLECT STATISTICS FROM SUB-BANDS
for k = 1 : 3

[lev,sz] = wpyrLev(pyr,ind,k); % LEVEL K
dim1v = sz(1,1)*sz(1,2);
dim1h = sz(2,1)*sz(2,2);
dim1d = sz(3,1)*sz(3,2);
sb1v = reshape( lev(1:dim1v), sz(1,1), sz(1,2) );
sb1h = reshape( lev(dim1v+1:dim1v+dim1h), sz(2,1), sz(2,2) );
sb1d = reshape( lev(dim1v+dim1h+1:dim1v+dim1h+dim1d), sz(3,1), sz(3,2) );

[lev,sz] = wpyrLev(pyr,ind,k+1); % LEVEL K+1
dim2v = sz(1,1)*sz(1,2);
dim2h = sz(2,1)*sz(2,2);
dim2d = sz(3,1)*sz(3,2);
sb2v = reshape( lev(1:dim2v), sz(1,1), sz(1,2) );
sb2h = reshape( lev(dim2v+1:dim2v+dim2h), sz(2,1), sz(2,2) );
sb2d = reshape( lev(dim2v+dim2h+1:dim2v+dim2h+dim2d), sz(3,1), sz(3,2) );

c = 1;
[ydim,xdim] = size(sb1v);
vert = zeros( (xdim-2)*(ydim-2), 8 );
horiz = zeros( (xdim-2)*(ydim-2), 8 );
diag = zeros( (xdim-2)*(ydim-2), 8 );
xlim = [2:xdim-1];
ylim = [2:ydim-1];
dim = length(vert);

vert:),1) = reshape( sb1v(ylim,xlim), dim, 1 );
vert:),2) = reshape( sb1v(ylim-1,xlim), dim, 1 );
vert:),3) = reshape( sb1v(ylim,xlim-1), dim, 1 );
vert:),4) = reshape( sb2v(round(ylim/2), round(xlim/2)), dim, 1 );
vert:),5) = reshape( sb1d(ylim,xlim), dim, 1 );
vert:),6) = reshape( sb2d(round(ylim/2), round(xlim/2)), dim, 1 );
vert:),7) = reshape( sb1v(ylim+1,xlim), dim, 1 );
vert:),8) = reshape( sb1v(ylim,xlim+1), dim, 1 );

horiz:),1) = reshape( sb1h(ylim,xlim), dim, 1 );
horiz:),2) = reshape( sb1h(ylim-1,xlim), dim, 1 );
horiz:),3) = reshape( sb1h(ylim,xlim-1), dim, 1 );
horiz:),4) = reshape( sb2h(round(ylim/2), round(xlim/2)), dim, 1 );
horiz:),5) = reshape( sb1d(ylim,xlim), dim, 1 );
horiz:),6) = reshape( sb2d(round(ylim/2), round(xlim/2)), dim, 1 );
horiz:),7) = reshape( sb1h(ylim+1,xlim), dim, 1 );
horiz:),8) = reshape( sb1h(ylim,xlim+1), dim, 1 );

diag:),1) = reshape( sb1d(ylim,xlim), dim, 1 );
diag:),2) = reshape( sb1d(ylim-1,xlim), dim, 1 );
diag:),3) = reshape( sb1d(ylim,xlim-1), dim, 1 );
diag:),4) = reshape( sb2d(round(ylim/2), round(xlim/2)), dim, 1 );
diag:),5) = reshape( sb1h(ylim,xlim), dim, 1 );
diag:),6) = reshape( sb1v(ylim,xlim), dim, 1 );
diag:),7) = reshape( sb1d(ylim+1,xlim), dim, 1 );
diag:),8) = reshape( sb1d(ylim,xlim+1), dim, 1 );

% COEFFICENT STATISTICS
V = vert:),1);
H = horiz:),1);
D = diag:),1);
M1 = [mean(V) mean(H) mean(D)];
M2 = [var(V) var(H) var(D)];
M3 = [kurtosis(V) kurtosis(H) kurtosis(D)];
M4 = [skewness(V) skewness(H) skewness(D)];

%%% LINEAR PREDICTOR OF COEFFICIENT MAGNITUDE
V = abs(V);
nzind = find( V>=1 );
V = V(nzind);
Qv = abs(vert(nzind,[2:8]));
v:),k) = inv(Qv'*Qv) * Qv' * V;

H = abs(H);
nzind = find( H>=1 );
H = H(nzind);
Qh = abs(horiz(nzind,[2:8]));
h:),k) = inv(Qh'*Qh) * Qh' * H;

D = abs(D);
nzind = find( D>=1 );
D = D(nzind);
Qd = abs(diag(nzind,[2:8]));
d:),k) = inv(Qd'*Qd) * Qd' * D;

%%% DIFFERENCE BETWEEN ACTUAL AND PREDICTED COEFFICIENTS
Vp = Qv * v:),k);
Hp = Qh * h:),k);
Dp = Qd * d:),k);
Ev = (log2(V) - log2(abs(Vp)));
Eh = (log2(H) - log2(abs(Hp)));
Ed = (log2(D) - log2(abs(Dp)));

M5 = [mean(Ev) mean(Eh) mean(Ed)];
M6 = [var(Ev) var(Eh) var(Ed)];
M7 = [kurtosis(Ev) kurtosis(Eh) kurtosis(Ed)];
M8 = [skewness(Ev) skewness(Eh) skewness(Ed)];

fprintf( '%.3f ', M1, M2, M3, M4 );
fprintf( '%.3f ', M5, M6, M7, M8 );
end
fprintf( '\n' );

%%% ----------------------------------------------------------------------
%%%
%%% PART II: CLASSIFIER - TRAINING
%%%
%%% Let 'a' be a matrix whose rows contain "no-steg" image
%%% feature vectors. Let 'b' be a matrix whose rows contain
%%% "steg" image feature vectors. Compute FLD discriminator.
%%%

%%% FISHER LINEAR DISCRIMINANT FOR TWO CLASSES
N = size(a,2);
numImA = size(a,1);
numImB = size(b,1);

%%% ALL SAMPLE MEAN
mu = mean( [a ; b] );

%%% CLASS MEAN
mu1 = mean( a );
mu2 = mean( b );

%%% VARIANCE MATRICES
Sb = size(a,1)*((mu1-mu)'*(mu1-mu)) + size(b,1)*((mu2-mu)'*(mu2-mu));
clear M1 M2;
for k = 1 : N
M1(k,:) = a:),k)' - mu1(k);
M2(k,:) = b:),k)' - mu2(k);
end
Sw = M1 * M1' + M2 * M2';

%%% EIGEN-DECOMPOSITION
[vec,val] = eig( Sb, Sw );
[maxval,ind] = max(diag(real(val)));
e = real( vec:),ind) );

%%% PROJECT TRAINING ONTO MAXIMAL EIGENVALUE-EIGENVECTOR
projA = (a * e)';
muA = mean( projA ); sigA = std( projA );
projB = (b * e)';
muB = mean( projB ); sigB = std( projB );

%%% COMPUTE THRESHOLD
t0 = 1.01*min([projA projB]);
t1 = 1.01*max([projA projB]) + eps;
meanprojA = mean(projA);
meanprojB = mean(projB);

c = 1;
for thresh = t0 : (t1-t0)/250 : t1 %%% SEE BELOW TO MATCH SAMPLING DENSITY
if( meanprojA < meanprojB )
inda = find( projA<=thresh );
indb = find( projB>thresh );
else
inda = find( projA>=thresh );
indb = find( projB<thresh );
end

f(c,1) = 100 * length(inda)/length(projA);
f(c,2) = 100 * length(indb)/length(projB);
c = c + 1;
end

[minval,minind] = min( abs(99-f:),1)) ); %%% 1\% FALSE-POSITIVE RATE
thresh = t0 : (t1-t0)/250 : t1; %%% SEE ABOVE TO MATCH SAMPLING DENSITY
T = thresh( minind ); %%% TRESHOLD FOR DISCRIMINATION
%%% USED WITH FLD AXIS 'e'

%%% ----------------------------------------------------------------------
%%%
%%% PART III: CLASSIFIER - TESTING
%%%
%%% Let 'a2' be a matrix whose rows contain "no-steg" image
%%% feature vectors. Let 'b2' be a matrix whose rows contain
%%% "steg" image feature vectors.
%%%

projA2 = (a2 * e)'; %%% PROJECT ONTO FLD AXIS
projB2 = (b2 * e)';

c = 0;
right = 0;
wrong = 0;
for k = 1 : length(projA2) %%% COMPUTE PREDICTION ACCURACY (NO STEG IMAGES)
c = c + 1;
if( meanprojA < meanprojB )
if( projA2(k)<=T )
right = right + 1;
else
wrong = wrong + 1;
end
else
if( projA2(k)>T )
right = right + 1;
else
wrong = wrong + 1;
end
end
end
fprintf( 'no steg: right=%.2f wrong=%.2f\n', 100*right/c, 100*wrong/c );

c = 0;
right = 0;
wrong = 0;
for k = 1 : length(projB2) %%% COMPUTE PREDICTION ACCURACY (STEG IMAGES)
c = c + 1;
if( meanprojA < meanprojB )
if( projB2(k)>=T )
right = right + 1;
else
wrong = wrong + 1;
end
else
if( projB2(k)<T )
right = right + 1;
else
wrong = wrong + 1;
end
end
end
fprintf( 'steg: right=%.2f wrong=%.2f\n', 100*right/c, 100*wrong/c );
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor