#!/bin/sh
#
# Construct a complete set of codebook sequences adapted to vector quantization of image wavelet transform

usage() {
    echo "megawave_fwlbg_adap [-h] [-b1 BiFilt1] [-b2 BiFilt2] [-o OrthoFilt] [-e EdgeFilt] codebook trainimage1 [trainimage2 [trainimage3 [trainimage4]]]"
    echo "input:  the images to be used for the training sets"
    echo "	  of vectors, the wavelet filters"
    echo "output: the codebook sequences"
}

if [ $# -le 1 ]; then
    usage
    exit
fi

SHARE=/usr/share/megawave
DATA=$SHARE/data

# Number of level for wavelet transform
NLEVEL=4
NLEVELOPT="-r 4"

# Generate sequence of codebooks
MULTICB="-M"

# Take overlapping blocks in training images
OVERLAP="-l"

# Default wavelet filters
WAVELETFILTER="wave/biortho/h/sd07.ir"
WAVELETFILTER2="wave/biortho/htilde/sd09.ir"
WAVELETOPT="-b wave/biortho/htilde/sd09.ir"
WAVELETEDGEFILTER="no filter"

# Sizes of codebooks
SIZE1="-s 1024"
SIZE1Q="-s 1024"
SIZE1QR="-s 1024"
SIZE2="-t 1024"
SIZE2Q="-s 1024"
SIZE2QR="-s 1024"
SIZE3="-u 4096"
SIZE3Q="-s 4096"
SIZERES="-s 4096"
SIZERESQ="-s 4096"
SIZERESQR="-s 4096"

# Energy thresholds for classified vq
THRESHOLD="-S 3.0 -T 1.0"

# Training images
TRAINIMG2=""
TRAINIMG3=""
TRAINIMG4=""

while [ "$1" != "" ]; do
    case "$1" in
        # Help
	-h)
	    usage
	    exit
	    ;;

        # Number of levels 
	-r)
	    shift
	    NLEVEL="-r $1"
	    shift
	    ;;

        # Use customized wavelet filters
	-b1)
            shift
	    WAVELETFILTER="$1"
	    shift
	    ;;
	
	-b2)
            shift
	    WAVELETOPT="-b $1"
	    WAVELETFILTER2="$1"
	    shift
	    ;;

	-o)
            shift
	    WAVELETFILTER="$1"
	    WAVELETFILTER2=""
	    shift
	    ;;

	-e)
            shift
	    WAVELETOPT="-e $1"
	    WAVELETEDGEFILTER="$1"
	    shift
	    ;;

        # Prefix of codebooks
	[!-]*)
	    PREFCODEBOOK=$1
	    CODEBOOK=${PREFCODEBOOK}.cb
	    CODEBOOKX=${PREFCODEBOOK}_x.cb
	    CODEBOOKY=${PREFCODEBOOK}_y.cb
	    CODEBOOKQ=${PREFCODEBOOK}_q.cb
	    CODEBOOKQR=${PREFCODEBOOK}_qr.cb
	    CODEBOOKXQ=${PREFCODEBOOK}_xq.cb
	    CODEBOOKXQR=${PREFCODEBOOK}_xqr.cb
	    CODEBOOKYQ=${PREFCODEBOOK}_yq.cb
	    INFO=info_${PREFCODEBOOK}
	    shift
	    
            # Input training images
	    if  [ "$1" = "" ]; then
		echo "Need at least one training image!"
		exit 0
	    fi
	    TRAINIMG1=$1
	    shift
	    if  [ "$1" != "" ]; then
		TRAINIMG2="-A $1"
		shift
		if  [ "$1" != "" ]; then
		    TRAINIMG3="-B $1"
		    shift
		    if  [ "$1" != "" ]; then
			TRAINIMG4="-C $1"
		    fi
		fi
	    fi
	    break
	    ;;
	
        # Error
	*)
	    echo "Unrecognized option $1"
	    exit 1
	    ;;
    esac
done

# Check that wavelet filters are available
if [ ! -f $WAVELETFILTER ]; then
    echo "Cannot find $WAVELETFILTER in MegaWave data directories."
    exit 1
fi
if [ "$WAVELETEDGEFILTER" = "no filter" ]; then
    if [ "$WAVELETFILTER2" != "" ]; then
	if [ ! -f $WAVELETFILTER2 ]; then
	    echo "Cannot find $WAVELETFILTER2 in MegaWave data directories."
	    exit 1
	fi
    fi
else
    if [ ! -f $WAVELETEDGEFILTER ]; then
	echo "Cannot find $WAVELETEDGEFILTER in MegaWave data directories!"
	exit 1
    fi
fi

# Codebooks for first stage quantization 
megawave fwlbg_adap $NLEVELOPT -q 1 -w 4 -h 4 -b $WAVELETFILTER2 $MULTICB $OVERLAP $SIZE1 $SIZE2 $SIZE3 $THRESHOLD -x $CODEBOOKX -y $CODEBOOKY $TRAINIMG2 $TRAINIMG3 $TRAINIMG4 $TRAINIMG1 $WAVELETFILTER $CODEBOOK >> $INFO

if [ $NLEVEL -ge 2 ]; then
    megawave fwlbg_adap $NLEVELOPT -q 2 -w 4 -h 4 -b $WAVELETFILTER2 $MULTICB $OVERLAP $SIZE1 $SIZE2 $SIZE3 $THRESHOLD -x $CODEBOOKX -y $CODEBOOKY -O $CODEBOOK -X $CODEBOOKX -Y $CODEBOOKy $TRAINIMG2 $TRAINIMG3 $TRAINIMG4 $TRAINIMG1 $WAVELETFILTER $CODEBOOK >> $INFO
    
    if [ $NLEVEL -ge 3 ]; then
	megawave fwlbg_adap $NLEVELOPT -q 3 -b $WAVELETFILTER2 $MULTICB $OVERLAP $SIZE1 $SIZE2 $SIZE3 $THRESHOLD -x $CODEBOOKX -y $CODEBOOKY -O $CODEBOOK -X $CODEBOOKX -Y $CODEBOOKY $TRAINIMG2 $TRAINIMG3 $TRAINIMG4 $TRAINIMG1 $WAVELETFILTER $CODEBOOK >> $INFO
	megawave fwlbg_adap $NLEVELOPT -q 3 -o 0 -b $WAVELETFILTER2 $MULTICB $OVERLAP $SIZERES -O $CODEBOOK $TRAINIMG2 $TRAINIMG3 $TRAINIMG4 $TRAINIMG1 $WAVELETFILTER $CODEBOOK >> $INFO
	
	if [ $NLEVEL -ge 4 ]; then
	    megawave fwlbg_adap $NLEVELOPT -q 4 -b $WAVELETFILTER2 $MULTICB $OVERLAP $SIZE1 $SIZE2 $SIZE3 $THRESHOLD -x $CODEBOOKX -y $CODEBOOKY -O $CODEBOOK -X $CODEBOOKX -Y $CODEBOOKY $TRAINIMG2 $TRAINIMG3 $TRAINIMG4 $TRAINIMG1 $WAVELETFILTER $CODEBOOK >> $INFO
	    megawave fwlbg_adap $NLEVELOPT -q 4 -o 0 -b $WAVELETFILTER2 $MULTICB $OVERLAP $SIZERES -O $CODEBOOK $TRAINIMG2 $TRAINIMG3 $TRAINIMG4 $TRAINIMG1 $WAVELETFILTER $CODEBOOK >> $INFO
	fi
    fi
fi

# CODEBOOKs for second stage quantization after quantization with $CODEBOOK

megawave fwlbg_adap $NLEVELOPT -q 1 -w 4 -h 4 -b $WAVELETFILTER2 $MULTICB $OVERLAP $SIZE1Q -Q $CODEBOOK $TRAINIMG2 $TRAINIMG3 $TRAINIMG4 $TRAINIMG1 $WAVELETFILTER $CODEBOOKQ >> $INFO

if [ $NLEVEL -ge 2 ]; then
  megawave fwlbg_adap $NLEVELOPT -q 2 -w 4 -h 4 -b $WAVELETFILTER2 $MULTICB $OVERLAP $SIZE1Q -Q $CODEBOOK -O $CODEBOOKQ $TRAINIMG2 $TRAINIMG3 $TRAINIMG4 $TRAINIMG1 $WAVELETFILTER $CODEBOOKQ >> $INFO

  if [ $NLEVEL -ge 3 ]; then
    megawave fwlbg_adap $NLEVELOPT -q 3 -b $WAVELETFILTER2 $MULTICB $OVERLAP $SIZE1Q -Q $CODEBOOK -O $CODEBOOKQ $TRAINIMG2 $TRAINIMG3 $TRAINIMG4 $TRAINIMG1 $WAVELETFILTER $CODEBOOKQ >> $INFO
    megawave fwlbg_adap $NLEVELOPT -q 3 -o 0 -b $WAVELETFILTER2 $MULTICB $OVERLAP $SIZERESQ -Q $CODEBOOK -O $CODEBOOKQ $TRAINIMG2 $TRAINIMG3 $TRAINIMG4 $TRAINIMG1 $WAVELETFILTER $CODEBOOKQ >> $INFO

    if [ $NLEVEL -ge 4 ]; then
      megawave fwlbg_adap $NLEVELOPT -q 4 -b $WAVELETFILTER2 $MULTICB $OVERLAP $SIZE1Q -Q $CODEBOOK -O $CODEBOOKQ $TRAINIMG2 $TRAINIMG3 $TRAINIMG4 $TRAINIMG1 $WAVELETFILTER $CODEBOOKQ >> $INFO

      megawave fwlbg_adap $NLEVELOPT -q 4 -o 0 -b $WAVELETFILTER2 $MULTICB $OVERLAP $SIZERESQ -Q $CODEBOOK -O $CODEBOOKQ $TRAINIMG2 $TRAINIMG3 $TRAINIMG4 $TRAINIMG1 $WAVELETFILTER $CODEBOOKQ >> $INFO
    fi
  fi
fi

# Codebooks for third stage quantization after quantization with $CODEBOOK
# and $CODEBOOKQ

megawave fwlbg_adap $NLEVELOPT -q 1 -w 4 -h 4 -b $WAVELETFILTER2 $MULTICB $OVERLAP $SIZE1QR -Q $CODEBOOK -R $CODEBOOKQ $TRAINIMG2 $TRAINIMG3 $TRAINIMG4 $TRAINIMG1 $WAVELETFILTER $CODEBOOKQr >> $INFO

if [ $NLEVEL -ge 2 ]; then
    megawave fwlbg_adap $NLEVELOPT -q 2 -w 4 -h 4 -b $WAVELETFILTER2 $MULTICB $OVERLAP $SIZE1QR -Q $CODEBOOK -R $CODEBOOKQ -O $CODEBOOKQR $TRAINIMG2 $TRAINIMG3 $TRAINIMG4 $TRAINIMG1 $WAVELETFILTER $CODEBOOKQR >> $INFO

    if [ $NLEVEL -ge 3 ]; then
	megawave fwlbg_adap $NLEVELOPT -q 3 -b $WAVELETFILTER2 $MULTICB $OVERLAP $SIZE1QR -Q $CODEBOOK -R $CODEBOOKQ -O $CODEBOOKQR $TRAINIMG2 $TRAINIMG3 $TRAINIMG4 $TRAINIMG1 $WAVELETFILTER $CODEBOOKQR >> $INFO
	megawave fwlbg_adap $NLEVELOPT -q 3 -o 0 -b $WAVELETFILTER2 $MULTICB $OVERLAP $SIZERESQR -Q $CODEBOOK -R $CODEBOOKQ -O $CODEBOOKQR $TRAINIMG2 $TRAINIMG3 $TRAINIMG4 $TRAINIMG1 $WAVELETFILTER $CODEBOOKQr >> $INFO

	if [ $NLEVEL -ge 4 ]; then
	    megawave fwlbg_adap $NLEVELOPT -q 4 -b $WAVELETFILTER2 $MULTICB $OVERLAP $SIZE1QR -Q $CODEBOOK -R $CODEBOOKQ -O $CODEBOOKQR $TRAINIMG2 $TRAINIMG3 $TRAINIMG4 $TRAINIMG1 $WAVELETFILTER $CODEBOOKQR >> $INFO
	    megawave fwlbg_adap $NLEVELOPT -q 4 -o 0 -b $WAVELETFILTER2 $MULTICB $OVERLAP $SIZERESQR -Q $CODEBOOK -R $CODEBOOKQ -O $CODEBOOKQR $TRAINIMG2 $TRAINIMG3 $TRAINIMG4 $TRAINIMG1 $WAVELETFILTER $CODEBOOKQR >> $INFO
	fi
    fi
fi

# Codebooks for second stage quantization after quantization with
# $CODEBOOKX 

megawave fwlbg_adap $NLEVELOPT -q 1 -w 4 -h 4 -b $WAVELETFILTER2 $MULTICB $OVERLAP $SIZE2Q -Q $CODEBOOKX $TRAINIMG2 $TRAINIMG3 $TRAINIMG4 $TRAINIMG1 $WAVELETFILTER $CODEBOOKXQ >> $INFO

if [ $NLEVEL -ge 2 ]; then
    fwlbg_adap $NLEVELOPT -q 2 -w 4 -h 4 -b $WAVELETFILTER2 $MULTICB $OVERLAP $SIZE2Q -Q $CODEBOOKX -O $CODEBOOKXQ $TRAINIMG2 $TRAINIMG3 $TRAINIMG4 $TRAINIMG1 $WAVELETFILTER $CODEBOOKXQ >> $INFO

    if [ $NLEVEL -ge 3 ]; then
	megawave fwlbg_adap $NLEVELOPT -q 3 -b $WAVELETFILTER2 $MULTICB $OVERLAP $SIZE2Q -Q $CODEBOOKX -O $CODEBOOKXQ $TRAINIMG2 $TRAINIMG3 $TRAINIMG4 $TRAINIMG1 $WAVELETFILTER $CODEBOOKXQ >> $INFO

	if [ $NLEVEL -ge 4 ]; then
	    megawave fwlbg_adap $NLEVELOPT -q 4 -b $WAVELETFILTER2 $MULTICB $OVERLAP $SIZE2Q -Q $CODEBOOKX -O $CODEBOOKXQ $TRAINIMG2 $TRAINIMG3 $TRAINIMG4 $TRAINIMG1 $WAVELETFILTER $CODEBOOKXQ >> $INFO
	fi
    fi
fi

# CODEBOOKs for third stage quantization after quantization with
# $CODEBOOKX and $CODEBOOKXQ

megawave fwlbg_adap $NLEVELOPT -q 1 -w 4 -h 4 -b $WAVELETFILTER2 $MULTICB $OVERLAP $SIZE2QR -Q $CODEBOOKX -R $CODEBOOKXQ $TRAINIMG2 $TRAINIMG3 $TRAINIMG4 $TRAINIMG1 $WAVELETFILTER $CODEBOOKXQR >> $INFO

if [ $NLEVEL -ge 2 ]; then
    megawave fwlbg_adap $NLEVELOPT -q 2 -w 4 -h 4 -b $WAVELETFILTER2 $MULTICB $OVERLAP $SIZE2QR -Q $CODEBOOKX -R $CODEBOOKXQ -O $CODEBOOKXQR $TRAINIMG2 $TRAINIMG3 $TRAINIMG4 $TRAINIMG1 $WAVELETFILTER $CODEBOOKXQR >> $INFO

    if [ $NLEVEL -ge 3 ]; then
	megawave fwlbg_adap $NLEVELOPT -q 3 -b $WAVELETFILTER2 $MULTICB $OVERLAP $SIZE2QR -Q $CODEBOOKX -R $CODEBOOKXQ -O $CODEBOOKXQR $TRAINIMG2 $TRAINIMG3 $TRAINIMG4 $TRAINIMG1 $WAVELETFILTER $CODEBOOKXQR >> $INFO

	if [ $NLEVEL -ge 4 ]; then
	    megawave fwlbg_adap $NLEVELOPT -q 4 -b $WAVELETFILTER2 $MULTICB $OVERLAP $SIZE2QR -Q $CODEBOOKX -R $CODEBOOKXQ -O $CODEBOOKXQR $TRAINIMG2 $TRAINIMG3 $TRAINIMG4 $TRAINIMG1 $WAVELETFILTER $CODEBOOKXQR >> $INFO
	fi
    fi
fi

# CODEBOOKs for second stage quantization after quantization with
# $CODEBOOKY

megawave fwlbg_adap $NLEVELOPT -q 1 -w 4 -h 4 -b $WAVELETFILTER2 $MULTICB $OVERLAP $SIZE3Q -Q $CODEBOOKY $TRAINIMG2 $TRAINIMG3 $TRAINIMG4 $TRAINIMG1 $WAVELETFILTER $CODEBOOKYq >> $INFO

if [ $NLEVEL -ge 2 ]; then
    megawave fwlbg_adap $NLEVELOPT -q 2 -w 4 -h 4 -b $WAVELETFILTER2 $MULTICB $OVERLAP $SIZE3Q -Q $CODEBOOKY -O $CODEBOOKYq $TRAINIMG2 $TRAINIMG3 $TRAINIMG4 $TRAINIMG1 $WAVELETFILTER $CODEBOOKYq >> $INFO
    
    if [ $NLEVEL -ge 3 ]; then
	megawave fwlbg_adap $NLEVELOPT -q 3 -b $WAVELETFILTER2 $MULTICB $OVERLAP $SIZE3Q -Q $CODEBOOKY -O $CODEBOOKYq $TRAINIMG2 $TRAINIMG3 $TRAINIMG4 $TRAINIMG1 $WAVELETFILTER $CODEBOOKYq >> $INFO

	if [ $NLEVEL -ge 4 ]; then
	    megawave fwlbg_adap $NLEVELOPT -q 4 -b $WAVELETFILTER2 $MULTICB $OVERLAP $SIZE3Q -Q $CODEBOOKY -O $CODEBOOKYq $TRAINIMG2 $TRAINIMG3 $TRAINIMG4 $TRAINIMG1 $WAVELETFILTER $CODEBOOKYq >> $INFO
	fi
    fi
fi


