Source code for pysteg.features.wam
#! /usr/bin/env python
## $Id$
## -*- coding: utf-8 -*-
"""
The WAM features. Only WAM based on NxN LAW-ML is provided.
An implementation of the original WAM features of Fridrich et al.
can be found in pysteg.analysis.wfeatures.
This module follows the sample code provided in my book.
:Module: pysteg.features.wam
:Date: $Date$
:Revision: $Revision$
:Copyright: (C) 2012: Hans Georg Schaathun <georg@schaathun.net>
"""
print "[pysteg.features.wam] $Id$"
# *****************************
# pysteg.features.wam
# *****************************
#
# .. module:: pysteg.features.wam
#
import pywt
import numpy as np
[docs]def wam9(C,N=3,nmom=9):
"Calculate 9 WAM features from the wavelet component C."
M0 = C - lawmlN(C,N)
R = np.mean(M0)
M = M0.flatten().astype(float) - R
return [R] + [ np.sum(M**k)/M.size for k in range(2,nmom+1) ]
[docs]def wamNxN(I,N=3,nmom=9):
"Calculate the WAM(N)-27 from the pixmap array I."
if I == None: return wamNxNnames(N,nmom)
(L,H) = pywt.dwt2(I,"db4")
return reduce( list.__add__, [ wam9(C,N,nmom) for C in H ] )
[docs]def subm(X,N,i,j):
"Return an NxN submatrix of X, centered at element (i,j)."
N /= 2
(m0,m1) = X.shape
(i0,j0) = (max(0,i-N), max(0,j-N))
(i1,j1) = (min(m0,i+N)+1, min(m1,j+N)+1)
return X[i0:i1,j0:j1]
[docs]def lawmlN(X,N=3,sig0=0.5):
"Return the denoised image using NxN LAW-ML."
(m0,m1) = X.shape
S = np.zeros((m0,m1))
for x in xrange(m0):
for y in xrange(m1):
sub = subm(X,N,x,y)
S[x,y] = max(0, np.var(sub) - sig0 )
return X*S/(S+sig0)
[docs]def wamNxNnames(N=3,nmom=9):
return [ "WAM%sx%s(%s%s)" % (N,N,d,i+1) for d in ("H","V","D")
for i in range(nmom) ]
if __name__ == "__main__":
print wamNxNnames()