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()