From d097bef36e2743154e262a0d3985998b17f581bb Mon Sep 17 00:00:00 2001 From: jacquelinelala Date: Wed, 10 Oct 2018 22:08:57 +0800 Subject: [PATCH] New Version --- .DS_Store | Bin 10244 -> 12292 bytes datasets/dataset_hf5.py | 51 +- evaluation/.DS_Store | Bin 8196 -> 8196 bytes evaluation/delete_image.m | 4 +- evaluation/test_RGB.m | 24 +- evaluation/test_bicubic.m | 19 +- evaluation/utils/.DS_Store | Bin 10244 -> 6148 bytes evaluation/utils/IFC/distsub_est_M.m | 70 - evaluation/utils/IFC/ifcvec.m | 132 -- evaluation/utils/IFC/ind2wtree.m | 13 - evaluation/utils/IFC/readme.txt | 62 - evaluation/utils/IFC/refparams_vecgsm.m | 52 - evaluation/utils/batch_imread.m | 36 - evaluation/utils/bilinear_kernel.m | 42 - evaluation/utils/copy_model_weights.m | 34 - evaluation/utils/count_network_parameters.m | 31 - evaluation/utils/evaluate_SR.m | 6 +- evaluation/utils/load_list.m | 30 - evaluation/utils/matlabPyrTools/ChangeLog | 478 ----- evaluation/utils/matlabPyrTools/Contents.m | 109 -- .../utils/matlabPyrTools/MEX/-MacReadMe | 1 - .../matlabPyrTools/MEX/compilePyrTools.m | 15 - .../utils/matlabPyrTools/MEX/convolve.c | 325 ---- .../utils/matlabPyrTools/MEX/convolve.h | 55 - evaluation/utils/matlabPyrTools/MEX/corrDn.c | 145 -- .../utils/matlabPyrTools/MEX/corrDn.mexa64 | Bin 30225 -> 0 bytes .../utils/matlabPyrTools/MEX/corrDn.mexglx | Bin 27007 -> 0 bytes .../utils/matlabPyrTools/MEX/corrDn.mexmac | Bin 30168 -> 0 bytes .../utils/matlabPyrTools/MEX/corrDn.mexmaci | Bin 38096 -> 0 bytes .../utils/matlabPyrTools/MEX/corrDn.mexmaci64 | Bin 30192 -> 0 bytes .../utils/matlabPyrTools/MEX/corrDn.mexw32 | Bin 25088 -> 0 bytes .../utils/matlabPyrTools/MEX/corrDn.mexw64 | Bin 35840 -> 0 bytes .../utils/matlabPyrTools/MEX/edges-orig.c | 494 ----- evaluation/utils/matlabPyrTools/MEX/edges.c | 647 ------- evaluation/utils/matlabPyrTools/MEX/histo.c | 140 -- .../utils/matlabPyrTools/MEX/histo.mexa64 | Bin 12673 -> 0 bytes .../utils/matlabPyrTools/MEX/histo.mexglx | Bin 10228 -> 0 bytes .../utils/matlabPyrTools/MEX/histo.mexmac | Bin 8852 -> 0 bytes .../utils/matlabPyrTools/MEX/histo.mexmaci | Bin 12816 -> 0 bytes .../utils/matlabPyrTools/MEX/histo.mexmaci64 | Bin 8824 -> 0 bytes .../utils/matlabPyrTools/MEX/histo.mexw32 | Bin 8192 -> 0 bytes .../utils/matlabPyrTools/MEX/histo.mexw64 | Bin 9728 -> 0 bytes .../utils/matlabPyrTools/MEX/innerProd.c | 52 - evaluation/utils/matlabPyrTools/MEX/pointOp.c | 126 -- .../utils/matlabPyrTools/MEX/pointOp.exp | Bin 655 -> 0 bytes .../utils/matlabPyrTools/MEX/pointOp.lib | Bin 1734 -> 0 bytes .../utils/matlabPyrTools/MEX/pointOp.mexa64 | Bin 12666 -> 0 bytes .../utils/matlabPyrTools/MEX/pointOp.mexglx | Bin 10039 -> 0 bytes .../utils/matlabPyrTools/MEX/pointOp.mexmac | Bin 12944 -> 0 bytes .../utils/matlabPyrTools/MEX/pointOp.mexmaci | Bin 12824 -> 0 bytes .../matlabPyrTools/MEX/pointOp.mexmaci64 | Bin 8816 -> 0 bytes .../utils/matlabPyrTools/MEX/pointOp.mexw32 | Bin 7168 -> 0 bytes .../utils/matlabPyrTools/MEX/pointOp.mexw64 | Bin 8704 -> 0 bytes .../MEX/pointOp.mexw64.manifest | 10 - evaluation/utils/matlabPyrTools/MEX/range2.c | 56 - .../utils/matlabPyrTools/MEX/range2.mexa64 | Bin 8486 -> 0 bytes .../utils/matlabPyrTools/MEX/range2.mexglx | Bin 8226 -> 0 bytes .../utils/matlabPyrTools/MEX/range2.mexmac | Bin 8776 -> 0 bytes .../utils/matlabPyrTools/MEX/range2.mexmaci | Bin 12764 -> 0 bytes .../utils/matlabPyrTools/MEX/range2.mexmaci64 | Bin 8744 -> 0 bytes .../utils/matlabPyrTools/MEX/range2.mexw32 | Bin 6656 -> 0 bytes .../utils/matlabPyrTools/MEX/range2.mexw64 | Bin 8192 -> 0 bytes evaluation/utils/matlabPyrTools/MEX/upConv.c | 195 -- .../utils/matlabPyrTools/MEX/upConv.exp | Bin 652 -> 0 bytes .../utils/matlabPyrTools/MEX/upConv.lib | Bin 1720 -> 0 bytes .../utils/matlabPyrTools/MEX/upConv.mexa64 | Bin 34321 -> 0 bytes .../utils/matlabPyrTools/MEX/upConv.mexglx | Bin 28633 -> 0 bytes .../utils/matlabPyrTools/MEX/upConv.mexmac | Bin 34264 -> 0 bytes .../utils/matlabPyrTools/MEX/upConv.mexmaci | Bin 38096 -> 0 bytes .../utils/matlabPyrTools/MEX/upConv.mexmaci64 | Bin 30192 -> 0 bytes .../utils/matlabPyrTools/MEX/upConv.mexw32 | Bin 26112 -> 0 bytes .../utils/matlabPyrTools/MEX/upConv.mexw64 | Bin 37376 -> 0 bytes .../matlabPyrTools/MEX/upConv.mexw64.manifest | 10 - evaluation/utils/matlabPyrTools/MEX/wrap.c | 281 --- evaluation/utils/matlabPyrTools/README | 58 - .../matlabPyrTools/TUTORIALS/HTML/lcv.css | 23 - .../utils/matlabPyrTools/TUTORIALS/README | 24 - .../TUTORIALS/matlabPyrTools.html | 560 ------ .../matlabPyrTools/TUTORIALS/matlabPyrTools.m | 147 -- .../matlabPyrTools/TUTORIALS/pyramids.html | 1701 ----------------- .../utils/matlabPyrTools/TUTORIALS/pyramids.m | 903 --------- .../utils/matlabPyrTools/binomialFilter.m | 18 - evaluation/utils/matlabPyrTools/blur.m | 67 - evaluation/utils/matlabPyrTools/blurDn.m | 59 - evaluation/utils/matlabPyrTools/buildGpyr.m | 82 - evaluation/utils/matlabPyrTools/buildLpyr.m | 109 -- evaluation/utils/matlabPyrTools/buildSCFpyr.m | 90 - .../utils/matlabPyrTools/buildSCFpyrLevs.m | 73 - evaluation/utils/matlabPyrTools/buildSFpyr.m | 102 - .../utils/matlabPyrTools/buildSFpyrLevs.m | 63 - evaluation/utils/matlabPyrTools/buildSpyr.m | 62 - .../utils/matlabPyrTools/buildSpyrLevs.m | 37 - evaluation/utils/matlabPyrTools/buildWpyr.m | 100 - evaluation/utils/matlabPyrTools/cconv2.m | 50 - evaluation/utils/matlabPyrTools/clip.m | 32 - evaluation/utils/matlabPyrTools/corrDn.m | 63 - evaluation/utils/matlabPyrTools/corrDn.mexa64 | Bin 33734 -> 0 bytes evaluation/utils/matlabPyrTools/corrDn.mexglx | Bin 27007 -> 0 bytes evaluation/utils/matlabPyrTools/corrDn.mexmac | Bin 30168 -> 0 bytes .../utils/matlabPyrTools/corrDn.mexmaci64 | Bin 30192 -> 0 bytes evaluation/utils/matlabPyrTools/corrDn.mexw32 | Bin 25088 -> 0 bytes evaluation/utils/matlabPyrTools/einstein.pgm | Bin 65596 -> 0 bytes evaluation/utils/matlabPyrTools/entropy2.m | 31 - evaluation/utils/matlabPyrTools/factorial.m | 16 - evaluation/utils/matlabPyrTools/feynman.pgm | Bin 65593 -> 0 bytes evaluation/utils/matlabPyrTools/histo.m | 58 - evaluation/utils/matlabPyrTools/histo.mexa64 | Bin 9211 -> 0 bytes evaluation/utils/matlabPyrTools/histo.mexglx | Bin 10228 -> 0 bytes evaluation/utils/matlabPyrTools/histo.mexmac | Bin 8852 -> 0 bytes .../utils/matlabPyrTools/histo.mexmaci64 | Bin 8824 -> 0 bytes evaluation/utils/matlabPyrTools/histo.mexw32 | Bin 8192 -> 0 bytes evaluation/utils/matlabPyrTools/histoMatch.m | 35 - evaluation/utils/matlabPyrTools/imGradient.m | 50 - evaluation/utils/matlabPyrTools/imStats.m | 43 - evaluation/utils/matlabPyrTools/innerProd.m | 11 - evaluation/utils/matlabPyrTools/kurt2.m | 24 - evaluation/utils/matlabPyrTools/lplot.m | 43 - evaluation/utils/matlabPyrTools/lpyrHt.m | 11 - evaluation/utils/matlabPyrTools/make-tar-file | 55 - evaluation/utils/matlabPyrTools/maxPyrHt.m | 25 - evaluation/utils/matlabPyrTools/mean2.m | 7 - evaluation/utils/matlabPyrTools/mkAngle.m | 32 - .../utils/matlabPyrTools/mkAngularSine.m | 42 - evaluation/utils/matlabPyrTools/mkDisc.m | 61 - evaluation/utils/matlabPyrTools/mkFract.m | 36 - evaluation/utils/matlabPyrTools/mkGaussian.m | 63 - evaluation/utils/matlabPyrTools/mkImpulse.m | 25 - evaluation/utils/matlabPyrTools/mkR.m | 32 - evaluation/utils/matlabPyrTools/mkRamp.m | 47 - evaluation/utils/matlabPyrTools/mkSine.m | 67 - evaluation/utils/matlabPyrTools/mkSquare.m | 89 - evaluation/utils/matlabPyrTools/mkZonePlate.m | 33 - .../utils/matlabPyrTools/modulateFlip.m | 19 - evaluation/utils/matlabPyrTools/namedFilter.m | 71 - evaluation/utils/matlabPyrTools/nextFig.m | 19 - evaluation/utils/matlabPyrTools/pgmRead.m | 59 - evaluation/utils/matlabPyrTools/pgmWrite.m | 120 -- evaluation/utils/matlabPyrTools/pixelAxes.m | 70 - evaluation/utils/matlabPyrTools/pointOp.m | 28 - .../utils/matlabPyrTools/pointOp.mexa64 | Bin 9124 -> 0 bytes .../utils/matlabPyrTools/pointOp.mexglx | Bin 10039 -> 0 bytes .../utils/matlabPyrTools/pointOp.mexmac | Bin 12944 -> 0 bytes .../utils/matlabPyrTools/pointOp.mexmaci64 | Bin 8816 -> 0 bytes .../utils/matlabPyrTools/pointOp.mexw32 | Bin 7168 -> 0 bytes evaluation/utils/matlabPyrTools/pwd2path.m | 6 - evaluation/utils/matlabPyrTools/pyrBand.m | 11 - .../utils/matlabPyrTools/pyrBandIndices.m | 24 - evaluation/utils/matlabPyrTools/pyrLow.m | 12 - evaluation/utils/matlabPyrTools/pyrTools.pdf | Bin 132913 -> 0 bytes evaluation/utils/matlabPyrTools/range2.m | 18 - evaluation/utils/matlabPyrTools/range2.mexa64 | Bin 7504 -> 0 bytes evaluation/utils/matlabPyrTools/range2.mexglx | Bin 8226 -> 0 bytes evaluation/utils/matlabPyrTools/range2.mexmac | Bin 8776 -> 0 bytes evaluation/utils/matlabPyrTools/range2.mexw32 | Bin 6656 -> 0 bytes evaluation/utils/matlabPyrTools/rconv2.m | 50 - evaluation/utils/matlabPyrTools/rcosFn.m | 45 - evaluation/utils/matlabPyrTools/reconLpyr.m | 83 - evaluation/utils/matlabPyrTools/reconSCFpyr.m | 87 - evaluation/utils/matlabPyrTools/reconSFpyr.m | 108 -- .../utils/matlabPyrTools/reconSFpyrLevs.m | 69 - evaluation/utils/matlabPyrTools/reconSpyr.m | 96 - .../utils/matlabPyrTools/reconSpyrLevs.m | 46 - evaluation/utils/matlabPyrTools/reconWpyr.m | 148 -- evaluation/utils/matlabPyrTools/setPyrBand.m | 32 - evaluation/utils/matlabPyrTools/shift.m | 15 - evaluation/utils/matlabPyrTools/showIm.m | 221 --- evaluation/utils/matlabPyrTools/showLpyr.m | 202 -- evaluation/utils/matlabPyrTools/showSpyr.m | 188 -- evaluation/utils/matlabPyrTools/showWpyr.m | 204 -- evaluation/utils/matlabPyrTools/skew2.m | 21 - evaluation/utils/matlabPyrTools/sp0Filters.m | 72 - evaluation/utils/matlabPyrTools/sp1Filters.m | 91 - evaluation/utils/matlabPyrTools/sp3Filters.m | 121 -- evaluation/utils/matlabPyrTools/sp5Filters.m | 110 -- evaluation/utils/matlabPyrTools/spyrBand.m | 34 - evaluation/utils/matlabPyrTools/spyrHigh.m | 10 - evaluation/utils/matlabPyrTools/spyrHt.m | 16 - evaluation/utils/matlabPyrTools/spyrLev.m | 24 - .../utils/matlabPyrTools/spyrNumBands.m | 20 - evaluation/utils/matlabPyrTools/steer.m | 68 - .../utils/matlabPyrTools/steer2HarmMtx.m | 71 - evaluation/utils/matlabPyrTools/subMtx.m | 21 - evaluation/utils/matlabPyrTools/upBlur.m | 52 - evaluation/utils/matlabPyrTools/upConv.m | 80 - evaluation/utils/matlabPyrTools/upConv.mexa64 | Bin 35078 -> 0 bytes evaluation/utils/matlabPyrTools/upConv.mexglx | Bin 28633 -> 0 bytes evaluation/utils/matlabPyrTools/upConv.mexmac | Bin 34264 -> 0 bytes .../utils/matlabPyrTools/upConv.mexmaci64 | Bin 30192 -> 0 bytes evaluation/utils/matlabPyrTools/upConv.mexw32 | Bin 26112 -> 0 bytes evaluation/utils/matlabPyrTools/var2.m | 17 - evaluation/utils/matlabPyrTools/vectify.m | 8 - evaluation/utils/matlabPyrTools/wpyrBand.m | 39 - evaluation/utils/matlabPyrTools/wpyrHt.m | 15 - evaluation/utils/matlabPyrTools/wpyrLev.m | 30 - evaluation/utils/matlabPyrTools/zconv2.m | 41 - .../.DS_Store | Bin 8744 -> 6148 bytes h5_generator/gopro_hdf5_generator.m | 115 ++ h5_generator/gopro_val_generator.m | 70 + h5_generator/modcrop.m | 31 + h5_generator/store2hdf5.m | 91 + models/.DS_Store | Bin 6148 -> 8196 bytes networks/.DS_Store | Bin 6148 -> 6148 bytes networks/GFN_4x.py | 229 +++ networks/GFN_x4.py | 187 -- test_GFN_4x.py | 133 ++ test_GFN_x4.py | 90 - train_GFN_4x.py | 151 ++ 207 files changed, 863 insertions(+), 12350 deletions(-) delete mode 100755 evaluation/utils/IFC/distsub_est_M.m delete mode 100755 evaluation/utils/IFC/ifcvec.m delete mode 100755 evaluation/utils/IFC/ind2wtree.m delete mode 100755 evaluation/utils/IFC/readme.txt delete mode 100755 evaluation/utils/IFC/refparams_vecgsm.m delete mode 100755 evaluation/utils/batch_imread.m delete mode 100755 evaluation/utils/bilinear_kernel.m delete mode 100755 evaluation/utils/copy_model_weights.m delete mode 100755 evaluation/utils/count_network_parameters.m delete mode 100755 evaluation/utils/load_list.m delete mode 100755 evaluation/utils/matlabPyrTools/ChangeLog delete mode 100755 evaluation/utils/matlabPyrTools/Contents.m delete mode 100755 evaluation/utils/matlabPyrTools/MEX/-MacReadMe delete mode 100755 evaluation/utils/matlabPyrTools/MEX/compilePyrTools.m delete mode 100755 evaluation/utils/matlabPyrTools/MEX/convolve.c delete mode 100755 evaluation/utils/matlabPyrTools/MEX/convolve.h delete mode 100755 evaluation/utils/matlabPyrTools/MEX/corrDn.c delete mode 100755 evaluation/utils/matlabPyrTools/MEX/corrDn.mexa64 delete mode 100755 evaluation/utils/matlabPyrTools/MEX/corrDn.mexglx delete mode 100755 evaluation/utils/matlabPyrTools/MEX/corrDn.mexmac delete mode 100755 evaluation/utils/matlabPyrTools/MEX/corrDn.mexmaci delete mode 100755 evaluation/utils/matlabPyrTools/MEX/corrDn.mexmaci64 delete mode 100755 evaluation/utils/matlabPyrTools/MEX/corrDn.mexw32 delete mode 100755 evaluation/utils/matlabPyrTools/MEX/corrDn.mexw64 delete mode 100755 evaluation/utils/matlabPyrTools/MEX/edges-orig.c delete mode 100755 evaluation/utils/matlabPyrTools/MEX/edges.c delete mode 100755 evaluation/utils/matlabPyrTools/MEX/histo.c delete mode 100755 evaluation/utils/matlabPyrTools/MEX/histo.mexa64 delete mode 100755 evaluation/utils/matlabPyrTools/MEX/histo.mexglx delete mode 100755 evaluation/utils/matlabPyrTools/MEX/histo.mexmac delete mode 100755 evaluation/utils/matlabPyrTools/MEX/histo.mexmaci delete mode 100755 evaluation/utils/matlabPyrTools/MEX/histo.mexmaci64 delete mode 100755 evaluation/utils/matlabPyrTools/MEX/histo.mexw32 delete mode 100755 evaluation/utils/matlabPyrTools/MEX/histo.mexw64 delete mode 100755 evaluation/utils/matlabPyrTools/MEX/innerProd.c delete mode 100755 evaluation/utils/matlabPyrTools/MEX/pointOp.c delete mode 100755 evaluation/utils/matlabPyrTools/MEX/pointOp.exp delete mode 100755 evaluation/utils/matlabPyrTools/MEX/pointOp.lib delete mode 100755 evaluation/utils/matlabPyrTools/MEX/pointOp.mexa64 delete mode 100755 evaluation/utils/matlabPyrTools/MEX/pointOp.mexglx delete mode 100755 evaluation/utils/matlabPyrTools/MEX/pointOp.mexmac delete mode 100755 evaluation/utils/matlabPyrTools/MEX/pointOp.mexmaci delete mode 100755 evaluation/utils/matlabPyrTools/MEX/pointOp.mexmaci64 delete mode 100755 evaluation/utils/matlabPyrTools/MEX/pointOp.mexw32 delete mode 100755 evaluation/utils/matlabPyrTools/MEX/pointOp.mexw64 delete mode 100755 evaluation/utils/matlabPyrTools/MEX/pointOp.mexw64.manifest delete mode 100755 evaluation/utils/matlabPyrTools/MEX/range2.c delete mode 100755 evaluation/utils/matlabPyrTools/MEX/range2.mexa64 delete mode 100755 evaluation/utils/matlabPyrTools/MEX/range2.mexglx delete mode 100755 evaluation/utils/matlabPyrTools/MEX/range2.mexmac delete mode 100755 evaluation/utils/matlabPyrTools/MEX/range2.mexmaci delete mode 100755 evaluation/utils/matlabPyrTools/MEX/range2.mexmaci64 delete mode 100755 evaluation/utils/matlabPyrTools/MEX/range2.mexw32 delete mode 100755 evaluation/utils/matlabPyrTools/MEX/range2.mexw64 delete mode 100755 evaluation/utils/matlabPyrTools/MEX/upConv.c delete mode 100755 evaluation/utils/matlabPyrTools/MEX/upConv.exp delete mode 100755 evaluation/utils/matlabPyrTools/MEX/upConv.lib delete mode 100755 evaluation/utils/matlabPyrTools/MEX/upConv.mexa64 delete mode 100755 evaluation/utils/matlabPyrTools/MEX/upConv.mexglx delete mode 100755 evaluation/utils/matlabPyrTools/MEX/upConv.mexmac delete mode 100755 evaluation/utils/matlabPyrTools/MEX/upConv.mexmaci delete mode 100755 evaluation/utils/matlabPyrTools/MEX/upConv.mexmaci64 delete mode 100755 evaluation/utils/matlabPyrTools/MEX/upConv.mexw32 delete mode 100755 evaluation/utils/matlabPyrTools/MEX/upConv.mexw64 delete mode 100755 evaluation/utils/matlabPyrTools/MEX/upConv.mexw64.manifest delete mode 100755 evaluation/utils/matlabPyrTools/MEX/wrap.c delete mode 100755 evaluation/utils/matlabPyrTools/README delete mode 100755 evaluation/utils/matlabPyrTools/TUTORIALS/HTML/lcv.css delete mode 100755 evaluation/utils/matlabPyrTools/TUTORIALS/README delete mode 100755 evaluation/utils/matlabPyrTools/TUTORIALS/matlabPyrTools.html delete mode 100755 evaluation/utils/matlabPyrTools/TUTORIALS/matlabPyrTools.m delete mode 100755 evaluation/utils/matlabPyrTools/TUTORIALS/pyramids.html delete mode 100755 evaluation/utils/matlabPyrTools/TUTORIALS/pyramids.m delete mode 100755 evaluation/utils/matlabPyrTools/binomialFilter.m delete mode 100755 evaluation/utils/matlabPyrTools/blur.m delete mode 100755 evaluation/utils/matlabPyrTools/blurDn.m delete mode 100755 evaluation/utils/matlabPyrTools/buildGpyr.m delete mode 100755 evaluation/utils/matlabPyrTools/buildLpyr.m delete mode 100755 evaluation/utils/matlabPyrTools/buildSCFpyr.m delete mode 100755 evaluation/utils/matlabPyrTools/buildSCFpyrLevs.m delete mode 100755 evaluation/utils/matlabPyrTools/buildSFpyr.m delete mode 100755 evaluation/utils/matlabPyrTools/buildSFpyrLevs.m delete mode 100755 evaluation/utils/matlabPyrTools/buildSpyr.m delete mode 100755 evaluation/utils/matlabPyrTools/buildSpyrLevs.m delete mode 100755 evaluation/utils/matlabPyrTools/buildWpyr.m delete mode 100755 evaluation/utils/matlabPyrTools/cconv2.m delete mode 100755 evaluation/utils/matlabPyrTools/clip.m delete mode 100755 evaluation/utils/matlabPyrTools/corrDn.m delete mode 100755 evaluation/utils/matlabPyrTools/corrDn.mexa64 delete mode 100755 evaluation/utils/matlabPyrTools/corrDn.mexglx delete mode 100755 evaluation/utils/matlabPyrTools/corrDn.mexmac delete mode 100755 evaluation/utils/matlabPyrTools/corrDn.mexmaci64 delete mode 100755 evaluation/utils/matlabPyrTools/corrDn.mexw32 delete mode 100755 evaluation/utils/matlabPyrTools/einstein.pgm delete mode 100755 evaluation/utils/matlabPyrTools/entropy2.m delete mode 100755 evaluation/utils/matlabPyrTools/factorial.m delete mode 100755 evaluation/utils/matlabPyrTools/feynman.pgm delete mode 100755 evaluation/utils/matlabPyrTools/histo.m delete mode 100755 evaluation/utils/matlabPyrTools/histo.mexa64 delete mode 100755 evaluation/utils/matlabPyrTools/histo.mexglx delete mode 100755 evaluation/utils/matlabPyrTools/histo.mexmac delete mode 100755 evaluation/utils/matlabPyrTools/histo.mexmaci64 delete mode 100755 evaluation/utils/matlabPyrTools/histo.mexw32 delete mode 100755 evaluation/utils/matlabPyrTools/histoMatch.m delete mode 100755 evaluation/utils/matlabPyrTools/imGradient.m delete mode 100755 evaluation/utils/matlabPyrTools/imStats.m delete mode 100755 evaluation/utils/matlabPyrTools/innerProd.m delete mode 100755 evaluation/utils/matlabPyrTools/kurt2.m delete mode 100755 evaluation/utils/matlabPyrTools/lplot.m delete mode 100755 evaluation/utils/matlabPyrTools/lpyrHt.m delete mode 100755 evaluation/utils/matlabPyrTools/make-tar-file delete mode 100755 evaluation/utils/matlabPyrTools/maxPyrHt.m delete mode 100755 evaluation/utils/matlabPyrTools/mean2.m delete mode 100755 evaluation/utils/matlabPyrTools/mkAngle.m delete mode 100755 evaluation/utils/matlabPyrTools/mkAngularSine.m delete mode 100755 evaluation/utils/matlabPyrTools/mkDisc.m delete mode 100755 evaluation/utils/matlabPyrTools/mkFract.m delete mode 100755 evaluation/utils/matlabPyrTools/mkGaussian.m delete mode 100755 evaluation/utils/matlabPyrTools/mkImpulse.m delete mode 100755 evaluation/utils/matlabPyrTools/mkR.m delete mode 100755 evaluation/utils/matlabPyrTools/mkRamp.m delete mode 100755 evaluation/utils/matlabPyrTools/mkSine.m delete mode 100755 evaluation/utils/matlabPyrTools/mkSquare.m delete mode 100755 evaluation/utils/matlabPyrTools/mkZonePlate.m delete mode 100755 evaluation/utils/matlabPyrTools/modulateFlip.m delete mode 100755 evaluation/utils/matlabPyrTools/namedFilter.m delete mode 100755 evaluation/utils/matlabPyrTools/nextFig.m delete mode 100755 evaluation/utils/matlabPyrTools/pgmRead.m delete mode 100755 evaluation/utils/matlabPyrTools/pgmWrite.m delete mode 100755 evaluation/utils/matlabPyrTools/pixelAxes.m delete mode 100755 evaluation/utils/matlabPyrTools/pointOp.m delete mode 100755 evaluation/utils/matlabPyrTools/pointOp.mexa64 delete mode 100755 evaluation/utils/matlabPyrTools/pointOp.mexglx delete mode 100755 evaluation/utils/matlabPyrTools/pointOp.mexmac delete mode 100755 evaluation/utils/matlabPyrTools/pointOp.mexmaci64 delete mode 100755 evaluation/utils/matlabPyrTools/pointOp.mexw32 delete mode 100755 evaluation/utils/matlabPyrTools/pwd2path.m delete mode 100755 evaluation/utils/matlabPyrTools/pyrBand.m delete mode 100755 evaluation/utils/matlabPyrTools/pyrBandIndices.m delete mode 100755 evaluation/utils/matlabPyrTools/pyrLow.m delete mode 100755 evaluation/utils/matlabPyrTools/pyrTools.pdf delete mode 100755 evaluation/utils/matlabPyrTools/range2.m delete mode 100755 evaluation/utils/matlabPyrTools/range2.mexa64 delete mode 100755 evaluation/utils/matlabPyrTools/range2.mexglx delete mode 100755 evaluation/utils/matlabPyrTools/range2.mexmac delete mode 100755 evaluation/utils/matlabPyrTools/range2.mexw32 delete mode 100755 evaluation/utils/matlabPyrTools/rconv2.m delete mode 100755 evaluation/utils/matlabPyrTools/rcosFn.m delete mode 100755 evaluation/utils/matlabPyrTools/reconLpyr.m delete mode 100755 evaluation/utils/matlabPyrTools/reconSCFpyr.m delete mode 100755 evaluation/utils/matlabPyrTools/reconSFpyr.m delete mode 100755 evaluation/utils/matlabPyrTools/reconSFpyrLevs.m delete mode 100755 evaluation/utils/matlabPyrTools/reconSpyr.m delete mode 100755 evaluation/utils/matlabPyrTools/reconSpyrLevs.m delete mode 100755 evaluation/utils/matlabPyrTools/reconWpyr.m delete mode 100755 evaluation/utils/matlabPyrTools/setPyrBand.m delete mode 100755 evaluation/utils/matlabPyrTools/shift.m delete mode 100755 evaluation/utils/matlabPyrTools/showIm.m delete mode 100755 evaluation/utils/matlabPyrTools/showLpyr.m delete mode 100755 evaluation/utils/matlabPyrTools/showSpyr.m delete mode 100755 evaluation/utils/matlabPyrTools/showWpyr.m delete mode 100755 evaluation/utils/matlabPyrTools/skew2.m delete mode 100755 evaluation/utils/matlabPyrTools/sp0Filters.m delete mode 100755 evaluation/utils/matlabPyrTools/sp1Filters.m delete mode 100755 evaluation/utils/matlabPyrTools/sp3Filters.m delete mode 100755 evaluation/utils/matlabPyrTools/sp5Filters.m delete mode 100755 evaluation/utils/matlabPyrTools/spyrBand.m delete mode 100755 evaluation/utils/matlabPyrTools/spyrHigh.m delete mode 100755 evaluation/utils/matlabPyrTools/spyrHt.m delete mode 100755 evaluation/utils/matlabPyrTools/spyrLev.m delete mode 100755 evaluation/utils/matlabPyrTools/spyrNumBands.m delete mode 100755 evaluation/utils/matlabPyrTools/steer.m delete mode 100755 evaluation/utils/matlabPyrTools/steer2HarmMtx.m delete mode 100755 evaluation/utils/matlabPyrTools/subMtx.m delete mode 100755 evaluation/utils/matlabPyrTools/upBlur.m delete mode 100755 evaluation/utils/matlabPyrTools/upConv.m delete mode 100755 evaluation/utils/matlabPyrTools/upConv.mexa64 delete mode 100755 evaluation/utils/matlabPyrTools/upConv.mexglx delete mode 100755 evaluation/utils/matlabPyrTools/upConv.mexmac delete mode 100755 evaluation/utils/matlabPyrTools/upConv.mexmaci64 delete mode 100755 evaluation/utils/matlabPyrTools/upConv.mexw32 delete mode 100755 evaluation/utils/matlabPyrTools/var2.m delete mode 100755 evaluation/utils/matlabPyrTools/vectify.m delete mode 100755 evaluation/utils/matlabPyrTools/wpyrBand.m delete mode 100755 evaluation/utils/matlabPyrTools/wpyrHt.m delete mode 100755 evaluation/utils/matlabPyrTools/wpyrLev.m delete mode 100755 evaluation/utils/matlabPyrTools/zconv2.m rename evaluation/utils/matlabPyrTools/range2.mexmaci64 => h5_generator/.DS_Store (57%) create mode 100755 h5_generator/gopro_hdf5_generator.m create mode 100755 h5_generator/gopro_val_generator.m create mode 100755 h5_generator/modcrop.m create mode 100755 h5_generator/store2hdf5.m create mode 100755 networks/GFN_4x.py delete mode 100755 networks/GFN_x4.py create mode 100755 test_GFN_4x.py delete mode 100755 test_GFN_x4.py create mode 100755 train_GFN_4x.py diff --git a/.DS_Store b/.DS_Store index b811fe934a1ac5e5881f4d5bcc60b92b6513a122..1f088fa8578b9fd94bba3d4c5b31029d9b8b7239 100644 GIT binary patch delta 705 zcmcJLPfG$}5XNWS4OcQ;%WRieeG8!uOS$H%9XeEG)Iq#Nm%y?@4aq+k6(M-=Dq#ab zXQ4}%mc4b6K7n-VWB3tj){_Q$>xG9InCE5Y`8CtcQw9Ls&dr4mAX6)n>?%zII9veC z-DWE)Z<|QVB15|(U-KypJKj9~|yK@Cb!wR*lThbOXPR(Qd3 zih`*6Ci(Hz|2?lKq8c-dNL^zOdL$gtSR!HI)55J)_O>|dSt)YWYvnD204|bF}d{@1Aq<$Vp;SScI4EG1c(s{O6%F-c}i{GNU`ZIXc0eI;2Dg`J| z*bMAL5>iyh{eHvsfUHaneu7L4VQ-kFS?TlW32oD&0Z^Nk4OYZ_=mo!g85s5Ue(GS^WsH8I*Ot60U1 zLvHd~mHN%yg1wBBcgm?uHWxS{YGw#D!_v?Q#fZrwg5{faWP2GmO9py!Ir+)|#5p(1vm9U)WCjHQFkHBSgexd)HVblmXP(S2 g<2c!!M}UI~5^Nfi6J%y?j$;CPWt*HjUau4Z00=N$*8l(j diff --git a/datasets/dataset_hf5.py b/datasets/dataset_hf5.py index 001ef72..3f7683e 100755 --- a/datasets/dataset_hf5.py +++ b/datasets/dataset_hf5.py @@ -1,6 +1,5 @@ import torch.utils.data as data import torch -from PIL import Image from skimage.io import imread, imsave import numpy as np import random @@ -9,10 +8,7 @@ import h5py import sys import os -sys.path.append('..') from os.path import join -from skimage.transform import rotate -from skimage import img_as_float #=================== Utils ===================# def is_image_file(filename): @@ -24,26 +20,21 @@ def is_image_file(filename): class DataValSet(data.Dataset): def __init__(self, root_dir): - # input_dir = join(root_val_dir, 'LR_Blur') #---------------Input path - #one input & two ground truths + #one input & ground truth self.input_dir = join(root_dir, 'LR_Blur') - self.lr_deblur_dir = join(root_dir, 'LR') self.sr_dir = join(root_dir, 'HR') #Online Loading self.input_names = [x for x in sorted(os.listdir(self.input_dir)) if is_image_file(x)] - self.lr_deblur_names = [x for x in sorted(os.listdir(self.lr_deblur_dir)) if is_image_file(x)] self.hr_names = [x for x in sorted(os.listdir(self.sr_dir)) if is_image_file(x)] def __len__(self): return len(self.hr_names) def __getitem__(self, index): - input = np.asarray(imread(join(self.input_dir, self.input_names[index])).transpose((2, 0, 1)), np.float32).copy() / 255 - target_lr = np.asarray(imread(join(self.lr_deblur_dir, self.lr_deblur_names[index])).transpose((2, 0, 1)), np.float32).copy() /255 - target = np.asarray(imread(join(self.sr_dir, self.hr_names[index])).transpose((2, 0, 1)), np.float32).copy() / 255 - - return input, target_lr, target, self.hr_names[index] + input = np.asarray(imread(join(self.input_dir, self.input_names[index])).transpose((2, 0, 1)), np.float32).copy() / 255 + target = np.asarray(imread(join(self.sr_dir, self.hr_names[index])).transpose((2, 0, 1)), np.float32).copy() / 255 + return input, target #=================== Training ===================# @@ -52,37 +43,35 @@ def __init__(self, h5py_file_path): super(DataSet, self).__init__() self.hdf5_file = h5py_file_path - self.file = h5py.File(self.hdf5_file, 'r') - self.file.keys() - self.inputs = np.array(self.file.get("data")) - self.deblurs = np.array(self.file.get("label_db")) - self.hrs = np.array(self.file.get("label")) + self.file = h5py.File(self.hdf5_file, 'r') + #self.file.keys() + self.inputs = self.file.get("data") + self.deblurs = self.file.get("label_db") + self.hrs = self.file.get("label") def __len__(self): return self.inputs.shape[0] def __getitem__(self, index): - input_patch = self.inputs[index, :, :, :] - deblur_patch = self.deblurs[index, :, :, :] - hr_patch = self.hrs[index, :, :, :] + #print(index) + # numpy + input_patch = np.asarray(self.inputs[index, :, :, :], np.float32) + deblur_patch = np.asarray(self.deblurs[index, :, :, :], np.float32) + hr_patch = np.asarray(self.hrs[index, :, :, :], np.float32) # randomly flip if random.randint(0, 1) == 0: - input_patch = np.flip(input_patch, 1) - deblur_patch = np.flip(deblur_patch, 1) - hr_patch = np.flip(hr_patch, 1) - else: input_patch = np.flip(input_patch, 2) deblur_patch = np.flip(deblur_patch, 2) hr_patch = np.flip(hr_patch, 2) # randomly rotation rotation_times = random.randint(0, 3) - input_patch = np.rot90(input_patch, rotation_times, (1, 2)) - deblur_patch = np.rot90(deblur_patch, rotation_times, (1, 2)) - hr_patch = np.rot90(hr_patch, rotation_times, (1, 2)) + input_patch = np.rot90(input_patch, rotation_times, (1, 2)) + deblur_patch = np.rot90(deblur_patch, rotation_times, (1, 2)) + hr_patch = np.rot90(hr_patch, rotation_times, (1, 2)) - return torch.from_numpy(np.asarray(input_patch, np.float32).copy()),\ - torch.from_numpy(np.asarray(deblur_patch, np.float32).copy()),\ - torch.from_numpy(np.asarray(hr_patch, np.float32).copy()) + return input_patch.copy(),\ + deblur_patch.copy(),\ + hr_patch.copy() diff --git a/evaluation/.DS_Store b/evaluation/.DS_Store index 6e7bede9f45cf581de02ac1dd7b10b01671cbb25..61fbeb9e4028fe7ecb9e7acf1a1806ce1500f06b 100755 GIT binary patch delta 103 zcmZp1XmOa}&&abeU^hP_&tx6}{mEAa1SWe6RExL=1sIeTmlQEDFt9NAF(fkNGNex4 zAs{>18mM5m0Qck%0{vpfMus{HhK8m_wK@vbhDHWPItmsRrkke<&SYdt%$;l?{C%^h H$Zl=`^rjuI delta 87 zcmZp1XmOa}&&a(oU^hP__hcRc{mI`21SWe6R8M{(z(3g<$lfi$Jy}SwU(C$FQb)ni r(9F12N1@u#z{p%j!PLZP^LD|Rj7<4?lY@l6Z&v4dz`U7V;x9V@i9Z^( diff --git a/evaluation/delete_image.m b/evaluation/delete_image.m index 7982cc4..92b8d5b 100755 --- a/evaluation/delete_image.m +++ b/evaluation/delete_image.m @@ -16,7 +16,9 @@ % http://xinyizhang.tech/bmvc2018 % https://github.com/jacquelinelala/GFN %% deleting -path = '/4TB/datasets/LR-GOPRO/Validation_4x/Results'; +function delete_image(folder) +path = fullfile(folder, 'Validation_4x/Results'); +%path = fullfile(folder, 'Validation_4x/HR'); result_dir = dir(fullfile(path, '*GFN_4x.png')); len = length(result_dir); diff --git a/evaluation/test_RGB.m b/evaluation/test_RGB.m index ccd6de5..818f881 100755 --- a/evaluation/test_RGB.m +++ b/evaluation/test_RGB.m @@ -1,5 +1,5 @@ % Description: -% -testting RGB channels PSNR & SSIM +% -testting RGB channels PSNR. % % Input: % - Validation/Results: some specific group images with limited endings. @@ -7,11 +7,11 @@ % % Output: % - PSNR Average PSNR -% - SSIM Average SSIM +% % Citation: % Gated Fusion Network for Joint Image Deblurring and Super-Resolution % The British Machine Vision Conference(BMVC2018 oral) -% Xinyi Zhang, Hang Dong, Zhe Hu, Wei-Sheng Lai,?Fei Wang and?Ming-Hsuan Yang +% Xinyi Zhang, Hang Dong, Zhe Hu, Wei-Sheng Lai, Fei Wang and Ming-Hsuan Yang % Thanks: % Many thanks to Wei-Sheng Lai al. for LapSRN. In this project we use % some codes from their project. @@ -22,34 +22,28 @@ % https://github.com/jacquelinelala/GFN %% testing +function test_RGB(folder) addpath(genpath('utils')); -results_path = '/4TB/datasets/LR-GOPRO/Validation_4x/Results'; -hr_path = '/4TB/datasets/LR-GOPRO/Validation_4x/HR'; +results_path = fullfile(folder, 'Validation_4x/Results'); +hr_path = fullfile(folder, 'Validation_4x/HR'); result_dir = dir(fullfile(results_path, '*GFN_4x.png')); hr_dir = dir(fullfile(hr_path, '*.png')); count = length(hr_dir); PSNR = zeros(count, 1); -SSIM = zeros(count, 1); IFC = zeros(count, 1); ifc = 0; scale = 4; - for i = 1 : count + fprintf("Calculating %s\n", hr_dir(i).name); HR = imread(fullfile(hr_dir(i).folder, hr_dir(i).name)); Results = imread(fullfile(result_dir(i).folder, result_dir(i).name)); - [PSNR(i), SSIM(i), IFC(i)] = evaluate_SR(HR, Results, scale, ifc); + [PSNR(i), IFC(i)] = evaluate_SR(HR, Results, scale, ifc); end PSNR(count + 1) = mean(PSNR(:)); -SSIM(count + 1) = mean(SSIM(:)); - fprintf("Average PSNR is %f\n", PSNR(count + 1)); -fprintf("Average SSIM is %f\n", SSIM(count + 1)); - -PSNR_path = fullfile('/4TB/datasets/LR-GOPRO/Validation_4x', 'PSNR-GFN_4x_HR.txt'); -SSIM_path = fullfile('/4TB/datasets/LR-GOPRO/Validation_4x', 'SSIM-GFN_4x_HR.txt'); +PSNR_path = fullfile(folder, 'Validation_4x', 'PSNR-GFN_4x_HR.txt'); save_matrix(PSNR, PSNR_path); -save_matrix(SSIM, SSIM_path); diff --git a/evaluation/test_bicubic.m b/evaluation/test_bicubic.m index 2e81c0c..13cb738 100755 --- a/evaluation/test_bicubic.m +++ b/evaluation/test_bicubic.m @@ -1,7 +1,7 @@ % ------------------------------------------------------------------------- % Description: % Use bicubic to upscale the input, and evaluate the results in terms -% of PSNR and SSIM (RGB channel) +% of PSNR. % % Input: % - Validation/LR_Blur : Blurry low-resolution input @@ -11,7 +11,7 @@ % - Validation/Results: images using bicubic upscaling and formatting % with 'Bic****.png' in Results directory % - PSNR: Average PSNR -% - SSIM: Average SSIM +% % Citation: % Gated Fusion Network for Joint Image Deblurring and Super-Resolution % The British Machine Vision Conference(BMVC2018 oral) @@ -26,10 +26,11 @@ % https://github.com/jacquelinelala/GFN %% testing +function test_bicubic(folder) addpath(genpath('utils')); -lr_blur_path = '/4TB/datasets/LR-GOPRO/Validation_4x/LR_Blur'; -hr_path = '/4TB/datasets/LR-GOPRO/Validation_4x/HR'; -results_path = '/4TB/datasets/LR-GOPRO/Validation_4x/Results'; +lr_blur_path = fullfile(folder, 'Validation_4x/LR_Blur'); +hr_path = fullfile(folder, 'Validation_4x/HR'); +results_path = fullfile(folder, 'Validation_4x/Results'); lr_blur_dir = dir(fullfile(lr_blur_path, '*.png')); hr_dir = dir(fullfile(hr_path, '*.png')); count = length(lr_blur_dir); @@ -45,17 +46,13 @@ LR_Blur = im2double(imread(fullfile(lr_blur_dir(i).folder, lr_blur_dir(i).name))); LR_Blur_Bic = imresize(LR_Blur, 4, 'bicubic'); imwrite(LR_Blur_Bic, fullfile(results_path, strcat(hr_dir(i).name(1:4), 'Bic.png')),'png'); - [PSNR(i), SSIM(i), IFC(i)] = evaluate_SR(HR, LR_Blur_Bic, scale, ifc); + [PSNR(i), IFC(i)] = evaluate_SR(HR, LR_Blur_Bic, scale, ifc); end PSNR(count + 1) = mean(PSNR(:)); -SSIM(count + 1) = mean(SSIM(:)); fprintf("Average PSNR is %f\n", PSNR(count + 1)); -fprintf("Average SSIM is %f\n", SSIM(count + 1)); -PSNR_path = fullfile('/4TB/datasets/LR-GOPRO/Validation_4x', 'PSNR-LRBlurBic_HR.txt'); -SSIM_path = fullfile('/4TB/datasets/LR-GOPRO/Validation_4x', 'SSIM-LRBlurBic_HR.txt'); +PSNR_path = fullfile(folder, 'Validation_4x', 'PSNR-LRBlurBic_HR.txt'); save_matrix(PSNR, PSNR_path); -save_matrix(SSIM, SSIM_path); diff --git a/evaluation/utils/.DS_Store b/evaluation/utils/.DS_Store index 379b718bc3016d153f71ca50f727e9ce378081d3..e5cf28531e2d27b3ee02778e83f63c4bf32b4bd9 100755 GIT binary patch delta 116 zcmZn(XfcprU|?W$DortDU=RQ@Ie-{MGjdEU6q~50D9QrjfW=A~5*bPuQW@eIf+rR( zXJnbICTP2PxA;D`#q1m$g3Lg5Kp?;kBwRuIHx_*H#2L;@wyR3RTZikYv#R~o%d$uxBkue zjfsdATD2UJNkl1RA&rYDh9vP^A(t8ykdx@G8#DqM0gZr0KqH_L zI1dQm%oZs%p`?kQs z;ZsEqEH-6vh{2ROo|~dOWImQ1C6zfbWlk&}nZ*$blcU4Vl--HtmDHt1KqHVuK*a7- zWRpb^RZqq57S-r&Y7{+QwLNa5pP<%z$k+as2^vubwk~;5VC_L~L%LMQoFWR7e%RcApDWT&3*$zx7PE=qgJULps5j-@EQ}!9 z#r%f({BpqOBzo?{(xa9{$bqLatqqyYp97YoRHP4SWe9p-_n{Z}vfE)Z#`tHu>A7LF zxcCbj86A7&)eEUKK9i{jo zoj@A9H3wbpf9Co%-Y)Q#Ukjz5vU(uKNmq>Q(b4i!Zoz!#X6|^wJjyLDy}MxESYA3l zPN(Ls=57@qH4YAsK0p5A8>|?K#TznBt9q~e7FxVMx4Iv%kNwbH-*1M|TjBV`#mT8@ zBXj9;W+pQ`JNw$)?CaSp*@|)5wyJyeK+JW8dpsz3EoZwPxV3WAs=9uCGjbkBW%tmj z7?%dRt~s@bCr#@IP4t;LX^`$d3LM9m{#JK(LMPg+7}H@j;GS3Fp&Pl}-|Bn1bw32^ z#mH$C{T+@G_kr?iQ*;YAoFIfu*l%uGL16iHr*QDVvuwv(^$R?Tcw^J8a$n7STDnEG z6ga}={Ovy!i1YcoUFDim44PL8ezhBH-RHiOp3j$5TN+2`b$XvZp$&ZH59urVj=rZK z=_mS?ey6|K1!l0f*mbtdZn4|!V^(B$S&4nh?kV$;?u&f0JA{&K8!~>8`{ls*xL-$$ z=sf{qa1f&gT8J$m1htY|h9G?ZmwpN)6x)r5(xwuKAJ97daI}P{2_s4VuWesi8l8#Q zebQXC&7NyM~bK$tiMWhmvazUw))B$#v%I9iZHJ zd`4Dq+6ACYGf6lmPO*N{OoEse&M|R%De46v>*FDo;uPz*9Eas@&(?n0F9Me8JJZB+ zb 1 ) - img = rgb2ycbcr(img); - img = img(:, :, 1); - end - - img_list{i} = im2single(img); - end - -end \ No newline at end of file diff --git a/evaluation/utils/bilinear_kernel.m b/evaluation/utils/bilinear_kernel.m deleted file mode 100755 index e321064..0000000 --- a/evaluation/utils/bilinear_kernel.m +++ /dev/null @@ -1,42 +0,0 @@ -function f = bilinear_kernel(k, num_input, num_output) -% ------------------------------------------------------------------------- -% Description: -% create bilinear interpolation kernel for the convt (deconv) layer -% -% Input: -% - k : kernel size k x k -% - num_input : number of input channels -% - num_output : number of output channels -% -% Output: -% - f : bilinear filter -% -% Citation: -% Deep Laplacian Pyramid Networks for Fast and Accurate Super-Resolution -% Wei-Sheng Lai, Jia-Bin Huang, Narendra Ahuja, and Ming-Hsuan Yang -% IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2017 -% -% Contact: -% Wei-Sheng Lai -% wlai24@ucmerced.edu -% University of California, Merced -% ------------------------------------------------------------------------- - - - radius = ceil(k / 2); - - if rem(k, 2) == 1 - center = radius; - else - center = radius + 0.5; - end - - C = 1:k; - f = (ones(1, k) - abs(C - center) ./ radius)' ... - * (ones(1, k) - abs(C - center) ./ radius); - - f = repmat(f, 1, 1, num_input, num_output); - - -end - diff --git a/evaluation/utils/copy_model_weights.m b/evaluation/utils/copy_model_weights.m deleted file mode 100755 index b896fb5..0000000 --- a/evaluation/utils/copy_model_weights.m +++ /dev/null @@ -1,34 +0,0 @@ -function model = copy_model_weights(model, model_trained) -% ------------------------------------------------------------------------- -% Description: -% Copy the weights (parameters) of a pre-trained model to another -% model -% -% Input: -% - model : model to be initialized -% - model_trained : pre-trained model -% -% Output: -% - model : model with copied weights -% -% Citation: -% Fast and Accurate Image Super-Resolution with Deep Laplacian Pyramid Networks -% Wei-Sheng Lai, Jia-Bin Huang, Narendra Ahuja, and Ming-Hsuan Yang -% arXiv, 2017 -% -% Contact: -% Wei-Sheng Lai -% wlai24@ucmerced.edu -% University of California, Merced -% ------------------------------------------------------------------------- - - for i = 1:length(model.params) - - name = model.params(i).name; - idx = model_trained.getParamIndex(name); - model.params(i).value = model_trained.params(idx).value; - - end - - -end \ No newline at end of file diff --git a/evaluation/utils/count_network_parameters.m b/evaluation/utils/count_network_parameters.m deleted file mode 100755 index ff1e59b..0000000 --- a/evaluation/utils/count_network_parameters.m +++ /dev/null @@ -1,31 +0,0 @@ -function N = count_network_parameters(net) -% ------------------------------------------------------------------------- -% Description: -% Count the total number of network parameters -% -% Input: -% - net : network -% -% Output: -% - N : #parameters -% -% Citation: -% Fast and Accurate Image Super-Resolution with Deep Laplacian Pyramid Networks -% Wei-Sheng Lai, Jia-Bin Huang, Narendra Ahuja, and Ming-Hsuan Yang -% arXiv, 2017 -% -% Contact: -% Wei-Sheng Lai -% wlai24@ucmerced.edu -% University of California, Merced -% ------------------------------------------------------------------------- - - N = 0; - for i = 1:length(net.params) - - N = N + numel(net.params(i).value); - - end - - -end \ No newline at end of file diff --git a/evaluation/utils/evaluate_SR.m b/evaluation/utils/evaluate_SR.m index c52bbe5..a0b58c3 100755 --- a/evaluation/utils/evaluate_SR.m +++ b/evaluation/utils/evaluate_SR.m @@ -1,7 +1,7 @@ -function [PSNR, SSIM, IFC] = evaluate_SR(img_GT, img_HR, scale, compute_ifc) +function [PSNR, IFC] = evaluate_SR(img_GT, img_HR, scale, compute_ifc) % ------------------------------------------------------------------------- % Description: -% Compute PSNR, SSIM and IFC for SR +% Compute PSNR and IFC for SR % We convert RGB image to grayscale and crop boundaries for 'scale' % pixels % @@ -37,7 +37,7 @@ % evaluate PSNR = psnr(img_GT, img_HR); - SSIM = ssim(img_GT, img_HR); + %SSIM = ssim(img_GT, img_HR); %SSIM = 0; % comment IFC to speed up testing diff --git a/evaluation/utils/load_list.m b/evaluation/utils/load_list.m deleted file mode 100755 index 7b31252..0000000 --- a/evaluation/utils/load_list.m +++ /dev/null @@ -1,30 +0,0 @@ -function list = load_list(list_name) -% ------------------------------------------------------------------------- -% Description: -% load a list file that each row is a string/name -% -% Input: -% - list_name: file name of the list -% -% Output: -% - list : a cell array -% -% Citation: -% Deep Laplacian Pyramid Networks for Fast and Accurate Super-Resolution -% Wei-Sheng Lai, Jia-Bin Huang, Narendra Ahuja, and Ming-Hsuan Yang -% IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2017 -% -% Contact: -% Wei-Sheng Lai -% wlai24@ucmerced.edu -% University of California, Merced -% ------------------------------------------------------------------------- - - f = fopen(list_name); - if( f == -1 ) - error('%s does not exist!', list_name); - end - C = textscan(f, '%s', 'CommentStyle', '#'); - list = C{1}; - fclose(f); -end \ No newline at end of file diff --git a/evaluation/utils/matlabPyrTools/ChangeLog b/evaluation/utils/matlabPyrTools/ChangeLog deleted file mode 100755 index 04bf1f4..0000000 --- a/evaluation/utils/matlabPyrTools/ChangeLog +++ /dev/null @@ -1,478 +0,0 @@ - Log of changes made to matlabPyrTools code - (important changes marked with **) ------------------------------------------------------------------------ -2009-12-17 Eero Simoncelli - - * Made new tarfile (version 1.4) - - * imStats.m: Now also prints the skew. - -2009-12-17 Rob Young - - * Fixed compilePyrTools.m error messages by making individual - const mxArray arg variables. - -2009-12-17 Rob Young - - * Added compilePyrTools.m to the MEX directory, which takes care - of compiling all C files for the current platform. - -2009-12-17 Rob Young - - * Incorporated HTML versions of tutorials - -2005-07-01 Eero Simoncelli - - * Discovered that innerProd.c is now significantly slower than - just executing M'*M in matlab, due to speedups in recent versions - of matlab! So eliminated the MEX file, and the warning in - innerProd.m. Left innerProd.m behind for backward compatibility. - - -2005-05-04 Eero Simoncelli - - * Fixed blur.m to handle arbitrary size images - -2005-01-03 Eero Simoncelli - - * MEX/Makefile-linux: Added innerProd to Make files - -2004-11-28 Eero Simoncelli - - * blur.m (res): added missing arguments in call to upBlur. - -2004-10-27 Eero Simoncelli - - * mkGaussian.m: MEAN arg can now be 1D. - -2004-10-14 Eero Simoncelli - - * Made new tarfile (version 1.3) - - * Incorporated complex-valued steerable pyramid code (buildSCFpyr, - buildSCFpyrLevs,reconSCFpyr) written by Javier Portilla in 9/97, - and used in our work on texture representation/synthesis - (Portilla&Simoncelli, Int'l Journal of Computer Vision, - 40(1):49-71, Dec 2000). - - * Incorporated imGradient.m from personal code. - - * reagan.pgm out. feynam.pgm in - -2004-03-20 Eero Simoncelli - - * blur.m added (just calls blurDn and then upBlur). - -2003-08-06 Eero Simoncelli - - * blurDn.m (filt): Forced correct scaling of filters in 1D - -2003-05-28 Eero Simoncelli - - * incorporated setPyrBand.m from local code - -2002-10-01 Eero Simoncelli - - * incorporated clip.m from local code - -2002-09-18 Eero Simoncelli - - * pointOp.m: Added the new 'extrap' option for matlab's interp1 to - make this m-file version more compatible with the mex version. - -Wed Aug 28 2002 Eero Simoncelli - - * var2.m: now returns zero (instead of error) for matrix of size 1. - * function VECTORIZE renamed to VECTIFY, since it was colliding - with a function introduced in standard matlab. - -Dec 27 2001 Eero Simoncelli - - * Modified calls to upConv in reconSpyr.m and reconSpyrLevs.m so - that the returned result is bound. Previously, had relied on the - MEX version of upConv to destructively modify the result array, - users had been getting errors because they were using the m-file - version of upConv. - -Wed Sep 19 2001 Eero Simoncelli - - * buildSFpyrLevs/reconSFpyrLevs: replace use of "i" with sqrt(-1), to - avoid problems if user rebinds it! - -Wed Mar 28 10:22:01 2001 Eero Simoncelli - - * Moved innerProd.m and all associated MEX files from the - matlabLocal source tree into matlabPyrTools. - * Added innerProd to Contents.m - * Updated/clarified WARNINGS in all *.m files that have MEX versions. - -Tue Mar 27 11:21:53 2001 Eero Simoncelli - - * Incorporated Windows MEX files (*.dll) into MEX subdirectory. - Windows users should either copy these into the main directory, - or put the MEX subdirectory in their matlab path. - -Fri Mar 23 14:46:16 2001 Eero Simoncelli - - * buildSFpyrLevs.m, reconSFpyrLevs.m: shift the raised-cosine - lookup table (Xrcos) instead of incrementing the log-radial image - (log_rad). THis is more efficient... - -Fri Oct 1 19:37:03 1999 Eero Simoncelli - - * upConv.m: Did not return correct size result when STOP argument - was passed. Thanks to hertzman@mrl.nyu.edu for pointing this out. - -Fri Sep 17 15:53:26 1999 Eero Simoncelli - - * buildSFpyrLevs.m: Changed lutsize to 1024, giving a slight - increase in accuracy. - -Thu Feb 25 18:10:38 1999 Eero Simoncelli - - * histo1.m: Modified histo.m to be more compatible (but still not - exactly the same) as the MEX file version. - -Fri Jun 12 21:15:39 1998 Eero Simoncelli - - * TUTORIALS pyramids.m upgraded. - -Tue Feb 17 13:22:28 1998 Eero Simoncelli - - * showIm.m: Dims are now printed followed by the zoom factor. - -Mon Oct 13 14:49:51 1997 Eero Simoncelli - - * mkSquare.m: Modified to do raised-cosine soft threshold - transitions. - -Tue Oct 7 10:13:51 1997 Eero Simoncelli - - * upConv.m: Argument order was wrong (this function is not used - anyway, unless you don't compile the MEX code). - Thanks to - farid@psyche.mit.edu for pointing this out. - -Thu Sep 25 16:09:49 1997 Eero Simoncelli - - * MEX/wrap.c: Changed #include to , as - suggested by David Brainard. * Incorporated Mac-compiled mex - files, courtesy of David Brainard. - -Sat Sep 6 16:10:25 1997 Eero Simoncelli - - * MEX/convolve.h: abstracted out type of images with typedef image_type. - Added ansi declarations. - -Fri Aug 29 13:49:16 1997 Eero Simoncelli - - ** showIm.m: Modified to behave better under resizing (and printing): - resets axis units to "normalized". - -Thu Aug 28 22:56:52 1997 Eero Simoncelli - - ** MEX/edges.c: reflect1, reflect2, repeat, extend upgraded to work - properly for non-symmetric filters. reflect2 and extend were also - broken for upConv. Added qreflect2 to handle even-length QMF's - which broke under the reflect2 modification. - * Added example code to TUTORIALS/matlabPyrTools to illustrate the - boundary-handling behavior... - -Thu Aug 21 13:34:17 1997 Eero Simoncelli - - * var2, skew2, kurt2: modified to return complex values for complex images. - * imStats.m: now gives an error for complex args. - -Thu Aug 14 15:24:29 1997 Eero Simoncelli - - * Modified shift.m: negated the meaning of the offset parameter, - such that RES=shift(MTX,OFFSET) means RES(POS)=MTX(POS-OFFSET) - (this is more intuitive). - -Thu Jul 10 17:06:52 1997 Eero Simoncelli - - * Modified MEX/Makefile-* to be consistent with matlab5: - - call mex instead of cmex - - use -V4 flag (creating matlab v4 compatible binaries) - - * showIm.m (xlbl_offset): Modified to use "points" units, so that - printed images look correct. Still slightly busted for arbitrary figure - window sizes and for printing. - - * Modified upConv.c: does not return ANYTHING if you pass a result - argument (this had been causing occasional problems with matlab's - memory manager). - -Mon Jun 30 12:09:30 1997 Eero Simoncelli - - * reconSFpyr.m (res): now returns real part (oops). - - * reconSpyrLevs.m (maxLev): got rid of superfluous nbands argument - (can be calculated from bfilts). - -Mon May 26 12:29:54 1997 Eero Simoncelli - - * showIm.m/pgmWrite.m: Modified 'auto3'-scaling to use a - histogram. This gives a significant speedup. - - * fixed a few minor bugs in the TUTORIALS, having to do with - matching image sizes to the machine speed... - -Sat May 10 17:27:25 1997 Eero Simoncelli - - * pgmWrite.m: fixed auto-scaling bug. Added new scaling - calculations, parallel to those of imShow. - -Fri May 9 09:02:56 1997 Eero Simoncelli - - * buildSFpyr.m: Changed NBANDS argument to be ORDER, which is one - less than the number of orientation bands. This is consistent - with the derivative order, and the labels on the spNFilters files. - -Tue May 6 19:08:18 1997 Eero Simoncelli - - ** Added buildSFpyr, reconSFpyr: Steerable pyramids constructed - in the Fourier domain. Radial functions tile, with a - raised-cosine falloff. Angular functions are - cos(theta-k\pi/(K+1))^K, where K is the order (number of bands - minus 1). Compared to the convolution version: - + Reconstruction is exact (within floating point errors) - + Can produce any number of orientation bands. - - Typically slower. - - Boundary-handling must be circular. - Could be made much more efficient by taking advantage of symmetries in - the fft! - - * Added example usage of Fourier steerable pyramid to TUTORIALS/pyramids.m - - * steer.m: fixed for harmonic lists including zero. - -Sun May 4 15:16:10 1997 Eero Simoncelli - - * MEX/Makefile-linux: created. - - * spyrHt, spyrNumBands: Modified to return 0 for pyramids of height 0. - - * reconWpyr.m: utilize desctructive addition in calls to upConv. - - * reconSpyr.m: Added error check to ensure consistancy between - pyramid and filter file. Utilize destructive addition in upConv - call on highpass band. Modified to work properly with pyramids of - height 0. - -Mon Apr 28 13:38:10 1997 Eero Simoncelli - - * lplot.m: modified to handle complex vectors, use standard MatLab - indices, and show minimal axes. Added xrange parameter to allow - adjustment of X axis labeling. - -Sun Apr 27 20:20:41 1997 Eero Simoncelli - - * var2, skew2, kurt2: enhanced to work on complex matrices. - -Sat Apr 26 11:16:12 1997 Eero Simoncelli - - * Changed parent directory (and distribution) name: - matlabImTools -> matlabPyrTools - - * namedFilter.m: Added two more Daubechies filters, and modified - names to match the reference (e.g., daub2 is now a 4-tap filter). - - * Added vectorize.m: trivial function to pack matrix into vector (i.e., - computes mtx(:)). - - * Added upBlur.m: Upsample and blur (parallels blurDn). - -Sun Apr 13 14:23:38 1997 Eero Simoncelli - - * TUTORIALS/pyramids.m: Added plots of Fourier spectra for Wavelet bases. - - * make-tar-file: switched from compress to gzip for the - distribution tarfile. - - * namedFilter.m: Added a few even-length QMF's from Johnston80. - -Fri Apr 11 19:16:21 1997 Eero Simoncelli - - * buildWpyr.m, reconWpyr.m: Modified slightly, so that subsampling - lattice is better for even-length filters. - - * TUTORIALS/pyramids.m: Substantially overhauled. - -Thu Apr 10 15:20:23 1997 Eero Simoncelli - - * blurDn.m: added this function to downsample an image by a factor - 2^L. - - * Fixed minor bug in upConv.m: errors in image size checking. - -Mon Apr 7 13:25:37 1997 Eero Simoncelli - - * Changed TUTORIALS/matlabImTools.m to use histo.mex instead of - matlab's hist. - -Wed Apr 2 13:20:55 1997 Eero Simoncelli - - ** Incorporated Denis Pelli's ThinkC and MetroWorks projects for - Macintosh versions of the MEX code, along with MEX binaries. These - are included as an HQX'ed self-extracting archive - (Macintosh-MEX.sit.hqx), in the MEX subdirectory. - -Tue Apr 1 15:35:31 1997 Eero Simoncelli - - * edges.c: modified by Denis Pelli to support THINK C. * edges.c: - - * histo.c, upConv.c, corrDn.c: minor changes in error message - printouts, to work around bugs in THINK C. - - * Included Denis Pelli's MacReadMe file in the MEX subdirectory, - which gives instructions for MEX file compilation on a MacIntosh - (PPC or 68k). - - * wrap.c, convolve.c, edges.c: added explicit int function - declarations, and return values. - - * range2.m/range2.c: A MEX function for fast min/max computation. - Adjusted entropy2.m, histo.m, imStats.m, pgmWrite.m, showIm.m, - showLpyr.m, showSpyr.m, showWpyr.m to call it. - -Thu Mar 27 17:23:05 1997 Eero Simoncelli - - ** histo.m/histo.c: Added MEX function HISTO, a fast replacement - for matlab's HIST function. Modified histoMatch.m, entropy2.m to - call it. - - * Changed main directory name to matlabImTools. - - * Added TUTORIALS/README file. - -Wed Mar 19 14:19:51 1997 Eero Simoncelli - - * Changed directory name: MEX_SRC -> MEX - -Wed Mar 12 17:00:03 1997 Eero Simoncelli - - * mkGaussian.m: fixed another (X,Y) bug: both dimensions and - cov/mean are now specified in [y,x] order. - -Tue Mar 11 19:08:17 1997 Eero Simoncelli - - * showSpyr.m: Fixed a bug that was dropping display of one - orientation band when there were more than 2 of them! - -Mon Mar 10 19:08:24 1997 Eero Simoncelli - - * Added shift.m - - * makeSteerMtx -> steerDir2HarmMtx - - * Added TUTORIALS/matlab-EPS.m: examples using the code in this - distribution. - -Sun Mar 9 17:49:18 1997 Eero Simoncelli - - ** showIm.m: - - args: changed order so that NSHADES is last. - - TITLES: Can now pass a string for IM, which will be evaluated - in the global environment to get the matrix. The string is - used as a title. MATLAB v.5 ONLY!!! - - Added 'auto3' RANGE value, that scales based on percentiles. - THis is more robust to outliers than 'auto2' or 'auto1'. - - * pixelAxes.m: Made a more serious attempt to reverse-engineer - Mathworks' image pixelization. It is improved, but still makes - occasional errors. - - * Added skew2.m. - -Fri Mar 7 10:11:07 1997 Eero Simoncelli - - * pixelAxes.m: Modified to take an optional - ZOOM argument. Fixed dimension ordering bug - (positions are reported (x,y), but mtx dims are (y,x)!) - - * showIm.m: Added an optional ZOOM argument. - -Thu Mar 6 14:17:19 1997 Eero Simoncelli - - * Added showLpyr, showWpyr, showSpyr. Modified - TUTORIALS/pyramids.m to use them. - - * added pixelAxes.m: Adjusts size (in pixels) of currently - displayed image to be a multiple of the matrix dimensions, - thus eliminating display aliasing artifacts. - This is now called by all the "show" commands. - -Mon Mar 3 17:33:25 1997 Eero Simoncelli - - * Fixed bug in pgmWrite (dimensions were written in reverse order). - - * Fixed bug in showIm (X and Y coords were swapped on label display). - - * Fixed bug in reconLpyr (swapped X and Y coords on int_sz) - - * Changed calls to "reshape" to pass dimensions individually -- - older version of matlab do not accept the reshape(mtx,[y x]) form. - - * Fixed bug in mkDisc: sz a scalar. - - * Added ifftshift.m - -Fri Feb 28 11:07:20 1997 Eero Simoncelli - - * Re-worked TUTORIALS/pyramids.m - - * buildGpyr and buildLpyr now use 1+maxPyrHt for default height. - - * Fixed buildGpyr to work on 1D signals. - - ** Gaussian/Laplacian/Wavelet pyramid build and recon functions: - - work properly with new corrDn/upConv. - - use separable convolutions - - use destructive modification ability of upConv (less memory - allocation) - - * modulateFlipShift -> modulateFlip. - - * added lpyrHt, wpyrHt, spyrHt to return number of levels in a pyramid. - -Thu Feb 27 15:39:53 1997 Eero Simoncelli - - * Changed angular coordinate systems to CLOCKWISE in mkRamp, - mkTheta, mkSine, mkSquare. This is unnatural for screen viewing, - but consistent with an origin in the upper left corner of the - image, which is the way one addresses the underlying matrix. - - * mkSine and mkSquare can now take a frequency vector or the - period and direction args - -Tue Feb 25 11:58:33 1997 Eero Simoncelli - - ** Rewrote corrDn/upConv C routines: - - more efficient - - changed START parameters to have [1 1] origin, consistent with - matlab - - added STOP parameters - - upConv allows destructive modification of a result arg - - changed order of other params (sorry) - - wrote test file conv_test.m - * wrote zconv2.m - -Wed Aug 19 20:39:15 1996 Eero Simoncelli (eero@tarpon.cis.upenn.edu) - - ** Added "pointOp" function (MUCH faster than interp1). - ** Added "histoMatch" function. - -Fri Aug 2 00:56:31 1996 Eero Simoncelli (eero@tarpon.cis.upenn.edu) - - * Changed all function/file-names to be of the form "fooBar". * - Fixed entropy2.m (busted due to typo). - -Most matlab code was developed from 1992-1996, while the author was an -assistant professor of Computer and Information Science at University of -Pennsylvania. - -Original convolution code was written in Spring 1986, and comes from -OBVIUS (Object-Based Vision and Image Understanding System), an -interactive image-processing system written in Common Lisp (with calls -to C code). - diff --git a/evaluation/utils/matlabPyrTools/Contents.m b/evaluation/utils/matlabPyrTools/Contents.m deleted file mode 100755 index f9948f4..0000000 --- a/evaluation/utils/matlabPyrTools/Contents.m +++ /dev/null @@ -1,109 +0,0 @@ -% matlabPyrTools: Image and Multi-scale Pyramid Tools -% Version: 1.4, December-2009. -% Created: Early Spring, 1996. -% Author: Eero Simoncelli, eero.simoncelli@nyu.edu -% -% See README file for brief description. -% See ChangeLog file for latest modifications. -% See TUTORIALS subdirectory for demonstrations. -% Type "help matlabPyrTools" to see this file as documentation. -% Type "help " for documentation on individual commands. -% ----------------------------------------------------------------- -% Synthetic Images (matrices): -% mkImpulse - Make an image containing an impulse. -% mkRamp - Make an image containing a ramp function. -% mkR - Make an image containing distance from the origin. -% mkAngle - Make an image containing angle about origin. -% mkDisc - Make an image containing a disk image. -% mkGaussian - Make an image containing a Gaussian function. -% mkZonePlate - Make an image containing a zone plate (cos(r^2)). -% mkAngularSine - Make an image containing an angular sine wave (pinwheel). -% mkSine - Make an image containing a sine grating. -% mkSquare - Make an image containing a square grating. -% mkFract - Make an image containing fractal (1/f) noise. -% -% Point Operations: -% clip - clip values to a range. -% pointOp - Lookup table (much faster than interp1) [MEX file] -% histo - Efficient histogram computation [MEX file] -% histoMatch - Modify matrix elements to match specified histogram stats. -% -% Convolution (first two are significantly faster): -% corrDn - Correlate & downsample with boundary-handling [MEX file] -% upConv - Upsample & convolve with boundary-handling [MEX file] -% blurDn - Blur and subsample a signal/image. -% upBlur - Upsample and blur a signal/image. -% blur - Multi-scale blurring, calls blurDn and then upBlur. -% cconv2 - Circular convolution. -% rconv2 - Convolution with reflected boundaries. -% zconv2 - Convolution assuming zeros beyond image boundaries. -% -% General pyramids: -% pyrLow - Access lowpass subband from (any type of) pyramid -% pyrBand - Access a subband from (any type of) pyramid -% setPyrBand - Insert an image into (any type of) pyramid as a subband -% pyrBandIndices - Returns indices for given band in a pyramid vector -% maxPyrHt - compute maximum number of scales in a pyramid -% -% Gaussian/Laplacian Pyramids: -% buildGpyr - Build a Gaussian pyramid of an input signal/image. -% buildLpyr - Build a Laplacian pyramid of an input signal/image. -% reconLpyr - Reconstruct (invert) the Laplacian pyramid transform. -% -% Separable orthonormal QMF/wavelet Pyramids: -% buildWpyr - Build a separable wavelet representation of an input signal/image. -% reconWpyr - Reconstruct (invert) the wavelet transform. -% wpyrBand - Extract a single band of the wavelet representation. -% wpyrLev - Extract (packed) subbands at a particular level -% wpyrHt - Number of levels (height) of a wavelet pyramid. -% -% Steerable Pyramids: -% buildSpyr - Build a steerable pyramid representation of an input image. -% reconSpyr - Reconstruct (invert) the steerable pyramid transform. -% buildSFpyr - Build a steerable pyramid representation in the Fourier domain. -% reconSFpyr - Reconstruct (invert) the (Fourier domain) steerable pyramid transform. -% spyrBand - Extract a single band from a steerable pyramid. -% spyrHigh - Highpass residual band. -% spyrLev - A whole level (i.e., all images at a given scale) of a steerable pyramid. -% spyrHt - Number of levels (height) of a steerable pyramid. -% spyrNumBands - Number of orientation bands in a steerable pyramid. -% -% Steerable filters / derivatives: -% imGradient - Compute gradient of image using directionally accurete filters. -% steer - Steer filters (or responses). -% steer2HarmMtx - Construct a matrix mapping direcional basis to angular harmonics. -% -% Filters: -% binomialFilter - returns a filter of binomial coefficients. -% namedFilter - some typical Laplacian/Wavelet pyramid filters -% spNFilters - Set of Nth order steerable pyramid filters. -% derivNFiltersS - Matched set of S-tap 1D derivatives, orders 0 to N. -% -% Display: -% showIm - Display a matrix (real or complex) as grayscale image(s). -% Displays dimensions, subsampling, and range of pixel values. -% showLpyr - Display a Laplacian pyramid. -% showWpyr - Display a separable wavelet pyramid. -% showSpyr - Display a steerable pyramid. -% lplot - "lollipop" plot. -% nextFig - Make next figure window current. -% pixelAxes - Make image display use an integer number of pixels -% per sample to avoid resampling artifacts. -% -% Statistics (for 2D Matrices): -% range2 - Min and max of image (matrix) [MEX file] -% mean2 - Sample mean of an image (matrix). -% var2 - Sample variance of an image (matrix). -% skew2 - Sample skew (3rd moment / variance^1.5) of an image (matrix). -% kurt2 - Sample kurtosis (4th moment / variance^2) of an image (matrix). -% entropy2 - Sample entropy of an image (matrix). -% imStats - Report sample statistics of an image, or pair of images. -% -% Miscellaneous: -% pgmRead - Load a "pgm" image into a MatLab matrix [try einstein.pgm,feynman.pgm] -% pgmWrite - Write a MatLab matrix to a "pgm" image file. -% shift - circular shift a 2D matrix by an arbitrary amount. -% vectify - pack matrix into column vector (i.e., function to compute mtx(:)). -% ifftshift - inverse of MatLab's FFTSHIFT (differs for odd-length dimensions) -% rcosFn - return a lookup table of a raised-cosine threshold fn. -% innerProd - Compute M'*M efficiently (i.e., do not copy) [MEX file] diff --git a/evaluation/utils/matlabPyrTools/MEX/-MacReadMe b/evaluation/utils/matlabPyrTools/MEX/-MacReadMe deleted file mode 100755 index 898dc0c..0000000 --- a/evaluation/utils/matlabPyrTools/MEX/-MacReadMe +++ /dev/null @@ -1 +0,0 @@ -MacReadMe How to compile a MEX file for Macintosh (Based on a similar note written by David Brainard and Denis Pelli to accompany the Psychophysics Toolbox.) A MEX file (short for "MATLAB extension") contains code that implements a new MATLAB function, allowing users to use the full power of the C language and the Macintosh hardware and operating system in implementing a new MATLAB function. This document explains how to produce a MEX file that is "fat" (i.e. will run as native code on both 68K and PowerPC Macs) and is compatible with both MATLAB 4 and 5. 1) To produce a MATLAB MEX file with PowerPC code you must have the Metrowerks CodeWarrior C compiler (version 10 or better, abbreviated as CW below). To produce 68K code we still use the Symantec THINK C compiler (version from Symantec C++ 8 CD-ROM release 5), but we will soon be switching to Metrowerks CodeWarrior. (See note A below.) 2) Place a copy of the MATLAB 4:Extern folder, supplied by Mathworks, on your compiler's search path. We suggest that you name the copy "MEX V4". (See notes B and C, below.) 3) Build any of the MEX files simply by opening its project file and asking your compiler to "Build Code Resource" (in THINK C) or to "Make" it (in CW). For each MEX file, e.g. histo.mex, there are two associated projects, e.g. histo.µ for CW, and histo.¹.4 for THINK C. To build a "fat" MEX, that runs native on both 68K and PowerPC, you should first compile in THINK C, and then in CW. (See note A, below.) Denis Pelli April 2, 1997 Notes A) The Mathworks support only the THINK C compiler to make 68K MEX code for MATLAB version 4 and only the CW compiler to make PPC MEX files for MATLAB 4 and both 68K and PPC for MATLAB 5. This archive includes THINK and CW projects. To build a fat MEX file for MATLAB 4, first "make" the THINK C version (e.g. histo.¹.4), producing a file with a .rsrc extension (e.g. histo.µ.rsrc). This is the 68K MEX file. When you then "make" histo.µ, the CW project incorporates the .rsrc file and generates a "fat" MEX file that will run native (i.e. fast) on both 68K and PowerPC. To make a 68K-only MEX file, simply rename, e.g., histo.µ.rsrc to histo.mex after you make the THINK project, and set the file type and creator to match the other MEX files. THINK C is slow and hard to work with. Symantec hasn't significantly upgraded in it many years. There is an error in the math.h header (version from Symantec C++ 8 CD-ROM release 5). We fix that error by some tricky preprocessor defines and undefines in the THINK C Prefix in each of the THINK projects. B) The easiest way to put a folder on your compilerÕs search path is simply to put the folder in the same folder as the compiler itself. If you want to use both CW and THINK C, then put the folder under CW, make an alias of it, and put the alias in THINK C's "Aliases" folder. C) Happily, MATLAB 5 is capable of running both V4 and V5 MEX files. Thus we are currently distributing sources that compile into V4 MEX files. The resulting MEX files run both under V4 and V5. In the future we will drop support for V4 and THINK C. (See note A above.) \ No newline at end of file diff --git a/evaluation/utils/matlabPyrTools/MEX/compilePyrTools.m b/evaluation/utils/matlabPyrTools/MEX/compilePyrTools.m deleted file mode 100755 index a4c8ed4..0000000 --- a/evaluation/utils/matlabPyrTools/MEX/compilePyrTools.m +++ /dev/null @@ -1,15 +0,0 @@ -% This is a script file for compiling the mex versions of the Steerable -% Pyramid Tools. -% -% Usage:>> compilePyrTools -% -% Tested for gcc and lcc. -% -% Rob Young, 9/08 - -mex upConv.c convolve.c wrap.c edges.c -mex corrDn.c convolve.c wrap.c edges.c -mex histo.c -%mex innerProd.c -mex pointOp.c -mex range2.c diff --git a/evaluation/utils/matlabPyrTools/MEX/convolve.c b/evaluation/utils/matlabPyrTools/MEX/convolve.c deleted file mode 100755 index 60a11a4..0000000 --- a/evaluation/utils/matlabPyrTools/MEX/convolve.c +++ /dev/null @@ -1,325 +0,0 @@ -/* -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; File: convolve.c -;;; Author: Eero Simoncelli -;;; Description: General convolution code for 2D images -;;; Creation Date: Spring, 1987. -;;; MODIFICATIONS: -;;; 10/89: approximately optimized the choice of register vars on SPARCS. -;;; 6/96: Switched array types to double float. -;;; 2/97: made more robust and readable. Added STOP arguments. -;;; 8/97: Bug: when calling internal_reduce with edges in {reflect1,repeat, -;;; extend} and an even filter dimension. Solution: embed the filter -;;; in the upper-left corner of a filter with odd Y and X dimensions. -;;; ---------------------------------------------------------------- -;;; Object-Based Vision and Image Understanding System (OBVIUS), -;;; Copyright 1988, Vision Science Group, Media Laboratory, -;;; Massachusetts Institute of Technology. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -*/ - -#include -#include -#include "convolve.h" - -/* - -------------------------------------------------------------------- - Correlate FILT with IMAGE, subsampling according to START, STEP, and - STOP parameters, with values placed into RESULT array. RESULT - dimensions should be ceil((stop-start)/step). TEMP should be a - pointer to a temporary double array the size of the filter. - EDGES is a string specifying how to handle boundaries -- see edges.c. - The convolution is done in 9 sections, where the border sections use - specially computed edge-handling filters (see edges.c). The origin - of the filter is assumed to be (floor(x_fdim/2), floor(y_fdim/2)). ------------------------------------------------------------------------- */ - -/* abstract out the inner product computation */ -#define INPROD(XCNR,YCNR) \ - { \ - sum=0.0; \ - for (im_pos=YCNR*x_dim+XCNR, filt_pos=0, x_filt_stop=x_fdim; \ - x_filt_stop<=filt_size; \ - im_pos+=(x_dim-x_fdim), x_filt_stop+=x_fdim) \ - for (; \ - filt_pos -#include - -#define ABS(x) (((x)>=0) ? (x) : (-(x))) -#define ROOT2 1.4142135623730951 -#define REDUCE 0 -#define EXPAND 1 -#define IS == -#define ISNT != -#define AND && -#define OR || - -typedef int (*fptr)(); - -typedef struct - { - char *name; - fptr func; - } EDGE_HANDLER; - -typedef double image_type; - -fptr edge_function(char *edges); -int internal_reduce(image_type *image, int x_idim, int y_idim, - image_type *filt, image_type *temp, int x_fdim, int y_fdim, - int x_start, int x_step, int x_stop, - int y_start, int y_step, int y_stop, - image_type *result, char *edges); -int internal_expand(image_type *image, - image_type *filt, image_type *temp, int x_fdim, int y_fdim, - int x_start, int x_step, int x_stop, - int y_start, int y_step, int y_stop, - image_type *result, int x_rdim, int y_rdim, char *edges); -int internal_wrap_reduce(image_type *image, int x_idim, int y_idim, - image_type *filt, int x_fdim, int y_fdim, - int x_start, int x_step, int x_stop, - int y_start, int y_step, int y_stop, - image_type *result); -int internal_wrap_expand(image_type *image, image_type *filt, int x_fdim, int y_fdim, - int x_start, int x_step, int x_stop, - int y_start, int y_step, int y_stop, - image_type *result, int x_rdim, int y_rdim); diff --git a/evaluation/utils/matlabPyrTools/MEX/corrDn.c b/evaluation/utils/matlabPyrTools/MEX/corrDn.c deleted file mode 100755 index d02e272..0000000 --- a/evaluation/utils/matlabPyrTools/MEX/corrDn.c +++ /dev/null @@ -1,145 +0,0 @@ -/* -RES = corrDn(IM, FILT, EDGES, STEP, START, STOP); - >>> See corrDn.m for documentation <<< - This is a matlab interface to the internal_reduce function. - EPS, 7/96. -*/ - -#define V4_COMPAT -#include /* Matlab matrices */ -#include - -#include "convolve.h" - -#define notDblMtx(it) (!mxIsNumeric(it) || !mxIsDouble(it) || mxIsSparse(it) || mxIsComplex(it)) - -void mexFunction(int nlhs, /* Num return vals on lhs */ - mxArray *plhs[], /* Matrices on lhs */ - int nrhs, /* Num args on rhs */ - const mxArray *prhs[] /* Matrices on rhs */ - ) - { - double *image,*filt, *temp, *result; - int x_fdim, y_fdim, x_idim, y_idim; - int x_rdim, y_rdim; - int x_start = 1; - int x_step = 1; - int y_start = 1; - int y_step = 1; - int x_stop, y_stop; - const mxArray *arg0,*arg1,*arg3,*arg4; - double *mxMat; - char edges[15] = "reflect1"; - - if (nrhs<2) mexErrMsgTxt("requres at least 2 args."); - - /* ARG 1: IMAGE */ - arg0 = prhs[0]; - if notDblMtx(arg0) mexErrMsgTxt("IMAGE arg must be a non-sparse double float matrix."); - image = mxGetPr(arg0); - x_idim = (int) mxGetM(arg0); /* X is inner index! */ - y_idim = (int) mxGetN(arg0); - - /* ARG 2: FILTER */ - arg1 = prhs[1]; - if notDblMtx(arg1) mexErrMsgTxt("FILTER arg must be non-sparse double float matrix."); - filt = mxGetPr(arg1); - x_fdim = (int) mxGetM(arg1); - y_fdim = (int) mxGetN(arg1); - - if ((x_fdim > x_idim) || (y_fdim > y_idim)) - { - mexPrintf("Filter: [%d %d], Image: [%d %d]\n",x_fdim,y_fdim,x_idim,y_idim); - mexErrMsgTxt("FILTER dimensions larger than IMAGE dimensions."); - } - - /* ARG 3 (optional): EDGES */ - if (nrhs>2) - { - if (!mxIsChar(prhs[2])) - mexErrMsgTxt("EDGES arg must be a string."); - mxGetString(prhs[2],edges,15); - } - - /* ARG 4 (optional): STEP */ - if (nrhs>3) - { - arg3 = prhs[3]; - if notDblMtx(arg3) mexErrMsgTxt("STEP arg must be a double float matrix."); - if (mxGetM(arg3) * mxGetN(arg3) != 2) - mexErrMsgTxt("STEP arg must contain two elements."); - mxMat = mxGetPr(arg3); - x_step = (int) mxMat[0]; - y_step = (int) mxMat[1]; - if ((x_step<1) || (y_step<1)) - mexErrMsgTxt("STEP values must be greater than zero."); - } - - /* ARG 5 (optional): START */ - if (nrhs>4) - { - arg4 = prhs[4]; - if notDblMtx(arg4) mexErrMsgTxt("START arg must be a double float matrix."); - if (mxGetM(arg4) * mxGetN(arg4) != 2) - mexErrMsgTxt("START arg must contain two elements."); - mxMat = mxGetPr(arg4); - x_start = (int) mxMat[0]; - y_start = (int) mxMat[1]; - if ((x_start<1) || (x_start>x_idim) || - (y_start<1) || (y_start>y_idim)) - mexErrMsgTxt("START values must lie between 1 and the image dimensions."); - } - x_start--; /* convert from Matlab to standard C indexes */ - y_start--; - - /* ARG 6 (optional): STOP */ - if (nrhs>5) - { - if notDblMtx(prhs[5]) mexErrMsgTxt("STOP arg must be double float matrix."); - if (mxGetM(prhs[5]) * mxGetN(prhs[5]) != 2) - mexErrMsgTxt("STOP arg must contain two elements."); - mxMat = mxGetPr(prhs[5]); - x_stop = (int) mxMat[0]; - y_stop = (int) mxMat[1]; - if ((x_stopx_idim) || - (y_stopy_idim)) - mexErrMsgTxt("STOP values must lie between START and the image dimensions."); - } - else - { - x_stop = x_idim; - y_stop = y_idim; - } - - x_rdim = (x_stop-x_start+x_step-1) / x_step; - y_rdim = (y_stop-y_start+y_step-1) / y_step; - - /* mxFreeMatrix(plhs[0]); */ - plhs[0] = (mxArray *) mxCreateDoubleMatrix(x_rdim,y_rdim,mxREAL); - if (plhs[0] == NULL) mexErrMsgTxt("Cannot allocate result matrix"); - result = mxGetPr(plhs[0]); - - temp = mxCalloc(x_fdim*y_fdim, sizeof(double)); - if (temp == NULL) - mexErrMsgTxt("Cannot allocate necessary temporary space"); - - /* - printf("i(%d, %d), f(%d, %d), r(%d, %d), X(%d, %d, %d), Y(%d, %d, %d), %s\n", - x_idim,y_idim,x_fdim,y_fdim,x_rdim,y_rdim, - x_start,x_step,x_stop,y_start,y_step,y_stop,edges); - */ - - if (strcmp(edges,"circular") == 0) - internal_wrap_reduce(image, x_idim, y_idim, filt, x_fdim, y_fdim, - x_start, x_step, x_stop, y_start, y_step, y_stop, - result); - else internal_reduce(image, x_idim, y_idim, filt, temp, x_fdim, y_fdim, - x_start, x_step, x_stop, y_start, y_step, y_stop, - result, edges); - - mxFree((char *) temp); - return; - } - - - diff --git a/evaluation/utils/matlabPyrTools/MEX/corrDn.mexa64 b/evaluation/utils/matlabPyrTools/MEX/corrDn.mexa64 deleted file mode 100755 index dad4651473790ff327a5321279b920cfd482f48d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30225 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 ZzohRFT0cFQ{7u3%9}A>U{w25me*n@|Z3h4V diff --git a/evaluation/utils/matlabPyrTools/MEX/corrDn.mexglx b/evaluation/utils/matlabPyrTools/MEX/corrDn.mexglx deleted file mode 100755 index 7a1decd4814db50995481ca327ac7664b4bdf951..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27007 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 diff --git a/evaluation/utils/matlabPyrTools/MEX/corrDn.mexmac b/evaluation/utils/matlabPyrTools/MEX/corrDn.mexmac deleted file mode 100755 index 75a5407e4fcead5aeda0f956ff80b681f39915c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30168 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 diff --git a/evaluation/utils/matlabPyrTools/MEX/corrDn.mexmaci64 b/evaluation/utils/matlabPyrTools/MEX/corrDn.mexmaci64 deleted file mode 100755 index 291afad64b4ab794ccc5686c4b0af126f8ca4dcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30192 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 Ba(@5- diff --git a/evaluation/utils/matlabPyrTools/MEX/corrDn.mexw32 b/evaluation/utils/matlabPyrTools/MEX/corrDn.mexw32 deleted file mode 100755 index 51406514657a70eac04c1815ce3aa3845df5ab5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25088 zcmeHP4Rl;pwZ4<2G{BS@A!5Ynn_|%RrPibq+Wdj3bf8EJm8O)xP(m_oQu9+LbK8Qs zP?+dqybbNc3dPljMT&M|)h_AcMJ>Ka^K8MuioWRNKmN>@u;gLnR{ zS!WfRL$B~C$}-y-%FJU$S6NRRR?eAyw#_y}S%wy;XkGdtv%G=pPHxXq6q~rs{Bv%LK@p$VCeu|bO3(ZzLCAC7V$S{g zWV&04&gX4zt2gIv$>5e`I+vnk&G$tzL(Fg9h^y_o=4feo9 z%asx%yIjpySCLMSU?=^JH%1R}I@{P_IC*ea$U59aYrdMskTpueIx*+!NKzquLVmjOiX{&@5TPbYR^7nS9oUj)tLI5#`mvO6if)^H;hNQJdSeI z_y(7wjTO{U9W(Ag{jpqB8q2t4+*n5~If<62u?j7L-r~pXXw)yETW7}nXRlXQ8{7C! zu6_yKLZg!!?-Y&3jo@_6vxgq#dp-V{D~v+ix#3ZI8YG8$9@lw5uIEtwkirw`jULq| z*6N;#Eq(U2P|DGk@t10&M_VRzPxM)nW+V@4JnV_$L5lIvQq1^Juy!;udrQ^Fsp%4b zcFYqEzFgAt)<>WH%MVT*?OHq$JbXo0L8VEcsK3#*=oMX6PZN1i8;PkSJkAXe-D6Jh z8PLWQH3tgYsAJ%ow6TKPc>H0-F?HOy0bJamt7E|&w&*i^)T~IwN?jX^m0m&*F}8pp z(3>0ZjOFO7#=8p6i}Uhrebw0EoDUNf{qaH~%^o6oaIMx-^36Q&F{ldyTz)FQtf7|HbNZTonvy- zWj4#)v?RANH@7FX32w^GHj^8jxLGCI=!tJ4Lcl@`dJa&n->MB$?FFkA(zVfYZTRk7 zT^lLaLU-X|unuq>imAhm>uJbyc*wlQ3aY#zI+CF8T8Np%Hsua5035Z&{l zZM_33T5ZzZ&TV$|&34@XDip?&u$z(yn4`#&s84QVNvun16O#C>*=9=O&D+7jRice% zJFvu5FIE2Ato$N4cH*_5XOFJ!3BliPT@o0Hna zbgRuabGrA^({2`RG{aXflcsyztfWo1mU?|E(d)2Dm^|GZPV#ietm$4U>QSupK+M*0 zZlyMQ_bfOUs?4a=M(&!`_(>Z0c`;g`Wy}_6iP|898IJo;3L(Tc0*o6)n@KVJc~c0wnit!cXN1gpnjDT&-%lj!Z#!)cHKox$!DgXz?0Pa6@hY z2vHJK_s7)!n0h>>Mq}zgOf>+m!db*r_!;3lx{YVxj|07>k%ctEDLeHg^*bLH66mdp zseQ(If@OgW0xL(B0uOYp0PMSh8kU^Prq28+x+sxsz1F2`&bcoKwZVW^Ah#Dl4%80G z&(YO+MQUNPZ2M*U89%jQxM1xOd2p+-NB0!`I1Be#R|j>ED^Y{XuQu8WgwdH2J*yi5 zQY<`h2D!R}bG1TU>z=C>b9o+@%V0d^+C1$HU7N=o4wh?WR4cifm-b3l{+7onFHb-1pmHEgB4axZ_^SSbF2eve+^f%4AaPB>eAe{u29l z$n3udwv##o$JQ^iUWCchEXbxDTUVns{B)8gGMiMAGE!zU?KXD$*$CTP#B=P2PnoNQ z!ZYFVOk0yzP7xd}mP}@wGu1Q*Pd)8cmg;_JJD+hmPsZOopqYuw z`EonZtBP?spe5)ns0IEeh^mayRqk63~WPcqfUBIbG3R3?Paj&kH zr6aW~1)X_$NKEolk@<_8c&jh@r9X*%3PI8D!2W4-bW3;bhxI`2GNz%>XQvtzrAlIP4h} zr1=PTB8Y&8vnk3QiBu3!dq(u-cG@6V)vbFBeYq25C|Iw0NLRaua!xR~=Oyy(QRLer zNF~b{d{)OrEAgX4uosEVDVxpO>w^ zm?5qg%6Dx25KgDUKThae7HFEnuSzJK1!^fAOC4K!dezT{a$Y>8lG6qH{mB>>N+y9u z?zD_BjiJw*qMT!@S2grnDE7(IDYidNu}@9Lhfpj>Wm_c0rm>P_Y43tyCbcx7Nx!5? z_zP&Vk~DcNp-I^c)3|+qmoAxMcz3~xP^df&%I+bF5JlvRBJRE<4o zhi`x`L~jY`0*)Pz+{T^^06P-#Fm9DfxK$?OR#(*tITszpO99EbXcCG&DIAM4fnpD0 zA2|iNZYFCBPK{9D+>}cc$(CO4IiDWQK&c+3S6E3JfKTkbsSr%DX0~BqJ2+ZI#q3 zpzTuxZ6gWwX0XsSA-=CGoGdi_&LnGs+_Wxlk}OB{DIPLSc<TM1DXLr$VT$;=D^+O24b-eyhe~ul^LjL7h0S+h;fw;GYck&Z@hR= zu8ntuBcHY?&KDGV?KslAp`2sMguj>Lf;sZT4eUEBcjfA}d4Y&6@-eDuXA?t|+=e1E zt!>`gP_Pzf&G}55Z_?&7tw@9iiB@Efwb&}g+)e_74|_&fCzt^Imo)*(^bDM#c7#p# z*~>*EH}E?YO2^Vl&Csv`JkG*7j?F$&>S!RQbX-uW*)_ZX5zVHf+XB6IOqwrVv*1(P zaipT<+E@p+gOS~i+bH_M^Ts>ACCi~%mP5#rgPrC!gU{20wIkMyorzX!Zl{!7A4!8Z z1N7RyVC}FqPA176A=)D(CcPE`laL(ZBxu5+d+hOe>`=ssDqfRFv;=E$&JQhsE)lme zoimBf8nyqh=eVU0ykcSL<2dvYLZ00b#(}@$_)0bWYg{t}MRYnH4PU@cSEvMsH6zeU z_|F(DphcCATxbNRu@U+_f!7RhE{kpIUecILBIt<|^nf6EvZ%HvBHuq4zkiSiI2b&6 z;-!E#$`2R~Y6s~4C_Uf+45~;wKo6KL5$ul>AZY@@{-D+!kqP$23HC9;J{qh$_;R+^ z4S6Jx6>s(FwYj03*W(8bDaPg4n$7+xZeS4LxMS-v!l%{QB$ffCV+L~2$V_Z}&^&^* zQ0g!@4pZZ>XdEUez400CC4WV#fRgr5 z>o`qr553k%tz$uLH?@vY>u#Fz-jpft$yRqK&$%I#(v+hqw`11 zTb|6=P#o3jq&gY zDtWI}lJNO-@QHUj#R)C4J3A+MZ_&4E3QBrvDYpuYbO07Ig28diiD!uBLq4@S;Jovj(m z`=IIL*>}zcKRAISLXNgUXy-MIaQgs-(wJK}MpZJcywe8EB6N&2?wOds5inovrRlVV{m; z1?z@m8|@W}uQbpb((xIIw}0YJ70MK$^(unEKb=;i2blu#$4Hn0a31(wQ!a<9EFI(% zBP<7CD(4d;B!?Z6a<|8`jO`?yohj1Uk*#h|kq&*kBS{ow=j+T3NZB#QxS4_V3G9J5$(yN6H=HWeUxXIJR9cA|4Ay;~Kvh?FpY97-^8>^ucL$ z&8LjhGrMNuX9^oFcxmz-Y_y!hi6eE6JMrh>_mZ9Xci9u-n?#CZ>msa!N^Q{5HQ!nr z*eXO6I2t~a8+b$PGqfQ#2aY|PH^e62!3fiK6qc2)j?SG3Oeh^^qg13G52^E0r3Z&2GG$xOOOCf!q{?IAbL2|+3vr`i`J`ZwFxQ~W+_ zJc7YeMvk`}Uw#aK7^l~Au%h*ebPnGt%b4R)aD#A%Vwp?XJShqQWKJnv;=GOF?4Shp zoJ29$BZ-P{`Ee4(vC09mw}UD6)}5^$NWlYZ%P)@X1ZN`0`x@IAjtoPNPWo;-vc!Uh;gaBAA;=-eTE18h!LkBE&-Ha)T1{63rB>69l-?*OYw zn4Z{ePS)m>7S8)%dYP0&yUpg?mE;E!Ize_o9znc>2Lu}lKggPsG(_(+oYF>Im3MbVzSO~S*lxaVN0WPN_wrrn%yNlyR>Iw#^Uuaex_M7pE=CW#GAx%S^RX! zGaOP4D90L>woZ~DGqij-ek2(0cPx?a+%vKTTurtGHDakR!xoegH;7>@B->qQ;TWDG zY&##z#}dc#Dcey9G4h!@pQxQgozK+bU_N8kgZyN&gJ5xv5YI}EkWqYuy^sj00UT)u zzwC4P;MY92r5Mk}ZVK5b_MF)LFhMu%Z*$%t-{&ZW?_;M4C&!#E@Rk(%V=F3ss~!)K z&vm6!P(G~W&`~CkHb|J@Gy!9dm5`)aWZJ>6*y$g_S||VKr&qP$#3P@?qA@LJMh6m@ zke$D=W*U#MYWNC-kR87vtMHfd&i`0sHm?-U3Nmygen4ox;V?j+1mBSt%7n2}Xv=GC z=a6S`$g?xFd?$USeK6pmLw?rnG2FqAA`KN38b_d4{65W4?e-zhc2Lo1@plBoXkzu; zH{|Ib^4u3%ejkm7cc$gh`pwbqv_{)9Z$5T`KR8$~&df)Sg^V zt!+|#iqE^Y*<0_&*OvINzR6dwHrM%-%ft^q)-~f71nc}>SF5+)+umO1yTj%8wrptg zQK@}HUA;Gr(&uegoBghqI=`=Jv$C@0niZ~%bRMT| z_}Us*U2B8O-{^HUwbZTix*D2Vyshm`ZLRI|Mdv!-I?=Pft<_(LpP=+_YIAv;y&&_a z(cp(F8`{*{n!T>I&24oS7c>$*X)-=aPRRrFcseGMh`>eNWPEs%#R1ZFJ})HfgAD3g zU3YqYZNx6fPCId#X7WdRmR#XknHY=-+o7A*b@P?WuUuB+xmJ?73%Xxt@p9$z#aDQw zo1kxM2B#ISn=Wc_UDQxJ&vhl~EM7m$8Zgc}p4Qsd`WaY?uYD5Lh^NRs>Q39o=e=Ep zow=alW^Wy=Y5`3U)}UN@H70cR;$>@AU%Plkh3oRVre-h9tIZX+WU^mS`|9qP4U<3D zuQ*E=Db88=+>g&Q@VR}7;(QyiLU)cJJl^%|~GTz|!tbFZSDkLyBQ#kelTwG5Z_cO%N{rTRvcJ8?ZCwLO9I0bIYp z)sJfs*Y9zS;ELj!z;y=ZUcHPR{%TwYn5ijv$@H?!q-ND zf%1w1-aM@vn|y7pgv^4G_QlY=?OK2Hs@6?S@LwmDHESE%Hh5c=r)+EJb4^?OTH)@L zuV<~TZ*FVHOdro$%QGI#YB44BYSsqvP-P^`SJwoh*R$Ha{@c{Gu&Au|+kN0ImIYL+ zZ`pv~lg_5nhC39cx#_l+&GQ?Yo9Q>Ao$utLo?f$S9{SStC9kj5+w5K-2AqQy>uPD= zSnu4i_loDaMH1^ zO1}sDxRo#s^Xc77b=cbyjJm-iiwJ| zD$lRHuyTH7Mdjs{*H+$AxxR8^<-L{nSAMhdJCzsIO z-hH$CR(FHD(cSFc;P$&WyFs&sSy2kzbKLXX#qLsfnOp8f^c&rGy6kHxu2pD{we;f-`=0ITl}8B4YQ)F4D~8p)wt^0e7+^E^WoPvxfkHx dt>-Dq613Cb8nj-nw$@Y3Dq24H|Nlh-{|E0{SJ40f diff --git a/evaluation/utils/matlabPyrTools/MEX/corrDn.mexw64 b/evaluation/utils/matlabPyrTools/MEX/corrDn.mexw64 deleted file mode 100755 index fef315c85b92b2855ad2218b5137b21055b31e46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35840 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 diff --git a/evaluation/utils/matlabPyrTools/MEX/edges-orig.c b/evaluation/utils/matlabPyrTools/MEX/edges-orig.c deleted file mode 100755 index 1f6a98b..0000000 --- a/evaluation/utils/matlabPyrTools/MEX/edges-orig.c +++ /dev/null @@ -1,494 +0,0 @@ -/* -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; File: edges.c -;;; Author: Eero Simoncelli -;;; Description: Boundary handling routines for use with convolve.c -;;; Creation Date: Spring 1987. -;;; MODIFIED, 6/96, to operate on double float arrays. -;;; MODIFIED by dgp, 4/1/97, to support THINK C. -;;; ---------------------------------------------------------------- -;;; Object-Based Vision and Image Understanding System (OBVIUS), -;;; Copyright 1988, Vision Science Group, Media Laboratory, -;;; Massachusetts Institute of Technology. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -*/ - -/* -This file contains functions which determine how edges are to be -handled when performing convolutions of images with linear filters. -Any edge handling function which is local and linear may be defined, -except (unfortunately) constants cannot be added. So to treat the -edges as if the image is surrounded by a gray field, you must paste it -into a gray image, convolve, and crop it out... -The main convolution function is called internal_filter and is defined -in the file convolve.c. The idea is that the convolution function -calls the edge handling function which computes a new filter based on -the old filter and the distance to the edge of the image. For -example, reflection is done by reflecting the filter through the -appropriate axis and summing. Currently defined functions are listed -below. -*/ - -/* -#define DEBUG -*/ - -#include -#include -#include -#include "convolve.h" - -#define sgn(a) ( ((a)>0)?1:(((a)<0)?-1:0) ) -#define clip(a,mn,mx) ( ((a)<(mn))?(mn):(((a)>=(mx))?(mx-1):(a)) ) - -int reflect1(), reflect2(), repeat(), zero(), Extend(), nocompute(); -int ereflect(), predict(); - -/* Lookup table matching a descriptive string to the edge-handling function */ -#if !THINK_C - static EDGE_HANDLER edge_foos[] = - { - { "dont-compute", nocompute }, /* zero output for filter touching edge */ - { "zero", zero }, /* zero outside of image */ - { "repeat", repeat }, /* repeat edge pixel */ - { "reflect1", reflect1 }, /* reflect about edge pixels */ - { "reflect2", reflect2 }, /* reflect image, including edge pixels */ - { "extend", Extend }, /* extend (reflect & invert) */ - { "predict", predict }, /* predict based on portion covered by filt */ - { "ereflect", ereflect }, /* orthogonal QMF reflection */ - }; -#else - /* - This is really stupid, but THINK C won't allow initialization of static variables in - a code resource with string addresses. So we do it this way. - The 68K code for a MATLAB 4 MEX file can only be created by THINK C. - However, for MATLAB 5, we'll be able to use Metrowerks CodeWarrior for both 68K and PPC, so this - cludge can be dropped when we drop support for MATLAB 4. - Denis Pelli, 4/1/97. - */ - static EDGE_HANDLER edge_foos[8]; - - void InitializeTable(EDGE_HANDLER edge_foos[]) - { - static int i=0; - - if(i>0) return; - edge_foos[i].name="dont-compute"; - edge_foos[i++].func=nocompute; - edge_foos[i].name="zero"; - edge_foos[i++].func=zero; - edge_foos[i].name="repeat"; - edge_foos[i++].func=repeat; - edge_foos[i].name="reflect1"; - edge_foos[i++].func=reflect1; - edge_foos[i].name="reflect2"; - edge_foos[i++].func=reflect2; - edge_foos[i].name="extend"; - edge_foos[i++].func=Extend; - edge_foos[i].name="predict"; - edge_foos[i++].func=predict; - edge_foos[i].name="ereflect"; - edge_foos[i++].func=ereflect; - } -#endif - -/* -Function looks up an edge handler id string in the structure above, and -returns the associated function -*/ -fptr edge_function(char *edges) - { - int i; - -#if THINK_C - InitializeTable(edge_foos); -#endif - for (i = 0; i1) OR (x_pos<-1) OR (y_pos>1) OR (y_pos<-1) ) - for (i=0; i0)?(x_pos-1):((x_pos<0)?(x_pos+1):0)); - int y_start = x_dim * ((y_pos>0)?(y_pos-1):((y_pos<0)?(y_pos+1):0)); - int i; - - for (i=0; i= 0) AND (y_res < filt_sz)) - for (x_filt=y_filt, x_res=x_start; - x_filt= 0) AND (x_res < x_dim)) - result[y_res+x_res] = filt[x_filt]; - return(0); - } - -/* -------------------------------------------------------------------- -repeat() - repeat edge pixel. Continuous, but content is usually -different from image. -*/ - -int repeat(filt,x_dim,y_dim,x_pos,y_pos,result,f_or_e) - register double *filt, *result; - register int x_dim; - int y_dim, x_pos, y_pos, f_or_e; - { - register int y_filt,x_filt, y_res,x_res; - int filt_sz = x_dim*y_dim; - int x_start = ((x_pos>0)?(x_pos-1):((x_pos<0)?(x_pos+1):0)); - int y_start = x_dim * ((y_pos>0)?(y_pos-1):((y_pos<0)?(y_pos+1):0)); - int i; - - for (i=0; i=0)?((y_res=0)?((x_res0)?(x_dim-1):0; - register int y_base = (y_pos>0)?(x_dim*(y_dim-1)):0; - int filt_sz = x_dim*y_dim; - int x_edge_dist = (x_pos>0)?(x_pos-x_dim-1):(x_pos+1); - int y_edge_dist = x_dim * ((y_pos>0)?(y_pos-y_dim-1):(y_pos+1)); - int i; - - #ifdef DEBUG - printf("(%d,%d) ",y_pos,x_pos); - if (x_pos==0) printf("\n"); - #endif - - for (i=0; i0)?(x_dim-1):0; - register int y_base = (y_pos>0)?(x_dim*(y_dim-1)):0; - int x_edge_dist = (x_pos>0)?(x_pos-x_dim):((x_pos<0)?(x_pos+1):0); - int y_edge_dist = x_dim * ((y_pos>0)?(y_pos-y_dim):((y_pos<0)?(y_pos+1):0)); - int i; - int mx_pos = (x_dim/2)+1; - int my_pos = (y_dim/2)+1; - - #ifdef DEBUG - printf("(%d,%d) ",y_pos,x_pos); - if (x_pos==0) printf("\n"); - #endif - - for (i=0; i0)?(x_dim-1):0; - register int y_base = (y_pos>0)?(x_dim*(y_dim-1)):0; - int x_edge_dist = (x_pos>0)?(x_pos-x_dim):((x_pos<-1)?(x_pos+1):0); - int y_edge_dist = x_dim * ((y_pos>0)?(y_pos-y_dim):((y_pos<-1)?(y_pos+1):0)); - int i; - int mx_pos = (x_dim/2)+1; - int my_pos = (y_dim/2)+1; - - for (i=0; i0)?(x_pos-1):((x_pos<0)?(x_pos+1):0)); - int y_start = x_dim * ((y_pos>0)?(y_pos-1):((y_pos<0)?(y_pos+1):0)); - int i; - - for (i=0; i= 0) AND (y_res < filt_sz)) - for (x_filt=y_filt, x_res=x_start; - x_filt= 0) AND (x_res < x_dim)) - { - result[y_res+x_res] = filt[x_filt]; - taps_used += ABS(filt[x_filt]); - } - printf("TU: %f\n",taps_used); - if (f_or_e IS FILTER) - { - /* fraction = ( (double) filt_sz ) / ( (double) taps_used ); */ - for (i=0; i0)?(x_dim-1):0; - register int y_base = x_dim * ( (y_pos>0)?(y_dim-1):0 ); - int filt_sz = x_dim*y_dim; - int x_edge_dist = (x_pos>1)?(x_pos-x_dim):((x_pos<-1)?(x_pos+1):0); - int y_edge_dist = x_dim * ( (y_pos>1)?(y_pos-y_dim):((y_pos<-1)?(y_pos+1):0) ); - int i; - double norm,onorm; - - for (i=0; i -#include -#include -#include "convolve.h" - -#define sgn(a) ( ((a)>0)?1:(((a)<0)?-1:0) ) -#define clip(a,mn,mx) ( ((a)<(mn))?(mn):(((a)>=(mx))?(mx-1):(a)) ) - -int reflect1(), reflect2(), qreflect2(), repeat(), zero(), Extend(), nocompute(); -int ereflect(), predict(); - -/* Lookup table matching a descriptive string to the edge-handling function */ -#if !THINK_C - static EDGE_HANDLER edge_foos[] = - { - { "dont-compute", nocompute }, /* zero output for filter touching edge */ - { "zero", zero }, /* zero outside of image */ - { "repeat", repeat }, /* repeat edge pixel */ - { "reflect1", reflect1 }, /* reflect about edge pixels */ - { "reflect2", reflect2 }, /* reflect image, including edge pixels */ - { "qreflect2", qreflect2 }, /* reflect image, including edge pixels - for even-length QMF decompositions */ - { "extend", Extend }, /* extend (reflect & invert) */ - { "ereflect", ereflect }, /* orthogonal QMF reflection */ - }; -#else - /* - This is really stupid, but THINK C won't allow initialization of static variables in - a code resource with string addresses. So we do it this way. - The 68K code for a MATLAB 4 MEX file can only be created by THINK C. - However, for MATLAB 5, we'll be able to use Metrowerks CodeWarrior for both 68K and PPC, so this - cludge can be dropped when we drop support for MATLAB 4. - Denis Pelli, 4/1/97. - */ - static EDGE_HANDLER edge_foos[8]; - - void InitializeTable(EDGE_HANDLER edge_foos[]) - { - static int i=0; - - if(i>0) return; - edge_foos[i].name="dont-compute"; - edge_foos[i++].func=nocompute; - edge_foos[i].name="zero"; - edge_foos[i++].func=zero; - edge_foos[i].name="repeat"; - edge_foos[i++].func=repeat; - edge_foos[i].name="reflect1"; - edge_foos[i++].func=reflect1; - edge_foos[i].name="reflect2"; - edge_foos[i++].func=reflect2; - edge_foos[i].name="qreflect2"; - edge_foos[i++].func=qreflect2; - edge_foos[i].name="extend"; - edge_foos[i++].func=Extend; - edge_foos[i].name="ereflect"; - edge_foos[i++].func=ereflect; - } -#endif - -/* -Function looks up an edge handler id string in the structure above, and -returns the associated function -*/ -fptr edge_function(char *edges) - { - int i; - -#if THINK_C - InitializeTable(edge_foos); -#endif - for (i = 0; i1) OR (x_pos<-1) OR (y_pos>1) OR (y_pos<-1) ) - for (i=0; i0)?(x_pos-1):((x_pos<0)?(x_pos+1):0)); - int y_start = x_dim * ((y_pos>0)?(y_pos-1):((y_pos<0)?(y_pos+1):0)); - int i; - - for (i=0; i= 0) AND (y_res < filt_sz)) - for (x_filt=y_filt, x_res=x_start; - x_filt= 0) AND (x_res < x_dim)) - result[y_res+x_res] = filt[x_filt]; - return(0); - } - - -/* -------------------------------------------------------------------- -reflect1() - Reflection through the edge pixels. Continuous, but -discontinuous first derivative. This is the right thing to do if you -are subsampling by 2, since it maintains parity (even pixels positions -remain even, odd ones remain odd). -*/ - -int reflect1(filt,x_dim,y_dim,x_pos,y_pos,result,r_or_e) - register double *filt, *result; - register int x_dim; - int y_dim, x_pos, y_pos, r_or_e; - { - int filt_sz = x_dim*y_dim; - register int y_filt,x_filt, y_res, x_res; - register int x_base = (x_pos>0)?(x_dim-1):0; - register int y_base = x_dim * ((y_pos>0)?(y_dim-1):0); - int x_overhang = (x_pos>0)?(x_pos-1):((x_pos<0)?(x_pos+1):0); - int y_overhang = x_dim * ((y_pos>0)?(y_pos-1):((y_pos<0)?(y_pos+1):0)); - int i; - int mx_pos = (x_pos<0)?(x_dim/2):((x_dim-1)/2); - int my_pos = x_dim * ((y_pos<0)?(y_dim/2):((y_dim-1)/2)); - - for (i=0; i y_base-filt_sz; - y_filt-=x_dim, y_res-=x_dim) - { - for (x_res=x_base, x_filt=x_base-x_overhang; - x_filt > x_base-x_dim; - x_res--, x_filt--) - result[ABS(y_res)+ABS(x_res)] += filt[ABS(y_filt)+ABS(x_filt)]; - if ((x_overhang ISNT mx_pos) AND (x_pos ISNT 0)) - for (x_res=x_base, x_filt=x_base-2*mx_pos+x_overhang; - x_filt > x_base-x_dim; - x_res--, x_filt--) - result[ABS(y_res)+ABS(x_res)] += filt[ABS(y_filt)+ABS(x_filt)]; - } - if ((y_overhang ISNT my_pos) AND (y_pos ISNT 0)) - for (y_res=y_base, y_filt = y_base-2*my_pos+y_overhang; - y_filt > y_base-filt_sz; - y_filt-=x_dim, y_res-=x_dim) - { - for (x_res=x_base, x_filt=x_base-x_overhang; - x_filt > x_base-x_dim; - x_res--, x_filt--) - result[ABS(y_res)+ABS(x_res)] += filt[ABS(y_filt)+ABS(x_filt)]; - if ((x_overhang ISNT mx_pos) AND (x_pos ISNT 0)) - for (x_res=x_base, x_filt=x_base-2*mx_pos+x_overhang; - x_filt > x_base-x_dim; - x_res--, x_filt--) - result[ABS(y_res)+ABS(x_res)] += filt[ABS(y_filt)+ABS(x_filt)]; - } - } - - return(0); - } - -/* -------------------------------------------------------------------- -reflect2() - Reflect image at boundary. The edge pixel is repeated, -then the next pixel, etc. Continuous, but discontinuous first -derivative. -*/ - -int reflect2(filt,x_dim,y_dim,x_pos,y_pos,result,r_or_e) - register double *filt, *result; - register int x_dim; - int y_dim, x_pos, y_pos, r_or_e; - { - int filt_sz = x_dim*y_dim; - register int y_filt,x_filt, y_res, x_res; - register int x_base = (x_pos>0)?(x_dim-1):0; - register int y_base = x_dim * ((y_pos>0)?(y_dim-1):0); - int x_overhang = (x_pos>0)?(x_pos-1):((x_pos<0)?(x_pos+1):0); - int y_overhang = x_dim * ((y_pos>0)?(y_pos-1):((y_pos<0)?(y_pos+1):0)); - int i; - int mx_pos = (x_pos<0)?(x_dim/2):((x_dim-1)/2); - int my_pos = x_dim * ((y_pos<0)?(y_dim/2):((y_dim-1)/2)); - - for (i=0; i0)?x_dim:0); - y_filt0)?1:0); - x_filt y_base-filt_sz; - y_filt-=x_dim, y_res-=x_dim) - { - for (x_res=x_base, x_filt=x_base-x_overhang; - x_filt > x_base-x_dim; - x_res--, x_filt--) - result[ABS(y_res)+ABS(x_res)] += filt[ABS(y_filt)+ABS(x_filt)]; - if (x_pos ISNT 0) - for (x_res=x_base, x_filt=x_base-2*mx_pos+x_overhang-1; - x_filt > x_base-x_dim; - x_res--, x_filt--) - result[ABS(y_res)+ABS(x_res)] += filt[ABS(y_filt)+ABS(x_filt)]; - } - if (y_pos ISNT 0) - for (y_res=y_base, y_filt = y_base-2*my_pos+y_overhang-x_dim; - y_filt > y_base-filt_sz; - y_filt-=x_dim, y_res-=x_dim) - { - for (x_res=x_base, x_filt=x_base-x_overhang; - x_filt > x_base-x_dim; - x_res--, x_filt--) - result[ABS(y_res)+ABS(x_res)] += filt[ABS(y_filt)+ABS(x_filt)]; - if (x_pos ISNT 0) - for (x_res=x_base, x_filt=x_base-2*mx_pos+x_overhang-1; - x_filt > x_base-x_dim; - x_res--, x_filt--) - result[ABS(y_res)+ABS(x_res)] += filt[ABS(y_filt)+ABS(x_filt)]; - } - } - - return(0); - } - - -/* -------------------------------------------------------------------- -qreflect2() - Modified version of reflect2 that works properly for -even-length QMF filters. -*/ - -int qreflect2(filt,x_dim,y_dim,x_pos,y_pos,result,r_or_e) - double *filt, *result; - int x_dim, y_dim, x_pos, y_pos, r_or_e; - { - reflect2(filt,x_dim,y_dim,x_pos,y_pos,result,0); - return(0); - } - -/* -------------------------------------------------------------------- -repeat() - repeat edge pixel. Continuous, with discontinuous first -derivative. -*/ - -int repeat(filt,x_dim,y_dim,x_pos,y_pos,result,r_or_e) - register double *filt, *result; - register int x_dim; - int y_dim, x_pos, y_pos, r_or_e; - { - register int y_filt,x_filt, y_res,x_res, y_tmp, x_tmp; - register int x_base = (x_pos>0)?(x_dim-1):0; - register int y_base = x_dim * ((y_pos>0)?(y_dim-1):0); - int x_overhang = ((x_pos>0)?(x_pos-1):((x_pos<0)?(x_pos+1):0)); - int y_overhang = x_dim * ((y_pos>0)?(y_pos-1):((y_pos<0)?(y_pos+1):0)); - int filt_sz = x_dim*y_dim; - int mx_pos = (x_dim/2); - int my_pos = x_dim * (y_dim/2); - int i; - - for (i=0; i=0)?((y_res=0)?((x_res y_base-filt_sz; - y_filt-=x_dim, y_res-=x_dim) - if ((x_base-x_overhang) ISNT mx_pos) - for (x_res=x_base, x_filt=x_base-ABS(x_overhang); - x_filt > x_base-x_dim; - x_res--, x_filt--) - result[ABS(y_res)+ABS(x_res)] += filt[ABS(y_filt)+ABS(x_filt)]; - else /* ((x_base-x_overhang) IS mx_pos) */ - for (x_res=x_base, x_filt=x_base-ABS(x_overhang); - x_filt > x_base-x_dim; - x_filt--, x_res--) - for(x_tmp=x_filt; x_tmp > x_base-x_dim; x_tmp--) - result[ABS(y_res)+ABS(x_res)] += filt[ABS(y_filt)+ABS(x_tmp)]; - else /* ((y_base-y_overhang) IS my_pos) */ - for (y_res=y_base, y_filt=y_base-ABS(y_overhang); - y_filt > y_base-filt_sz; - y_filt-=x_dim, y_res-=x_dim) - for (y_tmp=y_filt; y_tmp > y_base-filt_sz; y_tmp-=x_dim) - if ((x_base-x_overhang) ISNT mx_pos) - for (x_res=x_base, x_filt=x_base-ABS(x_overhang); - x_filt > x_base-x_dim; - x_filt--, x_res--) - result[ABS(y_res)+ABS(x_res)] += filt[ABS(y_tmp)+ABS(x_filt)]; - else /* ((x_base-x_overhang) IS mx_pos) */ - for (x_res=x_base, x_filt=x_base-ABS(x_overhang); - x_filt > x_base-x_dim; - x_filt--, x_res--) - for (x_tmp=x_filt; x_tmp > x_base-x_dim; x_tmp--) - result[ABS(y_res)+ABS(x_res)] += filt[ABS(y_tmp)+ABS(x_tmp)]; - } /* End, if r_or_e IS EXPAND */ - - return(0); - } - -/* -------------------------------------------------------------------- -extend() - Extend image by reflecting and inverting about edge pixel -value. Maintains continuity in intensity AND first derivative (but -not higher derivs). -*/ - -int Extend(filt,x_dim,y_dim,x_pos,y_pos,result,r_or_e) - register double *filt, *result; - register int x_dim; - int y_dim, x_pos, y_pos, r_or_e; - { - int filt_sz = x_dim*y_dim; - register int y_filt,x_filt, y_res,x_res, y_tmp, x_tmp; - register int x_base = (x_pos>0)?(x_dim-1):0; - register int y_base = x_dim * ((y_pos>0)?(y_dim-1):0); - int x_overhang = (x_pos>0)?(x_pos-1):((x_pos<0)?(x_pos+1):0); - int y_overhang = x_dim * ((y_pos>0)?(y_pos-1):((y_pos<0)?(y_pos+1):0)); - int mx_pos = (x_pos<0)?(x_dim/2):((x_dim-1)/2); - int my_pos = x_dim * ((y_pos<0)?(y_dim/2):((y_dim-1)/2)); - int i; - - for (i=0; i=0) AND (y_res=0) AND (x_res=0) AND (x_res y_base-filt_sz; - y_filt-=x_dim, y_res-=x_dim) - { - for (x_res=x_base, x_filt=x_base-x_overhang; - x_filt > x_base-x_dim; - x_res--, x_filt--) - result[ABS(y_res)+ABS(x_res)] += filt[ABS(y_filt)+ABS(x_filt)]; - if (x_pos ISNT 0) - if (x_overhang ISNT mx_pos) - for (x_res=x_base, x_filt=x_base-2*mx_pos+x_overhang; - x_filt > x_base-x_dim; - x_res--, x_filt--) - result[ABS(y_res)+ABS(x_res)] -= filt[ABS(y_filt)+ABS(x_filt)]; - else /* x_overhang IS mx_pos */ - for (x_res=x_base, x_filt=x_base-2*mx_pos+x_overhang-1; - x_filt > x_base-x_dim; - x_res--, x_filt--) - for (x_tmp=x_filt; x_tmp > x_base-x_dim; x_tmp--) - result[ABS(y_res)+ABS(x_res)] += 2*filt[ABS(y_filt)+ABS(x_tmp)]; - } - if (y_pos ISNT 0) - if (y_overhang ISNT my_pos) - for (y_res=y_base, y_filt = y_base-2*my_pos+y_overhang; - y_filt > y_base-filt_sz; - y_filt-=x_dim, y_res-=x_dim) - { - for (x_res=x_base, x_filt=x_base-x_overhang; - x_filt > x_base-x_dim; - x_res--, x_filt--) - result[ABS(y_res)+ABS(x_res)] -= filt[ABS(y_filt)+ABS(x_filt)]; - if ((x_pos ISNT 0) AND (x_overhang ISNT mx_pos)) - for (x_res=x_base, x_filt=x_base-2*mx_pos+x_overhang; - x_filt > x_base-x_dim; - x_res--, x_filt--) - result[ABS(y_res)+ABS(x_res)] -= filt[ABS(y_filt)+ABS(x_filt)]; - } - else /* y_overhang IS my_pos */ - for (y_res=y_base, y_filt = y_base-2*my_pos+y_overhang-x_dim; - y_filt > y_base-filt_sz; - y_res-=x_dim, y_filt-=x_dim) - for (y_tmp=y_filt; y_tmp > y_base-filt_sz; y_tmp-=x_dim) - { - for (x_res=x_base, x_filt=x_base-x_overhang; - x_filt > x_base-x_dim; - x_res--, x_filt--) - result[ABS(y_res)+ABS(x_res)] += 2*filt[ABS(y_tmp)+ABS(x_filt)]; - if ((x_pos ISNT 0) AND (x_overhang IS mx_pos)) - for (x_res=x_base, x_filt=x_base-2*mx_pos+x_overhang-1; - x_filt > x_base-x_dim; - x_res--, x_filt--) - for (x_tmp=x_filt; x_tmp > x_base-x_dim; x_tmp--) - result[ABS(y_res)+ABS(x_res)] += 2*filt[ABS(y_tmp)+ABS(x_tmp)]; - } - } /* r_or_e ISNT REDUCE */ - - return(0); - } - -/* -------------------------------------------------------------------- -predict() - Simple prediction. Like zero, but multiplies the result -by the reciprocal of the percentage of filter being used. (i.e. if -50% of the filter is hanging over the edge of the image, multiply the -taps being used by 2). */ - -int predict(filt,x_dim,y_dim,x_pos,y_pos,result,r_or_e) - register double *filt, *result; - register int x_dim; - int y_dim, x_pos, y_pos, r_or_e; - { - register int y_filt,x_filt, y_res,x_res; - register double taps_used = 0.0; /* int *** */ - register double fraction = 0.0; - int filt_sz = x_dim*y_dim; - int x_start = ((x_pos>0)?(x_pos-1):((x_pos<0)?(x_pos+1):0)); - int y_start = x_dim * ((y_pos>0)?(y_pos-1):((y_pos<0)?(y_pos+1):0)); - int i; - - for (i=0; i= 0) AND (y_res < filt_sz)) - for (x_filt=y_filt, x_res=x_start; - x_filt= 0) AND (x_res < x_dim)) - { - result[y_res+x_res] = filt[x_filt]; - taps_used += ABS(filt[x_filt]); - } - - if (r_or_e IS REDUCE) - { - /* fraction = ( (double) filt_sz ) / ( (double) taps_used ); */ - for (i=0; i0)?(x_dim-1):0; - register int y_base = x_dim * ((y_pos>0)?(y_dim-1):0); - int filt_sz = x_dim*y_dim; - int x_overhang = (x_pos>1)?(x_pos-x_dim):((x_pos<-1)?(x_pos+1):0); - int y_overhang = x_dim * ( (y_pos>1)?(y_pos-y_dim):((y_pos<-1)?(y_pos+1):0) ); - int i; - double norm,onorm; - - for (i=0; i>> See histo.m for documentation <<< - EPS, ported from OBVIUS, 3/97. -*/ - -#define V4_COMPAT -#include /* Matlab matrices */ -#include - -#include /* NULL */ -#include /* ceil */ - -#define notDblMtx(it) (!mxIsNumeric(it) || !mxIsDouble(it) || mxIsSparse(it) || mxIsComplex(it)) - -#define PAD 0.49999 /* A hair below 1/2, to avoid roundoff errors */ -#define MAXBINS 20000 - -void mexFunction(int nlhs, /* Num return vals on lhs */ - mxArray *plhs[], /* Matrices on lhs */ - int nrhs, /* Num args on rhs */ - const mxArray *prhs[] /* Matrices on rhs */ - ) - { - register double temp; - register int binnum, i, size; - register double *im, binsize; - register double origin, *hist, mn, mx, mean; - register int nbins; - double *bincenters; - const mxArray *arg0,*arg1,*arg2; - double *mxMat; - - if (nrhs < 1 ) mexErrMsgTxt("requires at least 1 argument."); - - /* ARG 1: MATRIX */ - arg0 = prhs[0]; - if notDblMtx(arg0) mexErrMsgTxt("MTX arg must be a real non-sparse matrix."); - im = mxGetPr(arg0); - size = (int) mxGetM(arg0) * mxGetN(arg0); - - /* FIND min, max, mean values of MTX */ - mn = *im; mx = *im; binsize = 0; - for (i=1; i mx) - mx = temp; - binsize += temp; - } - mean = binsize / size; - - /* ARG 3: BIN_CENTER */ - if (nrhs > 2) - { - arg2 = prhs[2]; - if notDblMtx(arg2) mexErrMsgTxt("BIN_CENTER arg must be a real scalar."); - if (mxGetM(arg2) * mxGetN(arg2) != 1) - mexErrMsgTxt("BIN_CENTER must be a real scalar."); - mxMat= mxGetPr(arg2); - origin = *mxMat; - } - else - origin = mean; - - /* ARG 2: If positive, NBINS. If negative, -BINSIZE. */ - if (nrhs > 1) - { - arg1 = prhs[1]; - if notDblMtx(arg1) mexErrMsgTxt("NBINS_OR_BINSIZE arg must be a real scalar."); - if (mxGetM(arg1) * mxGetN(arg1) != 1) - mexErrMsgTxt("NBINS_OR_BINSIZE must be a real scalar."); - mxMat= mxGetPr(arg1); - binsize = *mxMat; - } - else - { - binsize = 101; /* DEFAULT: 101 bins */ - } - - /* -------------------------------------------------- - Adjust origin, binsize, nbins such that - mx <= origin + (nbins-1)*binsize + PAD*binsize - mn >= origin - PAD*binsize - -------------------------------------------------- */ - if (binsize < 0) /* user specified BINSIZE */ - { - binsize = -binsize; - origin -= binsize * ceil((origin-mn-PAD*binsize)/binsize); - nbins = (int) ceil((mx-origin-PAD*binsize)/binsize) + 1; - } - else /* user specified NBINS */ - { - nbins = (int) (binsize + 0.5); /* round to int */ - if (nbins == 0) - mexErrMsgTxt("NBINS must be greater than zero."); - binsize = (mx-mn)/(nbins-1+2*PAD); /* start with lower bound */ - i = ceil((origin-mn-binsize/2)/binsize); - if ( mn < (origin-i*binsize-PAD*binsize) ) - binsize = (origin-mn)/(i+PAD); - else if ( mx > (origin+(nbins-1-i)*binsize+PAD*binsize) ) - binsize = (mx-origin)/((nbins-1-i)+PAD); - origin -= binsize * ceil((origin-mn-PAD*binsize)/binsize); - } - - if (nbins > MAXBINS) - { - mexPrintf("nbins: %d, MAXBINS: %d\n",nbins,MAXBINS); - mexErrMsgTxt("Number of histo bins has exceeded maximum"); - } - - /* Allocate hist and xvals */ - plhs[0] = (mxArray *) mxCreateDoubleMatrix(1,nbins,mxREAL); - if (plhs[0] == NULL) mexErrMsgTxt("Error allocating result matrix"); - hist = mxGetPr(plhs[0]); - - if (nlhs > 1) - { - plhs[1] = (mxArray *) mxCreateDoubleMatrix(1,nbins,mxREAL); - if (plhs[1] == NULL) mexErrMsgTxt("Error allocating result matrix"); - bincenters = mxGetPr(plhs[1]); - for (i=0, temp=origin; i= 0)) - (hist[binnum]) += 1.0; - else - printf("HISTO warning: value %f outside of range [%f,%f]\n", - im[i], origin-0.5*binsize, origin+(nbins-0.5)*binsize); - } - - return; - } - diff --git a/evaluation/utils/matlabPyrTools/MEX/histo.mexa64 b/evaluation/utils/matlabPyrTools/MEX/histo.mexa64 deleted file mode 100755 index 284d740f8587749d2c67fc528bce699be520bb24..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12673 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 NGf16(^Kzqt{|5c57j6Im diff --git a/evaluation/utils/matlabPyrTools/MEX/histo.mexmac b/evaluation/utils/matlabPyrTools/MEX/histo.mexmac deleted file mode 100755 index 9c9d47a09809453af799b2a363b6899c4c8c2ec4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8852 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 N!fVLP{r{x`e*;TYamWAw diff --git a/evaluation/utils/matlabPyrTools/MEX/histo.mexw64 b/evaluation/utils/matlabPyrTools/MEX/histo.mexw64 deleted file mode 100755 index b1911cb207b29d1d2a59e49bcc278fdcdf950f90..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9728 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 diff --git a/evaluation/utils/matlabPyrTools/MEX/innerProd.c b/evaluation/utils/matlabPyrTools/MEX/innerProd.c deleted file mode 100755 index 8fa1224..0000000 --- a/evaluation/utils/matlabPyrTools/MEX/innerProd.c +++ /dev/null @@ -1,52 +0,0 @@ -/* -RES = innerProd(MAT); - Computes mat'*mat - Odelia Schwartz, 8/97. -*/ - -#define V4_COMPAT -#include - -#include -#include -#include -#include -#include - -void mexFunction(int nlhs, /* Num return vals on lhs */ - mxArray *plhs[], /* Matrices on lhs */ - int nrhs, /* Num args on rhs */ - const mxArray *prhs[] /* Matrices on rhs */ - ) -{ - register double *res, *mat, tmp; - register int len, wid, i, k, j, jlen, ilen, imat, jmat; - mxArray *arg; - - /* get matrix input argument */ - /* should be matrix in which num rows >= num columns */ - arg=prhs[0]; - mat= mxGetPr(arg); - len = (int) mxGetM(arg); - wid = (int) mxGetN(arg); - if ( wid > len ) - printf("innerProd: Warning: width %d is greater than length %d.\n",wid,len); - plhs[0] = (mxArray *) mxCreateDoubleMatrix(wid,wid,mxREAL); - if (plhs[0] == NULL) - mexErrMsgTxt(sprintf("Error allocating %dx%d result matrix",wid,wid)); - res = mxGetPr(plhs[0]); - - for(i=0, ilen=0; i>> See pointOp.m for documentation <<< - EPS, ported from OBVIUS, 7/96. -*/ - -#define V4_COMPAT -#include /* Matlab matrices */ -#include - -#include /* NULL */ - -#define notDblMtx(it) (!mxIsNumeric(it) || !mxIsDouble(it) || mxIsSparse(it) || mxIsComplex(it)) - -void internal_pointop(); - -void mexFunction(int nlhs, /* Num return vals on lhs */ - mxArray *plhs[], /* Matrices on lhs */ - int nrhs, /* Num args on rhs */ - const mxArray *prhs[] /* Matrices on rhs */ - ) - { - double *image, *lut, *res; - double origin, increment; - int x_dim, y_dim, lx_dim, ly_dim; - int warnings = 1; - const mxArray *arg0,*arg1,*arg2,*arg3,*arg4; - double *mxMat; - - if (nrhs < 4 ) mexErrMsgTxt("requres at least 4 args."); - - /* ARG 1: IMAGE */ - arg0 = prhs[0]; - if notDblMtx(arg0) mexErrMsgTxt("IMAGE arg must be a real non-sparse matrix."); - image = mxGetPr(arg0); - x_dim = (int) mxGetM(arg0); /* X is inner index! */ - y_dim = (int) mxGetN(arg0); - - /* ARG 2: Lookup table */ - arg1 = prhs[1]; - if notDblMtx(arg1) mexErrMsgTxt("LUT arg must be a real non-sparse matrix."); - lut = mxGetPr(arg1); - lx_dim = (int) mxGetM(arg1); /* X is inner index! */ - ly_dim = (int) mxGetN(arg1); - if ( (lx_dim != 1) && (ly_dim != 1) ) - mexErrMsgTxt("Lookup table must be a row or column vector."); - - /* ARG 3: ORIGIN */ - arg2 = prhs[2]; - if notDblMtx(arg2) mexErrMsgTxt("ORIGIN arg must be a real scalar."); - if (mxGetM(arg2) * mxGetN(arg2) != 1) - mexErrMsgTxt("ORIGIN arg must be a real scalar."); - mxMat = mxGetPr(arg2); - origin = *mxMat; - - /* ARG 4: INCREMENT */ - arg3 = prhs[3]; - if notDblMtx(arg3) mexErrMsgTxt("INCREMENT arg must be a real scalar."); - if (mxGetM(arg3) * mxGetN(arg3) != 1) - mexErrMsgTxt("INCREMENT arg must be a real scalar."); - mxMat = mxGetPr(arg3); - increment = *mxMat; - - /* ARG 5: WARNINGS */ - if (nrhs>4) - { - arg4 = prhs[4]; - if notDblMtx(arg4) mexErrMsgTxt("WARINGS arg must be a real scalar."); - if (mxGetM(arg4) * mxGetN(arg4) != 1) - mexErrMsgTxt("WARNINGS arg must be a real scalar."); - mxMat = mxGetPr(arg4); - warnings = (int) *mxMat; - } - - plhs[0] = (mxArray *) mxCreateDoubleMatrix(x_dim,y_dim,mxREAL); - if (plhs[0] == NULL) mexErrMsgTxt("Cannot allocate result matrix"); - res = mxGetPr(plhs[0]); - - internal_pointop(image, res, x_dim*y_dim, lut, lx_dim*ly_dim, - origin, increment, warnings); - return; - } - - -/* Use linear interpolation on a lookup table. - Taken from OBVIUS. EPS, Spring, 1987. - */ -void internal_pointop (im, res, size, lut, lutsize, origin, increment, warnings) - register double *im, *res, *lut; - register double origin, increment; - register int size, lutsize, warnings; - { - register int i, index; - register double pos; - register int l_unwarned = warnings; - register int r_unwarned = warnings; - - lutsize = lutsize - 2; /* Maximum index value */ - if (increment > 0) - for (i=0; i lutsize) - { - index = lutsize; - if (r_unwarned) - { - mexPrintf("Warning: Extrapolating to right of lookup table...\n"); - r_unwarned = 0; - } - } - res[i] = lut[index] + (lut[index+1] - lut[index]) * (pos - index); - } - else - for (i=0; iK_F?Qs>CV%Zm!Vjr!Tm&H# z(x}zVDjD@iSGa^atl1#8aPLfg5`JK-pk-cGuVYEaGXcfkr*DkVn6KzaM}DeKG(5 diff --git a/evaluation/utils/matlabPyrTools/MEX/pointOp.lib b/evaluation/utils/matlabPyrTools/MEX/pointOp.lib deleted file mode 100755 index 005b557a22ada2ef9860f59cc78d3e3f19eaef54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1734 zcmcIlPfrs;6#sQwQ8&gks3&8xCM0T1O4-hWB*rXSi4CPCOX0v}DP5F3wA)~bavp|nV49hE@6DT?_j~hu)8}vN>y5Q{=BSlyV?sC+ zc0mY{wC9yNRec+>$N3LlX|7iF{B{(!I@LCO zzp_v+pLW0xgns-$m}=7!7FTE+C^`(-w&_K1=xs_MuJa`8dZGwp%=? z#$N{}mBy0+kH%}U>BjhCJB42523et*Dv#a$7vO z%*{TdI0n8nW|AuxSDO81vM+OSrTwQ9;(ImRhNRcxo~x*32ozw{;L%= ov)^rG__Em@NXsi{S4^nnTKtc~wHkE!Eqf}FW)iP`^5$S30Stdi{r~^~ diff --git a/evaluation/utils/matlabPyrTools/MEX/pointOp.mexa64 b/evaluation/utils/matlabPyrTools/MEX/pointOp.mexa64 deleted file mode 100755 index 97cb2cb3a60874fcaf340c86c054d7c5e327cbae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12666 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 Lpx-In0SxS4ig8tV diff --git a/evaluation/utils/matlabPyrTools/MEX/pointOp.mexmaci64 b/evaluation/utils/matlabPyrTools/MEX/pointOp.mexmaci64 deleted file mode 100755 index 953149abff86429a912d13594ebb91243ab72285..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8816 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 L(8YETk%#{P@t!tX diff --git a/evaluation/utils/matlabPyrTools/MEX/pointOp.mexw32 b/evaluation/utils/matlabPyrTools/MEX/pointOp.mexw32 deleted file mode 100755 index 8b664c6cea83a30f5c7470abdcc795942215b967..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7168 zcmeHMe{2)i9e)l695}#(tV>ba9bMR>ZS`U&fDNHbn%qLxBxLzPD6JcebBP`7JMVm# zWGdHYa;Me12H4mHo772w#MFtgsZ@wDiqa)&nr`7w z$$e|hX%Z1$DnqC6cgJ?^c;k2dNbiq)EGQ*GEi_{BnZdh z08$&(PK25aJi zAe@(*9(oOMxl4CLQ+Ps(kzO15n%?CI4YZoW^Hk zuxVQ>K+cA)+0Y_5dhOae%)dRk7FWWLF*)TQ%z#5; z%7J|pKcz5^o8^R~6iqT|g>fdCOh1!OR%Vnqr9ADx40iQX-HAQ>>`2_Wt)+jrQ)}L5 z_df;ExdUQRuN%CY)Ng2-mKd@_>$WEKL1H){OtJ4%Dk%tXfETt)_e~ym4@};V`{~k} z)c0p`9M!c{{S1(V9!#Ek9toMUNek77aDFm{K>Z1*ngnT4klA54nNIBjq&D(P3X#mH zR!IGZ`qE;AAR*BIs=i3{4CpiJw~0Oz+K2;?geEsy<6v9Li?g1fUaxT{@`l0H$ptgNI4mfVj9prJ?2V!+129Ik26? zCLIzRVS5mfM22QY<=GB}neF>E)d7n#8qHkt&x}TA6=r6{@R`bkWgKQ^U?8L(fSr~c zO!}uM*YuS=fT7Le0*#qTUU3in?f#L!oVYpKUoo2;uI?|`WH=z{cZxhy-Cy=9c2CMv znlz<;6Z&}^rtYW{cqZgDlI*Zx-3oNvd`DkNIdglkVol1ZH8@(4(n&kn(YXUs&g8}> zMNVs_oADs(c5p}xITB3TuC!$O3s&9caztrK58FSEy>KB139sxRo)2RA%|)&vc~9V@ zmXMuxd0FV98#&bo90b@xikzpEkHR!zFV-1F;ZG@)7plSMBY5o~5 zFFY9rMrclEVLHu|24>KF7>{vY$1s(c8G;SoFkVllZ@!mgh7@@ypict1jfNv! zQ*t_GCkveNUm&C@gS6>mCG9as(^sF6UY~{Oq-Wu;AInNRFzMBE!~eo)9>%247=}T5 zK#>P@(j;m^Z^e!;8jjhd-@v5enXH)>0M7xqmI#b`0GE5f>5t|jxtMA(kIhg9m{ z5dsnTK^hR@YXTdWA|f3Ph(fp*wN^CN*VI=x(E*{8j!JRz!65)nfe0NB1|k8$g?;{! zOHF-cBU8uJH_zA4*2bFZn)>-XYAyL%+3-CyFVI0gB1Jj6n+=LQ(5h{@>u4O$Jsgh( zgg9&D=t4Dh71hk$#=VQLzAA^&A%5A<~i=Vn>Jhr3YYhUrFDKet6R+f>u?X9XRufC_1EEdCs+Xdy5DubxVl|QNgpdzK*f)Wv`14aMwi|>nCw8C+VtT`3gTM#bcpUu+!RQRv9Ts>l%5q{895${q4m16ptx=4$ za6MtJ9o<509qoLK<}#&L`NDHC*$+7t3x|;MhosNAI8r z5L2S@?w}y*cp2dHiMc2KA8Oi2lGON{A^v^`dk~d@+$;avGXU!i=M1@vUnu6>KXSj~ z{<-^g_pjWS-0!+?xL0}}@_0ONdU{H(ltfE^R+_i&%j-tgY3rU}e{Ox=hS3cRynDSr z@E-HN>^h($ diff --git a/evaluation/utils/matlabPyrTools/MEX/pointOp.mexw64 b/evaluation/utils/matlabPyrTools/MEX/pointOp.mexw64 deleted file mode 100755 index e3c7e87e07bc4126136191c3119f0e6a47943870..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8704 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 diff --git a/evaluation/utils/matlabPyrTools/MEX/pointOp.mexw64.manifest b/evaluation/utils/matlabPyrTools/MEX/pointOp.mexw64.manifest deleted file mode 100755 index 1c06b61..0000000 --- a/evaluation/utils/matlabPyrTools/MEX/pointOp.mexw64.manifest +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/evaluation/utils/matlabPyrTools/MEX/range2.c b/evaluation/utils/matlabPyrTools/MEX/range2.c deleted file mode 100755 index db0c204..0000000 --- a/evaluation/utils/matlabPyrTools/MEX/range2.c +++ /dev/null @@ -1,56 +0,0 @@ -/* -[MIN, MAX] = range2(MTX) - >>> See range2.m for documentation <<< - EPS, 3/97. -*/ - -#define V4_COMPAT -#include /* Matlab matrices */ -#include - -#include /* NULL */ - -#define notDblMtx(it) (!mxIsNumeric(it) || !mxIsDouble(it) || mxIsSparse(it) || mxIsComplex(it)) - -void mexFunction(int nlhs, /* Num return vals on lhs */ - mxArray *plhs[], /* Matrices on lhs */ - int nrhs, /* Num args on rhs */ - const mxArray *prhs[] /* Matrices on rhs */ - ) - { - register double temp, mn, mx; - register double *mtx; - register int i, size; - const mxArray *arg; - - if (nrhs != 1) mexErrMsgTxt("requires 1 argument."); - - /* ARG 1: MATRIX */ - arg = prhs[0]; - if notDblMtx(arg) mexErrMsgTxt("MTX arg must be a real non-sparse matrix."); - mtx = mxGetPr(arg); - size = (int) mxGetM(arg) * mxGetN(arg); - - /* FIND min, max values of MTX */ - mn = *mtx; mx = *mtx; - for (i=1; i mx) - mx = temp; - } - - plhs[0] = (mxArray *) mxCreateDoubleMatrix(1,1,mxREAL); - if (plhs[0] == NULL) mexErrMsgTxt("Error allocating result matrix"); - plhs[1] = (mxArray *) mxCreateDoubleMatrix(1,1,mxREAL); - if (plhs[1] == NULL) mexErrMsgTxt("Error allocating result matrix"); - mtx = mxGetPr(plhs[0]); - mtx[0] = mn; - mtx = mxGetPr(plhs[1]); - mtx[0] = mx; - - return; - } - diff --git a/evaluation/utils/matlabPyrTools/MEX/range2.mexa64 b/evaluation/utils/matlabPyrTools/MEX/range2.mexa64 deleted file mode 100755 index d50b9138ed30254b04d89a481c84344b3d3d50ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8486 zcmeHMZ)_Y#6`%9j&Ly#ZmxLz9X~{NCO45?UPV=u6le;)}&Z+IXj!nWJvswGrzN_w! z+1*Rdky=cg7EEvzfv8kIpcX|{g%HiB%0z-X3AHTop>9PZO9BkbdEZh)zqPQN=wAgfa1|p zYL6(PC83$7ZnC7FZOfzvt#~?xe5+w}n!~+WizTz|W>+Su8}UKTA5LemGK7zfXohLC zE$QS)LeBzxM7O#Pn|9iy3rLHhYnE=?c50Rp&#L$`*Cowjce>uf#2j&!siYEgFwcL(>1?s5{GHIyp&9Pz*m!QXE_KUItK z3g>r?=xZbukoV%FjA0%od|#N*rUH1H&zXieyeTjHl*p&}MsaCQFjFFq5q?21BLRh% zOE}5%ejCRaLoo*x7bIMc%Q*?BvQYn~go`1CFk6yv5&Ae@FZ{vjFG3N=6$zJnbBBb> zel|+D948M*xEx|a5-$4_k#MopaDTcbyoMw8dGsp;CUK0BQRVQO41cpX2iP zP{yv!PjmS@C}WrAFLC)S%Gj0p=eT?ZWqj573tTo(#xBi|arrTnu`BZP}bmUxN;~xXSK;#s0zq zwh#30w)Gn%{VPk}$i&simA@X0c;+InFJ-v#9cga-hPBuqnV2d30qw_{Zvea%Jh=bNvBl&b}oaxr-H&s0qT;Cb)b5T>Ai%QNh4$i%P5|KWjpC!2fV-Q?c9 zT_|*%zo%p3FS*OWo}0F|A)m7OdgRY?K2w8yn~kIS{b>FS$cW$m7xd`FHDm_?YM+=v zb_vk1|D~Ble_+F+e_h}F_>$*|LzAJ~k;%$e@l7E(cNyIUmBSl+@a&u)@&{*6*DU(g z);Y*;oqM|q$$Vt|sxR{3)y$i3uK~5>Jb+2t_Ln%wUcpChBd@#_hi(R)#N|HsF1W!f zkrdwntbL-@M~aiEIE&!<$64;Pz(6JaSV=t~zT90lqN7U+OozZ%!e0&dhria3(}K?# zF+~jh>zTNrn@W?S8N;w_q^uyQu+H8S2q?*nX(am`~`_yrw-oYhL+UTSQKnYvMp52FtkzIg80V< zK@CdRl5kQA4yU0&cm#PZc8LR~$%2FFB(93?7xN#=IA8IV(0DEP{ey}Z!<0mZ>+J_H zX33uBG0`1Dlg2a6Cn^BfU7W*YPxGAUB{5O3UeqCbntvg{uxzrYxIvWS1gP*t^N!>Q zFgPd4p5`IZZ9|Gk$rJ~OV*4<;{kKuZqQGE`AbW}vL=~Zk_UJpcU%<=+ zhRQ~a;ug_q1R;_CWKaF~IONIp6bFe?+(dhPPj35f0fv52oThbxD8+wJ;R)-K(^(K? z`;#I*5S^Blfv58`QQUaS_KI+jXghVRD2ME**zddSXVvRBgJlXGb;bc#A9pqEpvg-4qe(4HStRZ1Jb>&!rk@TTBV;}=owlMWeqQQOzWEy_b%^Kop>dq z^~i}=FAz9(_wFj#0KFJ*Yyy5)0)1cRUJ8O0eVz5(KfB14?_!fBr3f}H7PcQBgo zPJH9?`N4^AVl+RUcspRWp0hlx*ncdc0#0GHo>57-??Swr zCWOcc3*3DUJPx>rt@ugvV2Im#&v7|3(=+$MNF(uJ_C6LnoJPS8W-b4H}kdW#9|)AXC+&Ej?;S`>|fQKwG&x zQ>~;rh_`1Zqf0XhQq^c$9ZsYNw1gV9(uS#OnJk0D8(ec)dNjE2!Tk?F$t9HVo-J-4 z3RO7h8KcZTMn*HqaLZ{n$!kw*ZYu91C_Tx-xk6z)(T zX=^*y+N<`44|TMn9^42n+eFQ@8q-oyyc<;E@M+&7GVm%24}K<94}YmE+}Ym3xGT=< zyDqSDUOtw%H^gf=ybD~p0BkqK72*Hlt}+yo@Aw>-j&RWk7mV_?rF>KAyuvJV{rGQ{ CkQto- diff --git a/evaluation/utils/matlabPyrTools/MEX/range2.mexglx b/evaluation/utils/matlabPyrTools/MEX/range2.mexglx deleted file mode 100755 index 7053170dd89977ca38a2c8fca27b10e39c3cb305..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8226 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 Jrd@Rj`xhlY-HHGJ diff --git a/evaluation/utils/matlabPyrTools/MEX/range2.mexmaci64 b/evaluation/utils/matlabPyrTools/MEX/range2.mexmaci64 deleted file mode 100755 index ee259f645212a465b7f811c85de49336bf58c133..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8744 zcmeHNO>7%Q6dt#3;?ktv0u`w!u!vejs&EqtN+SWvwsEl`34u5$5~b6%y-5taUb8>c z0W|?RDY8N!2c%x;nI4chap3@=p;7<|Qs5B8PkTXiXpvBa5T(%Ny_s2JJ5H&nzJ0riJoEO;KYzL2Oh{-mAtVB$1;%oikZIsZyI?Gb2%$8c7*4aL`bnyXL|}+X zwupfilsa0;L5WjiJgJqhzXsPrLJVoFQJB241~8sIZe&cI+K!v)T%X^m?c935aPqMq zBO>B8i3NxUf#{f~7c~pk8uMEc@pNI2c#|LOKRBgX+p+S6QK4&$*B#{wUym4{flrOG zDb>d4h@~1Dw`h!aM#LKy0T9>5+eXMSKQ?lFu2mS6_9$ruR|NUb^9CHBE5`Nnqck_J z=X~cI$MeJC`%# z{|?Krh~y_GGep`&FpMK!MW(nN<~A6o-+k-o&(;_3OkVr=xq+`2Cea+%lQJRr3Lm?h zkVW87Z!!P_3GWvN#>02IHa~!M)CT@H*RIIi9{(;6z`$$O-fy>VsyWS~Mb#PGr{^<9 zDGm=Lp8+#Q8}`%c9XIT!I&~LZ=NHCGHj{m>ZDD>mY$uo9yEneS)^VL5t5&GaZ#0{w zcD%FJjs3r>uZs!StM?lmw;j!hAFOlaRl_4cPn5=xBEMJkl&zzRz?8Cpp54`F@n0jaK z>8)IpzZSoY3#ooBA@ zcb#8-h@KzeRDBzhnVwHonw%4Lin6ab9C3zHGmliKU;%=&3`lBbB2vXo5?*c@0!NbN zPo!s*Bg(VN(N7ofmUPfg%}1wqc%Fy&F^;EN0k8aZ-SeOZTOo()Eugr38qhTms<>lZ zvB1WQ*`W1eE}M_Dd7RBJv-t#@C)xZeo69f*!PDykY2|*n2FM!9?Oc8m<=tF<0A-2G zyHE~uc_+$${LOr?Vlr2_9K-dCTn?f94aj&sOMAi1TbeC*%BnT$8d|}L<9c6u7#C#2 zwH-O5$*OE=sxBAI!hLp8wQNl`RM;Pum@(KVEX%ZHRoBg|>cF-U%xzb9gcTvTVo;#a zOHYwdNeW3V&5=1s7{dn|X4k{2-AgDl4fuI6G1%e6$ z6$mO2R3NB8P=TNVK?VK?6~Oiof@6;j_1%JFPZcrtIFaM&!kr-a zv{PWeuaD;(sNW;{{0iVG;0}TN0f$Hk!!SAmGvI$CzSw{#8t};m{AL5jqpsR`XBzPP z4H!>H@H7g)55Nv49-Cm__9htE+r@t6Mr>s0JR4&);}&wd2A>yTvzB1XoPTeS$ro~P z+T(wBz`N;m#4Tj0Zko@#MM4d&bQrLcHwz5FNl~9Ynud=ls8Kour%I02W4ak#>thE> w^udk})I6#=eS-H3J^<}>qm;4_nMP69N*r)sF89Ovm6gwOFvyOn;5Hfk1L&FX7XSbN diff --git a/evaluation/utils/matlabPyrTools/MEX/range2.mexw32 b/evaluation/utils/matlabPyrTools/MEX/range2.mexw32 deleted file mode 100755 index 513b19583bc540f91694f2f45712b25722d522e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6656 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 See upConv.m for documentation <<< - This is a matlab interface to the internal_expand function. - EPS, 7/96. -*/ - -#define V4_COMPAT -#include /* Matlab matrices */ -#include - -#include "convolve.h" - -#define notDblMtx(it) (!mxIsNumeric(it) || !mxIsDouble(it) || mxIsSparse(it) || mxIsComplex(it)) - -void mexFunction(int nlhs, /* Num return vals on lhs */ - mxArray *plhs[], /* Matrices on lhs */ - int nrhs, /* Num args on rhs */ - const mxArray *prhs[] /* Matrices on rhs */ - ) - { - double *image,*filt, *temp, *result, *orig_filt; - int x_fdim, y_fdim, x_idim, y_idim; - int orig_x = 0, orig_y, x, y; - int x_rdim, y_rdim; - int x_start = 1; - int x_step = 1; - int y_start = 1; - int y_step = 1; - int x_stop, y_stop; - const mxArray *arg0,*arg1,*arg3,*arg4,*arg6; - double *mxMat; - char edges[15] = "reflect1"; - - if (nrhs<2) mexErrMsgTxt("requres at least 2 args."); - - /* ARG 1: IMAGE */ - arg0 = prhs[0]; - if notDblMtx(arg0) mexErrMsgTxt("IMAGE arg must be a non-sparse double float matrix."); - image = mxGetPr(arg0); - x_idim = (int) mxGetM(arg0); /* X is inner index! */ - y_idim = (int) mxGetN(arg0); - - /* ARG 2: FILTER */ - arg1 = prhs[1]; - if notDblMtx(arg1) mexErrMsgTxt("FILTER arg must be non-sparse double float matrix."); filt = mxGetPr(arg1); - x_fdim = (int) mxGetM(arg1); - y_fdim = (int) mxGetN(arg1); - - /* ARG 3 (optional): EDGES */ - if (nrhs>2) - { - if (!mxIsChar(prhs[2])) - mexErrMsgTxt("EDGES arg must be a string."); - mxGetString(prhs[2],edges,15); - } - - /* ARG 4 (optional): STEP */ - if (nrhs>3) - { - arg3 = prhs[3]; - if notDblMtx(arg3) mexErrMsgTxt("STEP arg must be double float matrix."); - if (mxGetM(arg3) * mxGetN(arg3) != 2) - mexErrMsgTxt("STEP arg must contain two elements."); - mxMat = mxGetPr(arg3); - x_step = (int) mxMat[0]; - y_step = (int) mxMat[1]; - if ((x_step<1) || (y_step<1)) - mexErrMsgTxt("STEP values must be greater than zero."); - } - - /* ARG 5 (optional): START */ - if (nrhs>4) - { - arg4 = prhs[4]; - if notDblMtx(arg4) mexErrMsgTxt("START arg must be double float matrix."); - if (mxGetM(arg4) * mxGetN(arg4) != 2) - mexErrMsgTxt("START arg must contain two elements."); - mxMat = mxGetPr(arg4); - x_start = (int) mxMat[0]; - y_start = (int) mxMat[1]; - if ((x_start<1) || (y_start<1)) - mexErrMsgTxt("START values must be greater than zero."); - } - x_start--; /* convert to standard C indexes */ - y_start--; - - /* ARG 6 (optional): STOP */ - if (nrhs>5) - { - if notDblMtx(prhs[5]) mexErrMsgTxt("STOP arg must be double float matrix."); - if (mxGetM(prhs[5]) * mxGetN(prhs[5]) != 2) - mexErrMsgTxt("STOP arg must contain two elements."); - mxMat = mxGetPr(prhs[5]); - x_stop = (int) mxMat[0]; - y_stop = (int) mxMat[1]; - if ((x_stop6) - { - arg6 = prhs[6]; - if notDblMtx(arg6) mexErrMsgTxt("RES arg must be double float matrix."); - - /* 7/10/97: Returning one of the args causes problems with Matlab's memory - manager, so we don't return anything if the result image is passed */ - /* plhs[0] = arg; */ - result = mxGetPr(arg6); - x_rdim = (int) mxGetM(arg6); /* X is inner index! */ - y_rdim = (int) mxGetN(arg6); - if ((x_stop>x_rdim) || (y_stop>y_rdim)) - mexErrMsgTxt("STOP values must within image dimensions."); - } - else - { - x_rdim = x_stop; - y_rdim = y_stop; - /* x_rdim = x_step * ((x_stop+x_step-1)/x_step); - y_rdim = y_step * ((y_stop+y_step-1)/y_step); */ - - plhs[0] = (mxArray *) mxCreateDoubleMatrix(x_rdim,y_rdim,mxREAL); - if (plhs[0] == NULL) mexErrMsgTxt("Cannot allocate result matrix"); - result = mxGetPr(plhs[0]); - } - - if ( (((x_stop-x_start+x_step-1) / x_step) != x_idim) || - (((y_stop-y_start+y_step-1) / y_step) != y_idim) ) - { - mexPrintf("Im dims: [%d %d]\n",x_idim,y_idim); - mexPrintf("Start: [%d %d]\n",x_start,y_start); - mexPrintf("Step: [%d %d]\n",x_step,y_step); - mexPrintf("Stop: [%d %d]\n",x_stop,y_stop); - mexPrintf("Res dims: [%d %d]\n",x_rdim,y_rdim); - mexErrMsgTxt("Image sizes and upsampling args are incompatible!"); - } - - /* upConv has a bug for even-length kernels when using the - reflect1, extend, or repeat edge-handlers */ - if ((!strcmp(edges,"reflect1") || !strcmp(edges,"extend") || !strcmp(edges,"repeat")) - && - ((x_fdim%2 == 0) || (y_fdim%2 == 0))) - { - orig_filt = filt; - orig_x = x_fdim; - orig_y = y_fdim; - x_fdim = 2*(orig_x/2)+1; - y_fdim = 2*(orig_y/2)+1; - filt = mxCalloc(x_fdim*y_fdim, sizeof(double)); - if (filt == NULL) - mexErrMsgTxt("Cannot allocate necessary temporary space"); - for (y=0; y x_rdim) || (y_fdim > y_rdim)) - { - mexPrintf("Filter: [%d %d], ",x_fdim,y_fdim); - mexPrintf("Result: [%d %d]\n",x_rdim,y_rdim); - mexErrMsgTxt("FILTER dimensions larger than RESULT dimensions."); - } - - temp = mxCalloc(x_fdim*y_fdim, sizeof(double)); - if (temp == NULL) - mexErrMsgTxt("Cannot allocate necessary temporary space"); - - /* - printf("(%d, %d), (%d, %d), (%d, %d), (%d, %d), (%d, %d), %s\n", - x_idim,y_idim,x_fdim,y_fdim,x_rdim,y_rdim, - x_start,x_step,y_start,y_step,edges); - */ - - if (strcmp(edges,"circular") == 0) - internal_wrap_expand(image, filt, x_fdim, y_fdim, - x_start, x_step, x_stop, y_start, y_step, y_stop, - result, x_rdim, y_rdim); - else internal_expand(image, filt, temp, x_fdim, y_fdim, - x_start, x_step, x_stop, y_start, y_step, y_stop, - result, x_rdim, y_rdim, edges); - - if (orig_x) mxFree((char *) filt); - mxFree((char *) temp); - - return; - } - - - diff --git a/evaluation/utils/matlabPyrTools/MEX/upConv.exp b/evaluation/utils/matlabPyrTools/MEX/upConv.exp deleted file mode 100755 index 406461e379e35a825f5594966213a1a7c8043a4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 652 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 diff --git a/evaluation/utils/matlabPyrTools/MEX/upConv.mexglx b/evaluation/utils/matlabPyrTools/MEX/upConv.mexglx deleted file mode 100755 index 3b124799cb2c37bcdd66e7114939ec2632116441..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28633 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 diff --git a/evaluation/utils/matlabPyrTools/MEX/upConv.mexmac b/evaluation/utils/matlabPyrTools/MEX/upConv.mexmac deleted file mode 100755 index 98e7560189a8834da5f9570059a109ccaf01ba94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34264 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 F`@iI%U>x3wJ~e}Km^i6;q7Kv66?R*^p< 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 QRm8i%;&D+a8Df0?75;zua{vGU diff --git a/evaluation/utils/matlabPyrTools/MEX/upConv.mexw32 b/evaluation/utils/matlabPyrTools/MEX/upConv.mexw32 deleted file mode 100755 index 36d501181174321aa24e68b062e8d7a079d4928e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26112 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℘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 - - - - - - - - - diff --git a/evaluation/utils/matlabPyrTools/MEX/wrap.c b/evaluation/utils/matlabPyrTools/MEX/wrap.c deleted file mode 100755 index a081123..0000000 --- a/evaluation/utils/matlabPyrTools/MEX/wrap.c +++ /dev/null @@ -1,281 +0,0 @@ -/* -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; File: wrap.c -;;; Author: Eero Simoncelli -;;; Description: Circular convolution on 2D images. -;;; Creation Date: Spring, 1987. -;;; MODIFICATIONS: -;;; 6/96: Switched array types to double float. -;;; 2/97: made more robust and readable. Added STOP arguments. -;;; ---------------------------------------------------------------- -;;; Object-Based Vision and Image Understanding System (OBVIUS), -;;; Copyright 1988, Vision Science Group, Media Laboratory, -;;; Massachusetts Institute of Technology. -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -*/ - -#include - -#include "convolve.h" - -/* - -------------------------------------------------------------------- - Performs correlation (i.e., convolution with filt(-x,-y)) of FILT - with IMAGE followed by subsampling (a.k.a. REDUCE in Burt&Adelson81). - The operations are combined to avoid unnecessary computation of the - convolution samples that are to be discarded in the subsampling - operation. The convolution is done in 9 sections so that mod - operations are not performed unnecessarily. The subsampling lattice - is specified by the START, STEP and STOP parameters. - -------------------------------------------------------------------- */ - -/* abstract out the inner product computation */ -#define INPROD(YSTART,YIND,XSTART,XIND) \ - { \ - sum=0.0; \ - for (y_im=YSTART, filt_pos=0, x_filt_stop=x_fdim; \ - x_filt_stop<=filt_size; \ - y_im++, x_filt_stop+=x_fdim) \ - for (x_im=XSTART ; \ - filt_pos); - help matlabPyrTools - -A few functions are actually MEX interfaces to C code. These are -contained in the subdirectory called MEX. The MEX files have been -tested on Sun (Solaris), LinuX (on an Intel platform), and Macintosh -OSX (on PowerPC and Intel), but should not be difficult to compile on -most other platforms. Source code is included in the MEX directory, -as well as Make files. Pre-compiled versions are included for a -number of platforms. To compile on your platform, simply run -compilePyrTools.m which is located in the MEX subdirectory. - -To make sure these are in your matlab path, you can do *one* of the -following: - 1) Create a symbolic link (or macintosh "alias") for the relavent files - in the main matlabPyrTools directory, or - 2) Copy the relavent files into the main matlabPyrTools directory, or - 3) Put the MEX subdirectory in your matlab path: addpath('matlabPyrTools/MEX'); - -Some example script files showing usage of the code are in the -directory
/TUTORIALS. There is a README file in that directory -describing the contents. - -Incremental changes/updates to the code are documented in the ChangeLog file. - -Comments/Suggestions/Bugs to: - Eero P. Simoncelli - Center for Neural Science, and - Courant Institute for Mathematical Sciences - New York University - eero.simoncelli@nyu.edu - http://www.cns.nyu.edu/~eero/ diff --git a/evaluation/utils/matlabPyrTools/TUTORIALS/HTML/lcv.css b/evaluation/utils/matlabPyrTools/TUTORIALS/HTML/lcv.css deleted file mode 100755 index 2f221f0..0000000 --- a/evaluation/utils/matlabPyrTools/TUTORIALS/HTML/lcv.css +++ /dev/null @@ -1,23 +0,0 @@ -BODY {margin-left:20; margin-top:5; margin-width:15; margin-height:5; font-family:helvetica,arial,sans-serif} - -P.titledlist {margin-left: 2.4em; text-indent: -2.4em; line-height: 1.3; -margin-top: 1.8ex; margin-bottom: 1.8ex;} - -P.people { margin-top: 0ex; margin-bottom: 0.6ex; margin-left: 12px; -text-indent: -12px; } - -P.research {margin-top: 1ex; margin-bottom: 1ex;} - -UL.compact {list-style-image:none; list-style: inside disc } - -LI.software {margin-top: 1ex; margin-bottom: 0ex;} - -a:link {text-decoration:none;} - -a:visited {text-decoration:none;} - -a:hover {color:blue; text-decoration:underline;} - -a span {display:none;} - -a:hover span {display:block; position:fixed; left:150px; padding:5px; background: #f0f0f0; border: 1px dotted #c0c0c0; opacity: 1;} diff --git a/evaluation/utils/matlabPyrTools/TUTORIALS/README b/evaluation/utils/matlabPyrTools/TUTORIALS/README deleted file mode 100755 index b8eb3ea..0000000 --- a/evaluation/utils/matlabPyrTools/TUTORIALS/README +++ /dev/null @@ -1,24 +0,0 @@ - -This directory contains some Matlab script files that serve to give -example usage of this code, and also to explain some of the -representations and algorithms. - -The files are NOT meant to be executed from the MatLab prompt (like many -of the MatLab demos). You should instead read through the comments, -executing the subsequent pieces of code. This gives you a chance to -explore as you go... - -matlabPyrTools.m - Example usage of the code in the distribution. - -pyramids.m - An introduction to multi-scale pyramid representations, - covering Laplacian, QMF/Wavelet, and Steerable pyramids. The - file assumes a knowledge of linear systems, matrix algebra, - and 2D Fourier transforms. - -matlabPyrTools.html - Same as matlabPyrTools.m, but formatted in html that - shows sample output. - -pyramids.html - Same as pyramids.m, but formatted in html that shows sample - output. - -more to come.... diff --git a/evaluation/utils/matlabPyrTools/TUTORIALS/matlabPyrTools.html b/evaluation/utils/matlabPyrTools/TUTORIALS/matlabPyrTools.html deleted file mode 100755 index 0d4c85c..0000000 --- a/evaluation/utils/matlabPyrTools/TUTORIALS/matlabPyrTools.html +++ /dev/null @@ -1,560 +0,0 @@ - - - - - - - - matlabPyrTools - - - - - - -
-

Some examples using the tools in this distribution.

-

Contents

- -

Load an image, and downsample to a size appropriate for the machine speed.

-
oim = pgmRead('einstein.pgm');
-tic; corrDn(oim,[1 1; 1 1]/4,'reflect1',[2 2]); time = toc;
-imSubSample = min(max(floor(log2(time)/2+3),0),2);
-im = blurDn(oim, imSubSample,'qmf9');
-clear oim;
-
ShowIm: - 3 types of automatic graylevel scaling, 2 types of automatic - sizing, with or without title and Range information. -
help showIm
-
  RANGE = showIm (MATRIX, RANGE, ZOOM, LABEL, NSHADES )
-  
-  Display a MatLab MATRIX as a grayscale image in the current figure,
-  inside the current axes.  If MATRIX is complex, the real and imaginary 
-  parts are shown side-by-side, with the same grayscale mapping.
-  
-  If MATRIX is a string, it should be the name of a variable bound to a 
-  MATRIX in the base (global) environment.  This matrix is displayed as an 
-  image, with the title set to the string.
-  
-  RANGE (optional) is a 2-vector specifying the values that map to
-  black and white, respectively.  Passing a value of 'auto' (default)
-  sets RANGE=[min,max] (as in MatLab's imagesc).  'auto2' sets
-  RANGE=[mean-2*stdev, mean+2*stdev].  'auto3' sets
-  RANGE=[p1-(p2-p1)/8, p2+(p2-p1)/8], where p1 is the 10th percentile
-  value of the sorted MATRIX samples, and p2 is the 90th percentile
-  value.
-  
-  ZOOM specifies the number of matrix samples per screen pixel.  It
-  will be rounded to an integer, or 1 divided by an integer.  A value
-  of 'same' or 'auto' (default) causes the zoom value to be chosen
-  automatically to fit the image into the current axes.  A value of
-  'full' fills the axis region (leaving no room for labels).  See
-  pixelAxes.m.
-  
-  If LABEL (optional, default = 1, unless zoom='full') is non-zero, the range 
-  of values that are mapped into the gray colormap and the dimensions 
-  (size) of the matrix and zoom factor are printed below the image.  If label 
-  is a string, it is used as a title.
-  
-  NSHADES (optional) specifies the number of gray shades, and defaults
-  to the size of the current colormap.
-
-
-
-clf; showIm(im,'auto1','auto','Al')
- -
-ans =
-
-     0   237
-
-
-
-clf; showIm('im','auto2')
- -
-ans =
-
-   33.5299  181.9745
-
-
-
-clf; showIm(im,'auto3',2)
-
-

-

-ans =
-
-   34.5314  161.4488
-
-
-Statistics:
mean2(im)
-var2(im)
-skew2(im)
-kurt2(im)
-entropy2(im)
-imStats(im)
-
-
-ans =
-
-  107.7522
-
-
-ans =
-
-   1.3772e+03
-
-
-ans =
-
-   -0.3853
-
-
-ans =
-
-    3.4430
-
-
-ans =
-
-    6.8841
-
-Image statistics:
-  Range: [0.000000, 237.000000]
-  Mean: 107.752213,  Stdev: 37.111143,  Kurtosis: 3.442999
-
-

Synthetic images. First pick some parameters:

-
-sz = 200;
-dir = 2*pi*rand(1)
-slope = 10*rand(1)-5
-int = 10*rand(1)-5;
-orig = round(1+(sz-1)*rand(2,1));
-expt = 0.8+rand(1)
-ampl = 1+5*rand(1)
-ph = 2*pi*rand(1)
-per = 20
-twidth = 7
-
-
-dir =
-
-    5.0015
-
-
-slope =
-
-   -4.3516
-
-
-expt =
-
-    1.1006
-
-
-ampl =
-
-    5.2370
-
-
-ph =
-
-    2.5244
-
-
-per =
-
-    20
-
-
-twidth =
-
-     7
-
-
-clf;
-showIm(mkRamp(sz,dir,slope,int,orig));
-
- -
-showIm(mkImpulse(sz,orig,ampl));
-
- -
-showIm(mkR(sz,expt,orig));
-
- -
-showIm(mkAngle(sz,dir));
-
- -
-showIm(mkDisc(sz,sz/4,orig,twidth));
-
- -
-showIm(mkGaussian(sz,(sz/6)^2,orig,ampl));
-
- -
-showIm(mkZonePlate(sz,ampl,ph));
-
- -
-showIm(mkAngularSine(sz,3,ampl,ph,orig));
-
- -
-showIm(mkSine(sz,per,dir,ampl,ph,orig));
-
- -
-showIm(mkSquare(sz,per,dir,ampl,ph,orig,twidth));
-
- -
-showIm(mkFract(sz,expt));
-
- -

Point operations (lookup tables):

[Xtbl,Ytbl] = rcosFn(20, 25, [-1 1]);
-plot(Xtbl,Ytbl);
-showIm(pointOp(mkR(100,1,[70,30]), Ytbl, Xtbl(1), Xtbl(2)-Xtbl(1), 0));
-
- - -

histogram Modification/matching:

[N,X] = histo(im, 150);
-[mn, mx] = range2(im);
-matched = histoMatch(rand(size(im)), N, X);
-showIm(im + sqrt(-1)*matched);
-[Nm,Xm] = histo(matched,150);
-nextFig(2,1);
-  subplot(1,2,1); plot(X,N); axis([mn mx 0 max(N)]);
-  subplot(1,2,2);  plot(Xm,Nm); axis([mn mx 0 max(N)]);
-nextFig(2,-1);
-
-
- -

Convolution routines:

-

Compare speed of convolution/downsampling routines:

noise = rand(400); filt = rand(10);
-tic; res1 = corrDn(noise,filt(10:-1:1,10:-1:1),'reflect1',[2 2]); toc;
-tic; ires = rconv2(noise,filt); res2 = ires(1:2:400,1:2:400); toc;
-imStats(res1,res2)
-
Elapsed time is 0.047516 seconds.
-Elapsed time is 0.445268 seconds.
-Difference statistics:
-  Range: [-2.486900e-14, 2.842171e-14]
-  Mean: 0.000000,  Stdev (rmse): 0.000000,  SNR (dB): 302.015673
-

Display image and extension of left and top boundaries:

fsz = [9 9];
-fmid = ceil((fsz+1)/2);
-imsz = [16 16];
-
-% pick one:
-im = eye(imsz);
-im = mkRamp(imsz,pi/6);
-im = mkSquare(imsz,6,pi/6);
-
-% pick one:
-edges='reflect1';
-edges='reflect2';
-edges='repeat';
-edges='extend';
-edges='zero';
-edges='circular';
-edges='dont-compute';
-
-filt = mkImpulse(fsz,[1 1]);
-showIm(corrDn(im,filt,edges));
-line([0,0,imsz(2),imsz(2),0]+fmid(2)-0.5, ...
-     [0,imsz(1),imsz(1),0,0]+fmid(1)-0.5);
-title(sprintf('Edges = %s',edges));
-

Multi-scale pyramids (see pyramids.m for more examples, and explanations):

-

A Laplacian pyramid:

-
[pyr,pind] = buildLpyr(im);
-showLpyr(pyr,pind);
-
- -
-res = reconLpyr(pyr, pind); 		% full reconstruction
-imStats(im,res);			% essentially perfect
-
-
Difference statistics:
-  Range: [-1.110223e-16, 1.110223e-16]
-  Mean: 0.000000,  Stdev (rmse): 0.000000,  SNR (dB): 328.192949
-
-
-res = reconLpyr(pyr, pind, [2 3]);  %reconstruct 2nd and 3rd levels only
-showIm(res);
-
- -

Wavelet/QMF pyramids:

-
filt = 'qmf9'; edges = 'reflect1';
-filt = 'haar'; edges = 'qreflect2';
-filt = 'qmf12'; edges = 'qreflect2';
-filt = 'daub3'; edges = 'circular';
-
-%[pyr,pind] = buildWpyr(im, 5-imSubSample, filt, edges);
-[pyr,pind] = buildWpyr(im, 'auto', filt, edges);
-showWpyr(pyr,pind,'auto2');
-
- -
-res = reconWpyr(pyr, pind, filt, edges);
-clf;
-showIm(im + i*res);
-imStats(im,res);
-
-
Difference statistics:
-  Range: [-1.419542e-11, 1.515488e-11]
-  Mean: 0.000000,  Stdev (rmse): 0.000000,  SNR (dB): 225.129905
-
- -
-res = reconWpyr(pyr, pind, filt, edges, 'all', [2]);  %vertical only
-clf;
-showIm(res);
-
- -

Steerable pyramid:

%[pyr,pind] = buildSpyr(im,4-imSubSample,'sp3Filters');
-[pyr,pind] = buildSpyr(im,'auto','sp3Filters');
-showSpyr(pyr,pind);
-

Steerable pyramid, constructed in frequency domain:

%[pyr,pind] = buildSFpyr(im,5-imSubSample,4);  %5 orientation bands
-[pyr,pind] = buildSFpyr(im);  %5 orientation bands
-showSpyr(pyr,pind);
-res = reconSFpyr(pyr,pind);
-imStats(im,res);
-
Difference statistics:
-  Range: [-1.176482e-05, 1.176482e-05]
-  Mean: -0.000000,  Stdev (rmse): 0.000006,  SNR (dB): 102.665681
-
-
- - - \ No newline at end of file diff --git a/evaluation/utils/matlabPyrTools/TUTORIALS/matlabPyrTools.m b/evaluation/utils/matlabPyrTools/TUTORIALS/matlabPyrTools.m deleted file mode 100755 index cbdd881..0000000 --- a/evaluation/utils/matlabPyrTools/TUTORIALS/matlabPyrTools.m +++ /dev/null @@ -1,147 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%% Some examples using the tools in this distribution. -%%% Eero Simoncelli, 2/97. -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%% Load an image, and downsample to a size appropriate for the machine speed. -oim = pgmRead('einstein.pgm'); -tic; corrDn(oim,[1 1; 1 1]/4,'reflect1',[2 2]); time = toc; -imSubSample = min(max(floor(log2(time)/2+3),0),2); -im = blurDn(oim, imSubSample,'qmf9'); -clear oim; - -%%% ShowIm: -%% 3 types of automatic graylevel scaling, 2 types of automatic -%% sizing, with or without title and Range information. -help showIm -clf; showIm(im,'auto1','auto','Al') -clf; showIm('im','auto2') -clf; showIm(im,'auto3',2) - -%%% Statistics: -mean2(im) -var2(im) -skew2(im) -kurt2(im) -entropy2(im) -imStats(im) - -%%% Synthetic images. First pick some parameters: -sz = 200; -dir = 2*pi*rand(1) -slope = 10*rand(1)-5 -int = 10*rand(1)-5; -orig = round(1+(sz-1)*rand(2,1)); -expt = 0.8+rand(1) -ampl = 1+5*rand(1) -ph = 2*pi*rand(1) -per = 20 -twidth = 7 - -clf; -showIm(mkRamp(sz,dir,slope,int,orig)); -showIm(mkImpulse(sz,orig,ampl)); -showIm(mkR(sz,expt,orig)); -showIm(mkAngle(sz,dir)); -showIm(mkDisc(sz,sz/4,orig,twidth)); -showIm(mkGaussian(sz,(sz/6)^2,orig,ampl)); -showIm(mkZonePlate(sz,ampl,ph)); -showIm(mkAngularSine(sz,3,ampl,ph,orig)); -showIm(mkSine(sz,per,dir,ampl,ph,orig)); -showIm(mkSquare(sz,per,dir,ampl,ph,orig,twidth)); -showIm(mkFract(sz,expt)); - - -%%% Point operations (lookup tables): -[Xtbl,Ytbl] = rcosFn(20, 25, [-1 1]); -plot(Xtbl,Ytbl); -showIm(pointOp(mkR(100,1,[70,30]), Ytbl, Xtbl(1), Xtbl(2)-Xtbl(1), 0)); - - -%%% histogram Modification/matching: -[N,X] = histo(im, 150); -[mn, mx] = range2(im); -matched = histoMatch(rand(size(im)), N, X); -showIm(im + sqrt(-1)*matched); -[Nm,Xm] = histo(matched,150); -nextFig(2,1); - subplot(1,2,1); plot(X,N); axis([mn mx 0 max(N)]); - subplot(1,2,2); plot(Xm,Nm); axis([mn mx 0 max(N)]); -nextFig(2,-1); - -%%% Convolution routines: - -%% Compare speed of convolution/downsampling routines: -noise = rand(400); filt = rand(10); -tic; res1 = corrDn(noise,filt(10:-1:1,10:-1:1),'reflect1',[2 2]); toc; -tic; ires = rconv2(noise,filt); res2 = ires(1:2:400,1:2:400); toc; -imStats(res1,res2) - -%% Display image and extension of left and top boundaries: -fsz = [9 9]; -fmid = ceil((fsz+1)/2); -imsz = [16 16]; - -% pick one: -im = eye(imsz); -im = mkRamp(imsz,pi/6); -im = mkSquare(imsz,6,pi/6); - -% pick one: -edges='reflect1'; -edges='reflect2'; -edges='repeat'; -edges='extend'; -edges='zero'; -edges='circular'; -edges='dont-compute'; - -filt = mkImpulse(fsz,[1 1]); -showIm(corrDn(im,filt,edges)); -line([0,0,imsz(2),imsz(2),0]+fmid(2)-0.5, ... - [0,imsz(1),imsz(1),0,0]+fmid(1)-0.5); -title(sprintf('Edges = %s',edges)); - -%%% Multi-scale pyramids (see pyramids.m for more examples, -%%% and explanations): - -%% A Laplacian pyramid: -[pyr,pind] = buildLpyr(im); -showLpyr(pyr,pind); - -res = reconLpyr(pyr, pind); % full reconstruction -imStats(im,res); % essentially perfect - -res = reconLpyr(pyr, pind, [2 3]); %reconstruct 2nd and 3rd levels only -showIm(res); - -%% Wavelet/QMF pyramids: -filt = 'qmf9'; edges = 'reflect1'; -filt = 'haar'; edges = 'qreflect2'; -filt = 'qmf12'; edges = 'qreflect2'; -filt = 'daub3'; edges = 'circular'; - -%[pyr,pind] = buildWpyr(im, 5-imSubSample, filt, edges); -[pyr,pind] = buildWpyr(im, 'auto', filt, edges); -showWpyr(pyr,pind,'auto2'); - -res = reconWpyr(pyr, pind, filt, edges); -clf; -showIm(im + i*res); -imStats(im,res); - -res = reconWpyr(pyr, pind, filt, edges, 'all', [2]); %vertical only -clf; -showIm(res); - -%% Steerable pyramid: -%[pyr,pind] = buildSpyr(im,4-imSubSample,'sp3Filters'); -[pyr,pind] = buildSpyr(im,'auto','sp3Filters'); -showSpyr(pyr,pind); - -%% Steerable pyramid, constructed in frequency domain: -%[pyr,pind] = buildSFpyr(im,5-imSubSample,4); %5 orientation bands -[pyr,pind] = buildSFpyr(im); %5 orientation bands -showSpyr(pyr,pind); -res = reconSFpyr(pyr,pind); -imStats(im,res); diff --git a/evaluation/utils/matlabPyrTools/TUTORIALS/pyramids.html b/evaluation/utils/matlabPyrTools/TUTORIALS/pyramids.html deleted file mode 100755 index a663f36..0000000 --- a/evaluation/utils/matlabPyrTools/TUTORIALS/pyramids.html +++ /dev/null @@ -1,1701 +0,0 @@ - - - - - - - - pyramids - - - - - - - -

IMAGE PYRAMID TUTORIAL

-
- -A brief introduction to multi-scale pyramid decompositions for image processing. You should go through this, reading the comments, and -executing the corresponding MatLab instructions. This file assumes a basic familiarity with matrix algebra, with linear systems and Fourier -theory, and with MatLab. If you don't understand a particular function call, execute "help <functionName>" to see documentation. -
EPS, 6/96. -
Based on the original OBVIUS tutorial.

-Determine a subsampling factor for images, based on machine speed:

oim = pgmRead('einstein.pgm');
-tic; corrDn(oim,[1 1; 1 1]/4,'reflect1',[2 2]); time = toc;
-imSubSample = min(max(floor(log2(time)/2+3),0),2);
-im = blurDn(oim, imSubSample,'qmf9');
-clear oim;
-clf; showIm(im, 'auto2', 'auto', 'im');
-
-
- -

LAPLACIAN PYRAMIDS:

-Images may be decomposed into information at different scales. Blurring eliminates the fine scales (detail):
binom5 = binomialFilter(5);
-lo_filt = binom5*binom5';
-blurred = rconv2(im,lo_filt);
-subplot(1,2,1); showIm(im, 'auto2', 'auto', 'im');
-subplot(1,2,2); showIm(blurred, 'auto2', 'auto', 'blurred');
-

-Subtracting the blurred image from the original leaves ONLY the fine scale detail:
fine0 = im - blurred;
-subplot(1,2,1); showIm(fine0, 'auto2', 'auto', 'fine0');
-

-The blurred and fine images contain all the information found in -the original image. Trivially, adding the blurred image to the -fine scale detail will reconstruct the original. We can compare -the original image to the sum of blurred and fine using the -"imStats" function, which reports on the statistics of the -difference between it's arguments: -
imStats(im, blurred+fine0);
-
Difference statistics:
-  Range: [-7.105427e-15, 3.552714e-15]
-  Mean: -0.000000,  Stdev (rmse): 0.000000,  SNR (dB): 353.641098
-
-Since the filter is a lowpass filter, we might want to subsample - the blurred image. This may cause some aliasing (depends on the - filter), but the decomposition structure given above will still be - possible. The corrDn function correlates (same as convolution, but - flipped filter) and downsamples in a single operation (for - efficiency). The string 'reflect1' tells the function to handle - boundaries by reflecting the image about the edge pixels. Notice - that the blurred1 image is half the size (in each dimension) of the - original image. -
lo_filt = 2*binom5*binom5';  %construct a separable 2D filter
-blurred1 = corrDn(im,lo_filt,'reflect1',[2 2]);
-subplot(1,2,2); showIm(blurred1,'auto2','auto','blurred1');
-

-Now, to extract fine scale detail, we must interpolate the image - back up to full size before subtracting it from the original. The - upConv function does upsampling (padding with zeros between - samples) followed by convolution. This can be done using the - lowpass filter that was applied before subsampling or it can be - done with a different filter. -
fine1 = im - upConv(blurred1,lo_filt,'reflect1',[2 2],[1 1],size(im));
-subplot(1,2,1); showIm(fine1,'auto2','auto','fine1');
-

-We now have a technique that takes an image, computes two new - images (blurred1 and fine1) containing the coarse scale information - and the fine scale information. We can also (trivially) - reconstruct the original from these two (even if the subsampling of - the blurred1 image caused aliasing):
recon = fine1 + upConv(blurred1,lo_filt,'reflect1',[2 2],[1 1],size(im));
-imStats(im, recon);
-
Difference statistics:
-  Range: [-7.105427e-15, 7.105427e-15]
-  Mean: -0.000000,  Stdev (rmse): 0.000000,  SNR (dB): 345.757412
-
-Thus, we have described an INVERTIBLE linear transform that maps an - input image to the two images blurred1 and fine1. The inverse - transformation maps blurred1 and fine1 to the result. This is - depicted graphically with a system diagram: -
IM --> blur/down2 ---------> BLURRED1 --> up2/blur --> add --> RECON
-|                    |                                  ^
-|	             |                                  |
-|	             V                                  |
-|	          up2/blur                              |
-|	             |                                  |
-|	             |                                  |
-|	             V                                  |
- --------------> subtract --> FINE1 -------------------
-Note that the number of samples in the representation (i.e., total - samples in BLURRED1 and FINE1) is 1.5 times the number of samples - in the original IM. Thus, this representation is OVERCOMPLETE. - Often, we will want further subdivisions of scale. We can - decompose the (coarse-scale) BLURRED1 image into medium coarse and - very coarse images by applying the same splitting technique: -
blurred2 = corrDn(blurred1,lo_filt,'reflect1',[2 2]);
-showIm(blurred2)
-
-
-ans =
-
-  152.6425  710.8401
-
- -
-fine2 = blurred1 - upConv(blurred2,lo_filt,'reflect1',[2 2],[1 1],size(blurred1));
-showIm(fine2)
-
-
-ans =
-
- -107.9813  151.5816
-
-
-
-Since blurred2 and fine2 can be used to reconstruct blurred1, and - blurred1 and fine1 can be used to reconstruct the original image, - the set of THREE images (also known as "subbands") {blurred2, - fine2, fine1} constitute a complete representation of the original - image. Note that the three subbands are displayed at the same size, - but they are actually three different sizes. -
subplot(1,3,1); showIm(fine1,'auto2',2^(imSubSample-1),'fine1');
-subplot(1,3,2); showIm(fine2,'auto2',2^(imSubSample),'fine2');
-subplot(1,3,3); showIm(blurred2,'auto2',2^(imSubSample+1),'blurred2');
-

-It is useful to consider exactly what information is stored in each - of the pyramid subbands. The reconstruction process involves - recursively interpolating these images and then adding them to the - image at the next finer scale. To see the contribution of ONE of - the representation images (say blurred2) to the reconstruction, we - imagine filling all the other subbands with zeros and then - following our reconstruction procedure. For the blurred2 subband, - this is equivalent to simply calling upConv twice: -
blurred2_full = upConv(upConv(blurred2,lo_filt,'reflect1',[2 2],[1 1],size(blurred1)),...
-    lo_filt,'reflect1',[2 2],[1 1],size(im));
-subplot(1,3,3); showIm(blurred2_full,'auto2',2^(imSubSample-1),'blurred2-full');
-

For the fine2 subband, this is equivalent to calling upConv once:

fine2_full = upConv(fine2,lo_filt,'reflect1',[2 2],[1 1],size(im));
-subplot(1,3,2); showIm(fine2_full,'auto2',2^(imSubSample-1),'fine2-full');
-

If we did everything correctly, we should be able to add together these three full-size images to reconstruct the original image:

recon = blurred2_full + fine2_full + fine1;
-imStats(im, recon)
-
-
-
Difference statistics:
-  Range: [-8.526513e-14, 5.684342e-14]
-  Mean: -0.000000,  Stdev (rmse): 0.000000,  SNR (dB): 307.603254
-
- -

FUNCTIONS for CONSTRUCTING/MANIPULATING LAPLACIAN PYRAMIDS

-We can continue this process, recursively splitting off finer and finer details from the blurred image (like peeling off the outer layers of an onion). The resulting data structure is known as a "Laplacian Pyramid". To make things easier, we have written a MatLab function called buildLpyr to construct this object. The function returns two items: a long vector containing the subbands of the pyramid, and an index matrix that is used to access these subbands. The display routine showLpyr shows all the subbands of the pyramid, at the their correct relative sizes. It should now be clearer why these data structures are called "pyramids".

[pyr,pind] = buildLpyr(im,5-imSubSample);
-showLpyr(pyr,pind);
-

There are also "accessor" functions for pulling out a single subband:

showIm(pyrBand(pyr,pind,2));
-
-
-The reconLpyr function allows you to reconstruct from a laplacian pyramid. The third (optional) arg allows you to select any subset of pyramid bands (default is to use ALL of them).

clf; showIm(reconLpyr(pyr,pind,[1 3]),'auto2','auto','bands 1 and 3 only');
-
- -
-fullres = reconLpyr(pyr,pind);
-showIm(fullres,'auto2','auto','Full reconstruction');
-imStats(im,fullres);
-
Difference statistics:
-  Range: [-7.105427e-15, 7.105427e-15]
-  Mean: 0.000000,  Stdev (rmse): 0.000000,  SNR (dB): 345.757510
-
-
buildLpyr uses 5-tap filters by default for building Laplacian pyramids. You can specify other filters:

namedFilter('binom3')
-[pyr3,pind3] = buildLpyr(im,5-imSubSample,'binom3');
-showLpyr(pyr3,pind3);
-fullres3 = reconLpyr(pyr3,pind3,'all','binom3');
-imStats(im,fullres3);
-
-ans =
-
-    0.3536
-    0.7071
-    0.3536
-
-Difference statistics:
-  Range: [, 7.105427e-15]
-  Mean: 0.000000,  Stdev (rmse): 0.000000,  SNR (dB): 350.953606
-
-
Here we build a "Laplacian" pyramid using random filters. filt1 is used with the downsampling operations and filt2 is used with the upsampling operations. We normalize the filters for display purposes. Of course, these filters are (almost certainly) not very "Gaussian", and the subbands of such a pyramid will be garbage! Nevertheless, it is a simple property of the Laplacian pyramid that we can use ANY filters and we will still be able to reconstruct perfectly.

filt1 = rand(1,5); filt1 = sqrt(2)*filt1/sum(filt1)
-filt2 = rand(1,3); filt2 = sqrt(2)*filt2/sum(filt2)
-[pyrr,pindr] = buildLpyr(im,5-imSubSample,filt1,filt2);
-showLpyr(pyrr,pindr);
-fullresr = reconLpyr(pyrr,pindr,'all',filt2);
-imStats(im,fullresr);
-
-
-
-filt1 =
-
-    0.3708    0.2612    0.2453    0.4093    0.1276
-
-
-filt2 =
-
-    0.5662    0.5636    0.2845
-
-Difference statistics:
-  Range: [-1.421085e-14, 2.842171e-14]
-  Mean: -0.000000,  Stdev (rmse): 0.000000,  SNR (dB): 336.260358
-
-

ALIASING in the Gaussian and Laplacian pyramids:

-Unless one is careful, the subsampling operations will introduce aliasing artifacts in these pyramid transforms. This is true even though the Laplacian pyramid can be used to reconstruct the original image perfectly. When reconstructing, the pyramid is designed in such a way that these aliasing artifacts cancel out. So it's not a problem if the only thing we want to do is reconstruct. However, it can be a serious problem if we intend to process each of the subbands independently. One way to see the consequences of the aliasing artifacts is byexamining variations that occur when the input is shifted. We choose an image and shift it by some number of pixels. Then blur -(filter-downsample-upsample-filter) the original image and blur the shifted image. If there's no aliasing, then the blur and shift operations should commute (i.e., shift-filter-downsample-upsample-filter is the same as filter-downsample-upsample-filter-shift). Try this for 2 different filters (by replacing 'binom3' with 'binom5' or 'binom7' below), and you'll see that the aliasing is much worse for the 3 tap filter.

sig = 100*randn([1 16]);
-sh = [0 7];  %shift amount
-lev = 2; % level of pyramid to look at
-flt = 'binom3';  %filter to use:
-
-shiftIm = shift(sig,sh);
-[pyr,pind] = buildLpyr(shiftIm, lev, flt, flt, 'circular');
-shiftBlur = reconLpyr(pyr, pind, lev, flt, 'circular');
-
-[pyr,pind] = buildLpyr(sig, lev, flt, flt, 'circular');
-res = reconLpyr(pyr, pind, lev, flt, 'circular');
-blurShift = shift(res,sh);
-
-subplot(2,1,1); r = showIm(shiftBlur,'auto2','auto','shiftBlur');
-subplot(2,1,2); showIm(blurShift,r,'auto','blurShift');
-imStats(blurShift,shiftBlur);
-
-
-
Difference statistics:
-  Range: [-9.191223e+01, 8.063398e+01]
-  Mean: 0.000000,  Stdev (rmse): 46.487369,  SNR (dB): -0.344851
-
-

PROJECTION and BASIS functions:

-An invertible, linear transform can be characterized in terms of a set of PROJECTION and BASIS functions. In matlab matrix notation:
-c = P' * x
-x = B * c
-where x is an input, c are the transform coefficients, P and B are matrices. The columns of P are the projection functions (the input is projected onto the the columns of P to get each successive transform coefficient). The columns of B are the basis functions (x is a linear combination of the columns of B). Since the Laplacian pyramid is a linear transform, we can ask: what are its BASIS functions? We consider these in one dimension for simplicity. The BASIS function corresponding to a given coefficient tells us how much that coefficient contributes to each pixel in the reconstructed image. We can construct a single basis -function by setting one sample of one subband equal to 1.0 (and all others to zero) and reconstructing. To build the entire matrix, we have to do this for every sample of every subband:

sz = min(round(48/(sqrt(2)^imSubSample)),36);
-sig = zeros(sz,1);
-[pyr,pind] = buildLpyr(sig);
-basis = zeros(sz,size(pyr,1));
-for n=1:size(pyr,1)
-  pyr = zeros(size(pyr));
-  pyr(n) = 1;
-  basis(:,n) = reconLpyr(pyr,pind);
-end
-clf; showIm(basis)
-
-ans =
-
-     0     1
-
-

The columns of the basis matrix are the basis functions. The matrix is short and fat, corresponding to the fact that the representation is OVERCOMPLETE. Below, we plot the middle one from each subband, starting with the finest scale. Note that all of these basis functions are lowpass (Gaussian-like) functions.

locations = round(sz * (2 - 3./2.^[1:max(4,size(pind,1))]))+1;
-for lev=1:size(locations,2)
-  subplot(2,2,lev);
-  showIm(basis(:,locations(lev)));
-  axis([0 sz 0 1.1]);
-end
-

Now, we'd also like see the inverse (we'll call them PROJECTION) functions. We need to ask how much of each sample of the input image contributes to a given pyramid coefficient. Thus, the matrix is constructed by building pyramids on the set of images with impulses at each possible location. The rows of this matrix are the projection functions.

projection = zeros(size(pyr,1),sz);
-for pos=1:sz
-  [pyr,pind] = buildLpyr(mkImpulse([1 sz], [1 pos]));
-  projection(:,pos) = pyr;
-end
-clf; showIm(projection);
-

Building a pyramid corresponds to multiplication by the projection matrix. Reconstructing from this pyramid corresponds to multiplication by the basis matrix. Thus, the product of the two matrices (in this order) should be the identity matrix:

showIm(basis*projection);
-

We can plot a few example projection functions at different scales. Note that all of the projection functions are bandpass functions, except for the coarsest subband which is lowpass.

for lev=1:size(locations,2)
-  subplot(2,2,lev);
-  showIm(projection(locations(lev),:));
-  axis([0 sz -0.3 0.8]);
-end
-

Now consider the frequency response of these functions, plotted over the range [-pi,pi]:

for lev=1:size(locations,2)
-  subplot(2,2,lev);
-  proj = projection(locations(lev),:);
-  plot(pi*[-32:31]/32,fftshift(abs(fft(proj',64))));
-  axis([-pi pi -0.1 3]);
-end
-

The first projection function is highpass, and the second is bandpass. Both of these look something like the Laplacian (2nd derivative) of a Gaussian. -The last is lowpass, as are the basis functions. Thus, the basic operation used to create each level of the pyramid involves a simple highpass/lowpass split.

-

QMF/WAVELET PYRAMIDS.

-Two things about Laplacian pyramids are a bit unsatisfactory.First, there are more pixels (coefficients) in the representation than in the original image. Specifically, the 1-dimensional transform is overcomplete by a factor of 4/3, and the 2-dimensional transform is overcomplete by a factor of 2. Secondly, the"bandpass" images (fineN) do not segregate information according toorientation.
There are other varieties of pyramid. One type that arose in the speech coding community is based on a particular pairs of filters known as a "Quadrature Mirror Filters" or QMFs. These are closely related to Wavelets (essentially, they are approximate wavelet -filters).
Recall that the Laplacian pyramid is formed by simple hi/low splitting at each level. The lowpass band is subsampled by a factor of 2, but the highpass band is NOT subsampled. In the QMF pyramid, we apply two filters (hi- and lo- pass) and subsample BOTH by a factor of 2, thus eliminating the excess coefficients of the Laplacian pyramid.
The two filters must have a specific relationship to each other. In particular, let n be an index for the filter samples. -The highpass filter may be constructed from the lowpass filter by (1) modulating (multiplying) by (-1)^n (equivalent to shifting by pi in the Fourier domain), (2) flipping (i.e., reversing the order of the taps), (3) spatially shifting by one sample. Try to convince yourself that the resulting filters will always be orthogonal to each other (i.e., their inner products will be zero) when shifted by any multiple of two.
The function modulateFlip performs the first two of these operations. The third (spatial shifting) step is built into the convolution code.

flo = namedFilter('qmf9')';
-fhi = modulateFlip(flo)';
-subplot(2,1,1); lplot(flo); axis([0 10 -0.5 1.0]); title('lowpass');
-subplot(2,1,2); lplot(fhi); axis([0 10 -0.5 1.0]); title('highpass');
-

In the Fourier domain, these filters are (approximately) "power-complementary": the sum of their squared power spectra is (approximately) a constant. But note that neither is a perfect bandlimiter (i.e., a sinc function), and thus subsampling by a factor of 2 will cause aliasing in each of the subbands. See below for a discussion of the effect of this aliasing. Plot the two frequency responses:

freq = pi*[-32:31]/32;
-subplot(2,1,1);
-plot(freq,fftshift(abs(fft(flo,64))),'--',freq,fftshift(abs(fft(fhi,64))),'-');
-axis([-pi pi 0 1.5]); title('FFT magnitudes');
-subplot(2,1,2);
-plot(freq,fftshift(abs(fft(flo,64)).^2)+fftshift(abs(fft(fhi,64)).^2));
-axis([-pi pi 0 2.2]); title('Sum of squared magnitudes');
-

We can split an input signal into two bands as follows:

sig = mkFract([1,64],1.6);
-subplot(2,1,1); showIm(sig,'auto1','auto','sig');
-lo1 = corrDn(sig,flo,'reflect1',[1 2],[1 1]);
-hi1 = corrDn(sig,fhi,'reflect1',[1 2],[1 2]);
-subplot(2,1,2);
-showIm(lo1,'auto1','auto','low and high bands'); hold on; plot(hi1,'--r'); hold off;
-

Notice that the two subbands are half the size of the original image, due to the subsampling by a factor of 2. One subtle point: the highpass and lowpass bands are subsampled on different lattices: the lowpass band retains the odd-numbered samples and the highpass band retains the even-numbered samples. This was the 1-sample shift relating the high and lowpass kernels (mentioned above). We've used the 'reflect1' to handle boundaries, which works properly for symmetric odd-length QMFs.
We can reconstruct the original image by interpolating these two subbands USING THE SAME FILTERS:

reconlo = upConv(lo1,flo,'reflect1',[1 2]);
-reconhi = upConv(hi1,fhi,'reflect1',[1 2],[1 2]);
-subplot(2,1,2); showIm(reconlo+reconhi,'auto1','auto','reconstructed');
-imStats(sig,reconlo+reconhi);
-
Difference statistics:
-  Range: [-1.832183e-03, 1.369161e-03]
-  Mean: -0.000062,  Stdev (rmse): 0.000727,  SNR (dB): 62.766134
-

We have described an INVERTIBLE linear transform that maps an input image to the two images lo1 and hi1. The inverse transformation maps these two images to the result. This is depicted graphically with a system diagram:
-
IM ---> flo/down2 --> LO1 --> up2/flo --> add --> RECON
-    |                                      ^
-    |	                                   |
-    |	                                   |
-     -> fhi/down2 --> HI1 --> up2/fhi -----

-Note that the number of samples in the representation (i.e., total samples in LO1 and HI1) is equal to the number of samples in the original IM. Thus, this representation is exactly COMPLETE, or "critically sampled".
So we've fixed one of the problems that we had with Laplacian pyramid. But the system diagram above places strong constraints on the filters. In particular, for these filters the reconstruction is no longer perfect. Turns out there are NO perfect-reconstruction symmetric filters that are power-complementary, except for the trivial case [1] and the nearly-trivial case [1 1]/sqrt(2).
Let's consider the projection functions of this 2-band splitting operation. We can construct these by applying the transform to impulse input signals, for all possible impulse locations. The rows of the following matrix are the projection functions for each coefficient in the transform.

M = [corrDn(eye(32),flo','circular',[1 2]), ...
-     corrDn(eye(32),fhi','circular',[1 2],[1 2])]';
-clf; showIm(M,'auto1','auto','M');
-

The transform matrix is composed of two sub-matrices. The top half contains the lowpass kernel, shifted by increments of 2 samples. The bottom half contains the highpass. Now we compute the inverse of this matrix:

M_inv = inv(M);
-showIm(M_inv,'auto1','auto','M_inv');
-

The inverse is (very close to) the transpose of the original matrix! In other words, the transform is orthonormal.

imStats(M_inv',M);
-
Difference statistics:
-  Range: [-6.479123e-04, 3.974265e-04]
-  Mean: -0.000004,  Stdev (rmse): 0.000263,  SNR (dB): 56.495757
-

This also points out a nice relationship between the corrDn and upConv functions, and the matrix representation. corrDn is equivalent to multiplication by a matrix with copies of the filter on the ROWS, translated in multiples of the downsampling factor. upConv is equivalent to multiplication by a matrix with copies of the filter on the COLUMNS, translated by the upsampling factor. As in the Laplacian pyramid, we can recursively apply this QMF band-splitting operation to the lowpass band:

lo2 = corrDn(lo1,flo,'reflect1',[1 2]);
-hi2 = corrDn(lo1,fhi,'reflect1',[1 2],[1 2]);
-

The representation of the original signal is now comprised of the three subbands {hi1, hi2, lo2} (we don't hold onto lo1, because it can be reconstructed from lo2 and hi2). Note that hi1 is at 1/2 resolution, and hi2 and lo2 are at 1/4 resolution: The total number of samples in these three subbands is thus equal to the number of samples in the original signal.

imnames=['hi1'; 'hi2'; 'lo2'];
-for bnum=1:3
-  band = eval(imnames(bnum,:));
-  subplot(3,1,bnum); showIm(band); ylabel(imnames(bnum,:));
-  axis([1 size(band,2) 1.1*min(lo2) 1.1*max(lo2)]);
-end
-

Reconstruction proceeds as with the Laplacian pyramid: combine lo2 and hi2 to reconstruct lo1, which is then combined with hi1 to reconstruct the original signal:

-
recon_lo1 = upConv(hi2,fhi,'reflect1',[1 2],[1 2]) + ...
-            upConv(lo2,flo,'reflect1',[1 2],[1 1]);
-reconstructed = upConv(hi1,fhi,'reflect1',[1 2],[1 2]) + ...
-                upConv(recon_lo1,flo,'reflect1',[1 2],[1 1]);
-imStats(sig,reconstructed);
-
-
-
Difference statistics:
-  Range: [-2.857375e-03, 1.844433e-03]
-  Mean: -0.000097,  Stdev (rmse): 0.001304,  SNR (dB): 57.694286
-
- -

FUNCTIONS for CONSTRUCTING/MANIPULATING QMF/Wavelet PYRAMIDS

-To make things easier, we have bundled these qmf operations and data structures into an object in MATLAB.

-
sig = mkFract([1 64], 1.5);
-[pyr,pind] = buildWpyr(sig);
-showWpyr(pyr,pind);
-
- -
-nbands = size(pind,1);
-for b = 1:nbands
-  subplot(nbands,1,b); lplot(pyrBand(pyr,pind,b));
-end
-
-res = reconWpyr(pyr,pind);
-imStats(sig,res);
-
Difference statistics:
-  Range: [-4.206845e-03, 3.766628e-03]
-  Mean: -0.000445,  Stdev (rmse): 0.001764,  SNR (dB): 55.072026
-

Now for 2D, we use separable filters. There are 4 ways to apply the two filters to the input image (followed by the relavent subsampling operation):
-(1) lowpass in both x and y
-(2) lowpass in x and highpass in y
-(3) lowpass in y and highpass in x
-(4) highpass in both x and y.
-The pyramid is built by recursively subdividing the first of these bands into four new subbands.
-First, we'll take a look at some of the basis functions.

sz = 40;
-zim = zeros(sz);
-flo = 'qmf9'; edges = 'reflect1';
-[pyr,pind] = buildWpyr(zim);
-
-% Put an  impulse into the middle of each band:
-for lev=1:size(pind,1)
-  mid = sum(prod(pind(1:lev-1,:)'));
-  mid = mid + floor(pind(lev,2)/2)*pind(lev,1) + floor(pind(lev,1)/2) + 1;
-  pyr(mid,1) = 1;
-end
-
-% And take a look at the reconstruction of each band:
-for lnum=1:wpyrHt(pind)+1
-  for bnum=1:3
-    subplot(wpyrHt(pind)+1,3,(wpyrHt(pind)+1-lnum)*3+bnum);
-    showIm(reconWpyr(pyr, pind, flo, edges, lnum, bnum),'auto1',2,0);
-  end
-end
-

Note that the first column contains horizontally oriented basis functions at different scales. The second contains vertically oriented basis functions. -The third contains both diagonals (a checkerboard pattern). The bottom row shows (3 identical images of) a lowpass basis function. Now look at the corresponding Fourier transform magnitudes (these are plotted over the frequency range [-pi, pi] ):

nextFig(2,1);
-freq = 2 * pi * [-sz/2:(sz/2-1)]/sz;
-for lnum=1:wpyrHt(pind)+1
-  for bnum=1:3
-    subplot(wpyrHt(pind)+1,3,(wpyrHt(pind)+1-lnum)*3+bnum);
-    basisFn = reconWpyr(pyr, pind, flo, edges, lnum, bnum);
-    basisFmag = fftshift(abs(fft2(basisFn,sz,sz)));
-    imagesc(freq,freq,basisFmag);
-    axis('square'); axis('xy'); colormap('gray');
-  end
-end
-nextFig(2,-1);
-

The filters at a given scale sum to a squarish annular region:

sumSpectra = zeros(sz);
-lnum = 2;
-for bnum=1:3
-  basisFn = reconWpyr(pyr, pind, flo, edges, lnum, bnum);
-  basisFmag = fftshift(abs(fft2(basisFn,sz,sz)));
-  sumSpectra = basisFmag.^2 + sumSpectra;
-end
-clf; imagesc(freq,freq,sumSpectra); axis('square'); axis('xy'); title('one scale');
-

Now decompose an image:

-
[pyr,pind] = buildWpyr(im);
-

View all of the subbands (except lowpass), scaled to be the same size (requires a big figure window):

scrsz = get(0,'ScreenSize');
-figure('Position',[1 scrsz(4)/2 scrsz(3)/2 scrsz(4)/2])
-
-nlevs = wpyrHt(pind);
-for lnum=1:nlevs
-  for bnum=1:3
-    subplot(nlevs,3,(lnum-1)*3+bnum);
-    showIm(wpyrBand(pyr,pind,lnum,bnum), 'auto2', 2^(lnum+imSubSample-2));
-  end
-end
-

In addition to the bands shown above, there's a lowpass residual:

-
nextFig(2,1);
-clf; showIm(pyrLow(pyr,pind));
-nextFig(2,-1);
-
- -
-% Alternatively, display the pyramid with the subbands shown at their
-% correct relative sizes:
-clf; showWpyr(pyr, pind);
-
-
The reconWpyr function can be used to reconstruct the entire pyramid:

reconstructed = reconWpyr(pyr,pind);
-imStats(im,reconstructed);
-
Difference statistics:
-  Range: [-4.394200e-01, 3.481599e-01]
-  Mean: -0.144226,  Stdev (rmse): 0.071076,  SNR (dB): 53.924849
-

As with Laplacian pyramids, you can specify sub-levels and subbands to be included in the reconstruction. For example:

clf
-showIm(reconWpyr(pyr,pind,'qmf9','reflect1',[1:wpyrHt(pind)],[1]));  %Horizontal only
-
- -
-showIm(reconWpyr(pyr,pind,'qmf9','reflect1',[2,3])); %two middle scales
-
- -

PERFECT RECONSTRUCTION: HAAR AND DEBAUCHIES WAVELETS

-The symmetric QMF filters used above are not perfectly orthogonal. In fact, it's impossible to construct a symmetric filter of size greater than 2 that is perfectly orthogonal to shifted copies (shifted by multiples of 2) of itself. For example, consider a symmetric kernel of length 3. Shift by two and the right end of the original kernel is aligned with the left end of the shifted one. Thus, the inner product of these two will be the square of the end tap, which will be non-zero.
However, one can easily create wavelet filters of length 2 that will do the job. This is the oldest known wavelet, known as the "Haar". The two kernels are [1,1]/sqrt(2) and [1,-1]/sqrt(2). These are trivially seen to be orthogonal to each other, and shifts by multiples of two are also trivially orthogonal. The projection functions of the Haar transform are in the rows of the following matrix, constructed by applying the transform to impulse input signals, for all possible impulse locations:

haarLo = namedFilter('haar')
-haarHi = modulateFlip(haarLo)
-subplot(2,1,1); lplot(haarLo); axis([0 3 -1 1]); title('lowpass');
-subplot(2,1,2); lplot(haarHi); axis([0 3 -1 1]); title('highpass');
-
- -
-haarLo =
-
-    0.7071
-    0.7071
-
-
-haarHi =
-
-   -0.7071
-    0.7071
-
-
-
-
-M = [corrDn(eye(32), haarLo, 'reflect1', [2 1], [2 1]); ...
-    corrDn(eye(32), haarHi, 'reflect1', [2 1], [2 1])];
-clf; showIm(M)
-
-
-ans =
-
-   -0.7071    0.7071
-
-
-
- -
-showIm(M*M') %identity!
-
-ans =
-
-         0    1.0000
-
-
- -
As before, the filters are power-complementary (although the frequency isolation is rather poor, and thus the subbands will be heavily aliased):

-
plot(pi*[-32:31]/32,abs(fft(haarLo,64)).^2,'--',...
-     pi*[-32:31]/32,abs(fft(haarHi,64)).^2,'-');
-
- -
-sig = mkFract([1,64],0.5);
-[pyr,pind] = buildWpyr(sig,4,'haar','reflect1');
-showWpyr(pyr,pind);
-

check perfect reconstruction:

res = reconWpyr(pyr,pind, 'haar', 'reflect1');
-imStats(sig,res)
-
Difference statistics:
-  Range: [-2.775558e-16, 3.552714e-15]
-  Mean: 0.000000,  Stdev (rmse): 0.000000,  SNR (dB): 300.614315
-

If you want perfect reconstruction, but don't like the Haar transform, there's another option: drop the symmetry requirement. Ingrid Daubechies developed one of the earliest sets of such perfect-reconstruction wavelets. The simplest of these is of length 4:

daub_lo = namedFilter('daub2');
-daub_hi = modulateFlip(daub_lo);
-

The daub_lo filter is constructed to be orthogonal to 2shifted copy of itself. For example:

-
[daub_lo;0;0]'*[0;0;daub_lo]
-
-
-ans =
-
-   2.9092e-13
-
-
-
-
-M = [corrDn(eye(32), daub_lo, 'circular', [2 1], [2 1]); ...
-    corrDn(eye(32), daub_hi, 'circular', [2 1], [2 1])];
-clf; showIm(M)
-
-
-ans =
-
-   -0.4830    0.8365
-
-
-
- -
-showIm(M*M') % identity!
-
-ans =
-
-         0    1.0000
-
-
- -
Again, they're power complementary:

plot(pi*[-32:31]/32,abs(fft(daub_lo,64)).^2,'--',...
-     pi*[-32:31]/32,abs(fft(daub_hi,64)).^2,'-');
-

The sum of the power spectra is again flat

plot(pi*[-32:31]/32,...
-    fftshift(abs(fft(daub_lo,64)).^2)+fftshift(abs(fft(daub_hi,64)).^2));
-

Make a pyramid using the same code as before (except that we can't use reflected boundaries with asymmetric filters):

[pyr,pind] = buildWpyr(sig, maxPyrHt(size(sig),size(daub_lo)), daub_lo, 'circular');
-showWpyr(pyr,pind,'indep1');
-
-res = reconWpyr(pyr,pind, daub_lo,'circular');
-imStats(sig,res);
-
-
-
Difference statistics:
-  Range: [-1.573097e-11, -2.440159e-12]
-  Mean: -0.000000,  Stdev (rmse): 0.000000,  SNR (dB): 228.416414
-
-

ALIASING IN WAVELET TRANSFORMS

-All of these orthonormal pyramid/wavelet transforms have a lot of aliasing in the subbands. You can see that in the frequency response plots since the frequency response of each filter covers well more than half the frequency domain. The aliasing can have serious consequences...
-Get one of the basis functions of the 2D Daubechies wavelet transform:

[pyr,pind] = buildWpyr(zeros(1,64),4,daub_lo,'circular');
-lev = 3;
-pyr(1+sum(pind(1:lev-1,2))+pind(lev,2)/2,1) = 1;
-sig = reconWpyr(pyr,pind, daub_lo,'circular');
-clf; lplot(sig)
-

Since the basis functions are orthonormal, building a pyramid using this input will yield a single non-zero coefficient.

[pyr,pind] = buildWpyr(sig, 4, daub_lo, 'circular');
-figure(1);
-nbands = size(pind,1)
-for b=1:nbands
-  subplot(nbands,1,b); lplot(pyrBand(pyr,pind,b));
-  axis([1 size(pyrBand(pyr,pind,b),2) -0.3 1.3]);
-end
-
-nbands =
-
-     5
-
-

Now shift the input by one sample and re-build the pyramid.

shifted_sig = [0,sig(1:size(sig,2)-1)];
-[spyr,spind] = buildWpyr(shifted_sig, 4, daub_lo, 'circular');
-

Plot each band of the unshifted and shifted decomposition

nextFig(2);
-nbands = size(spind,1)
-for b=1:nbands
-  subplot(nbands,1,b); lplot(pyrBand(spyr,spind,b));
-  axis([1 size(pyrBand(spyr,spind,b),2) -0.3 1.3]);
-end
-nextFig(2,-1);
-
-nbands =
-
-     5
-
-
-
In the third band, we expected the coefficients to move around because the signal was shifted. But notice that in the original signal decomposition, the other bands were filled with zeros. After the shift, they have significant content. Although these subbands are supposed to represent information at different scales, their content also depends on the relative POSITION of the input signal.
This problem is not unique to the Daubechies transform. The same is true for the QMF transform. Try it... In fact, the same kind of problem occurs for almost any orthogonal pyramid transform (the only exception is the limiting case in which the filter is a sinc function).
Orthogonal pyramid transforms are not shift-invariant. Although orthogonality may be an important property for some applications (e.g., data compression), orthogonal pyramid transforms are generally not so good for image analysis.
The overcompleteness of the Laplacian pyramid turns out to be a good thing in the end. By using an overcomplete representation (and by choosing the filters properly to avoid aliasing as much as possible), you end up with a representation that is useful for image analysis.

-

The "STEERABLE PYRAMID"

-The steerable pyramid is a multi-scale representation that istranslation-invariant, but that also includes representation of orientation. Furthermore, the representation of orientation is designed to be rotation-invariant. The basis/projection functions are oriented (steerable) filters, localized in space and frequency. It is overcomplete to avoid aliasing. And it is "self-inverting" (like the QMF/Wavelet transform): the projection functions and basis functions are identical. The mathematical phrase for a transform obeying this property is "tight frame".
-The system diagram for the steerable pyramid (described in the reference given below) is as follows:
-
IM ---> fhi0 -----------------> H0 ---------------- fhi0 ---> RESULT
-     |                                                     |
-     |                                                     |
-     |-> flo0 ---> fl1/down2 --> L1 --> up2/fl1 ---> flo0 -|
-               |                                 |
-               |----> fb0 -----> B0 ----> fb0 ---|
-               |                                 |
-               |----> fb1 -----> B1 ----> fb1 ---|
-               .                                 .
-               .                                 .
-               |----> fbK -----> BK ----> fbK ---|
-
The filters {fhi0,flo0} are used to initially split the image into a highpass residual band H0 and a lowpass subband. This lowpass band is then split into a low(er)pass band L1 and K+1 oriented subbands {B0,B1,...,BK}. The representatation is substantially overcomplete. The pyramid is built by recursively splitting the lowpass band (L1) using the inner portion of the diagram (i.e., using the filters {fl1,fb0,fb1,...,fbK}). The resulting transform is overcomplete by a factor of 4k/3.
-The scale tuning of the filters is constrained by the recursive system diagram. The orientation tuning is constrained by requiring the property of steerability. A set of filters form a steerable basis if they 1) are rotated copies of each other, and 2) a copy of the filter at any orientation may be computed as a linear combination of the basis filters. The simplest examples of steerable filters is a set of N+1 Nth-order directional derivatives.
-Choose a filter set (options are 'sp0Filters', 'sp1Filters', 'sp3Filters', 'sp5Filters'):

filts = 'sp3Filters';
-[lo0filt,hi0filt,lofilt,bfilts,steermtx,harmonics] = eval(filts);
-fsz = round(sqrt(size(bfilts,1))); fsz =  [fsz fsz];
-nfilts = size(bfilts,2);
-nrows = floor(sqrt(nfilts));
-

Look at the oriented bandpass filters:

figure
-for f = 1:nfilts
-  subplot(nrows,ceil(nfilts/nrows),f);
-  showIm(conv2(reshape(bfilts(:,f),fsz),lo0filt));
-end
-

Try "steering" to a new orientation (new_ori in degrees):

new_ori = 360*rand(1)
-clf; showIm(conv2(reshape(steer(bfilts, new_ori*pi/180 ), fsz), lo0filt));
-
-new_ori =
-
-  204.4158
-
-

Look at Fourier transform magnitudes:

lo0 = fftshift(abs(fft2(lo0filt,64,64)));
-fsum = zeros(size(lo0));
-figure
-for f = 1:size(bfilts,2)
-  subplot(nrows,ceil(nfilts/nrows),f);
-  flt = reshape(bfilts(:,f),fsz);
-  freq = lo0 .* fftshift(abs(fft2(flt,64,64)));
-  fsum = fsum + freq.^2;
-  showIm(freq);
-end
-

The filters sum to a smooth annular ring:

clf; showIm(fsum);
-

build a Steerable pyramid:

[pyr,pind] = buildSpyr(im, 4-imSubSample, filts);
-

Look at first (vertical) bands, different scales:

for s = 1:min(4,spyrHt(pind))
-  band = spyrBand(pyr,pind,s,1);
-  subplot(2,2,s); showIm(band);
-end
-

look at all orientation bands at one level (scale):

for b = 1:spyrNumBands(pind)
-  band = spyrBand(pyr,pind,1,b);
-  subplot(nrows,ceil(nfilts/nrows),b);
-  showIm(band);
-end
-

-
To access the high-pass and low-pass bands:

-
low = pyrLow(pyr,pind);
-showIm(low);
-
-
-
-high = spyrHigh(pyr,pind);
-showIm(high);
-
- -
Display the whole pyramid (except for the highpass residual band), with images shown at proper relative sizes:

showSpyr(pyr,pind);
-

Spin a level of the pyramid, interpolating (steering to) intermediate orienations:

-
[lev,lind] = spyrLev(pyr,pind,2);
-lev2 = reshape(lev,prod(lind(1,:)),size(bfilts,2));
-figure(1); subplot(1,1,1); showIm(spyrBand(pyr,pind,2,1));
-M = moviein(16);
-for frame = 1:16
-  steered_im = steer(lev2, 2*pi*(frame-1)/16, harmonics, steermtx);
-  showIm(reshape(steered_im, lind(1,:)),'auto2');
-  M(:,frame) = getframe;
-end
-
- -
Reconstruct. Note that the filters are not perfect, although they are good enough for most applications.

res = reconSpyr(pyr, pind, filts);
-showIm(im + i * res);
-imStats(im,res);
-
-
-Difference statistics:
-  Range: [-8.829810e+01, 1.084642e+02]
-  Mean: -0.611088,  Stdev (rmse): 13.451002,  SNR (dB): 8.384218
-
- -
As with previous pyramids, you can select subsets of the levels and orientation bands to be included in the reconstruction.
For example: All levels (including highpass and lowpass residuals), one orientation:

-
clf; showIm(reconSpyr(pyr,pind,filts,'reflect1','all', [1]));
-
- -
Without the highpass and lowpass:

-
clf; showIm(reconSpyr(pyr,pind,filts,'reflect1',[1:spyrHt(pind)], [1]));
-
- -
We also provide an implementation of the Steerable pyramid in the Frequency domain. The advantages are perfect-reconstruction (within floating-point error), and any number of orientation bands. The disadvantages are that it is typically slower, and the boundary handling is always circular.

[pyr,pind] = buildSFpyr(im,4,4); % 4 levels, 5 orientation bands
-showSpyr(pyr,pind);
-res = reconSFpyr(pyr,pind);
-imStats(im,res);  % nearly perfect
-
-
-Difference statistics:
-  Range: [-9.705222e-04, 1.297531e-03]
-  Mean: -0.000000,  Stdev (rmse): 0.000256,  SNR (dB): 102.810403
-
-
-

-The steerable pyramid transform given above is described in:
-E P Simoncelli and W T Freeman.
-The Steerable Pyramid: A Flexible Architecture for Multi-Scale -Derivative Computation.
-IEEE Second Int'l Conf on Image Processing. -Washington DC, October 1995.
-Online access:
-Abstract
-Full (PDF)
- - -
- - - diff --git a/evaluation/utils/matlabPyrTools/TUTORIALS/pyramids.m b/evaluation/utils/matlabPyrTools/TUTORIALS/pyramids.m deleted file mode 100755 index 2123c69..0000000 --- a/evaluation/utils/matlabPyrTools/TUTORIALS/pyramids.m +++ /dev/null @@ -1,903 +0,0 @@ -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%% IMAGE PYRAMID TUTORIAL -%%% -%%% A brief introduction to multi-scale pyramid decompositions for image -%%% processing. You should go through this, reading the comments, and -%%% executing the corresponding MatLab instructions. This file assumes -%%% a basic familiarity with matrix algebra, with linear systems and Fourier -%%% theory, and with MatLab. If you don't understand a particular -%%% function call, execute "help " to see documentation. -%%% -%%% EPS, 6/96. -%%% Based on the original OBVIUS tutorial. -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%% Determine a subsampling factor for images, based on machine speed: -oim = pgmRead('einstein.pgm'); -tic; corrDn(oim,[1 1; 1 1]/4,'reflect1',[2 2]); time = toc; -imSubSample = min(max(floor(log2(time)/2+3),0),2); -im = blurDn(oim, imSubSample,'qmf9'); -clear oim; -clf; showIm(im, 'auto2', 'auto', 'im'); - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%% LAPLACIAN PYRAMIDS: - -%% Images may be decomposed into information at different scales. -%% Blurring eliminates the fine scales (detail): - -binom5 = binomialFilter(5); -lo_filt = binom5*binom5'; -blurred = rconv2(im,lo_filt); -subplot(1,2,1); showIm(im, 'auto2', 'auto', 'im'); -subplot(1,2,2); showIm(blurred, 'auto2', 'auto', 'blurred'); - -%% Subtracting the blurred image from the original leaves ONLY the -%% fine scale detail: -fine0 = im - blurred; -subplot(1,2,1); showIm(fine0, 'auto2', 'auto', 'fine0'); - -%% The blurred and fine images contain all the information found in -%% the original image. Trivially, adding the blurred image to the -%% fine scale detail will reconstruct the original. We can compare -%% the original image to the sum of blurred and fine using the -%% "imStats" function, which reports on the statistics of the -%% difference between it's arguments: -imStats(im, blurred+fine0); - -%% Since the filter is a lowpass filter, we might want to subsample -%% the blurred image. This may cause some aliasing (depends on the -%% filter), but the decomposition structure given above will still be -%% possible. The corrDn function correlates (same as convolution, but -%% flipped filter) and downsamples in a single operation (for -%% efficiency). The string 'reflect1' tells the function to handle -%% boundaries by reflecting the image about the edge pixels. Notice -%% that the blurred1 image is half the size (in each dimension) of the -%% original image. -lo_filt = 2*binom5*binom5'; %construct a separable 2D filter -blurred1 = corrDn(im,lo_filt,'reflect1',[2 2]); -subplot(1,2,2); showIm(blurred1,'auto2','auto','blurred1'); - -%% Now, to extract fine scale detail, we must interpolate the image -%% back up to full size before subtracting it from the original. The -%% upConv function does upsampling (padding with zeros between -%% samples) followed by convolution. This can be done using the -%% lowpass filter that was applied before subsampling or it can be -%% done with a different filter. -fine1 = im - upConv(blurred1,lo_filt,'reflect1',[2 2],[1 1],size(im)); -subplot(1,2,1); showIm(fine1,'auto2','auto','fine1'); - -%% We now have a technique that takes an image, computes two new -%% images (blurred1 and fine1) containing the coarse scale information -%% and the fine scale information. We can also (trivially) -%% reconstruct the original from these two (even if the subsampling of -%% the blurred1 image caused aliasing): - -recon = fine1 + upConv(blurred1,lo_filt,'reflect1',[2 2],[1 1],size(im)); -imStats(im, recon); - -%% Thus, we have described an INVERTIBLE linear transform that maps an -%% input image to the two images blurred1 and fine1. The inverse -%% transformation maps blurred1 and fine1 to the result. This is -%% depicted graphically with a system diagram: -%% -%% IM --> blur/down2 ---------> BLURRED1 --> up2/blur --> add --> RECON -%% | | ^ -%% | | | -%% | V | -%% | up2/blur | -%% | | | -%% | | | -%% | V | -%% --------------> subtract --> FINE1 ------------------- -%% -%% Note that the number of samples in the representation (i.e., total -%% samples in BLURRED1 and FINE1) is 1.5 times the number of samples -%% in the original IM. Thus, this representation is OVERCOMPLETE. - -%% Often, we will want further subdivisions of scale. We can -%% decompose the (coarse-scale) BLURRED1 image into medium coarse and -%% very coarse images by applying the same splitting technique: -blurred2 = corrDn(blurred1,lo_filt,'reflect1',[2 2]); -showIm(blurred2) - -fine2 = blurred1 - upConv(blurred2,lo_filt,'reflect1',[2 2],[1 1],size(blurred1)); -showIm(fine2) - -%% Since blurred2 and fine2 can be used to reconstruct blurred1, and -%% blurred1 and fine1 can be used to reconstruct the original image, -%% the set of THREE images (also known as "subbands") {blurred2, -%% fine2, fine1} constitute a complete representation of the original -%% image. Note that the three subbands are displayed at the same size, -%% but they are actually three different sizes. - -subplot(1,3,1); showIm(fine1,'auto2',2^(imSubSample-1),'fine1'); -subplot(1,3,2); showIm(fine2,'auto2',2^(imSubSample),'fine2'); -subplot(1,3,3); showIm(blurred2,'auto2',2^(imSubSample+1),'blurred2'); - -%% It is useful to consider exactly what information is stored in each -%% of the pyramid subbands. The reconstruction process involves -%% recursively interpolating these images and then adding them to the -%% image at the next finer scale. To see the contribution of ONE of -%% the representation images (say blurred2) to the reconstruction, we -%% imagine filling all the other subbands with zeros and then -%% following our reconstruction procedure. For the blurred2 subband, -%% this is equivalent to simply calling upConv twice: -blurred2_full = upConv(upConv(blurred2,lo_filt,'reflect1',[2 2],[1 1],size(blurred1)),... - lo_filt,'reflect1',[2 2],[1 1],size(im)); -subplot(1,3,3); showIm(blurred2_full,'auto2',2^(imSubSample-1),'blurred2-full'); - -%% For the fine2 subband, this is equivalent to calling upConv once: -fine2_full = upConv(fine2,lo_filt,'reflect1',[2 2],[1 1],size(im)); -subplot(1,3,2); showIm(fine2_full,'auto2',2^(imSubSample-1),'fine2-full'); - -%% If we did everything correctly, we should be able to add together -%% these three full-size images to reconstruct the original image: -recon = blurred2_full + fine2_full + fine1; -imStats(im, recon) - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%% FUNCTIONS for CONSTRUCTING/MANIPULATING LAPLACIAN PYRAMIDS - -%% We can continue this process, recursively splitting off finer and -%% finer details from the blurred image (like peeling off the outer -%% layers of an onion). The resulting data structure is known as a -%% "Laplacian Pyramid". To make things easier, we have written a -%% MatLab function called buildLpyr to construct this object. The -%% function returns two items: a long vector containing the subbands -%% of the pyramid, and an index matrix that is used to access these -%% subbands. The display routine showLpyr shows all the subbands of the -%% pyramid, at the their correct relative sizes. It should now be -%% clearer why these data structures are called "pyramids". -[pyr,pind] = buildLpyr(im,5-imSubSample); -showLpyr(pyr,pind); - -%% There are also "accessor" functions for pulling out a single subband: -showIm(pyrBand(pyr,pind,2)); - -%% The reconLpyr function allows you to reconstruct from a laplacian pyramid. -%% The third (optional) arg allows you to select any subset of pyramid bands -%% (default is to use ALL of them). -clf; showIm(reconLpyr(pyr,pind,[1 3]),'auto2','auto','bands 1 and 3 only'); - -fullres = reconLpyr(pyr,pind); -showIm(fullres,'auto2','auto','Full reconstruction'); -imStats(im,fullres); - -%% buildLpyr uses 5-tap filters by default for building Laplacian -%% pyramids. You can specify other filters: -namedFilter('binom3') -[pyr3,pind3] = buildLpyr(im,5-imSubSample,'binom3'); -showLpyr(pyr3,pind3); -fullres3 = reconLpyr(pyr3,pind3,'all','binom3'); -imStats(im,fullres3); - -%% Here we build a "Laplacian" pyramid using random filters. filt1 is -%% used with the downsampling operations and filt2 is used with the -%% upsampling operations. We normalize the filters for display -%% purposes. Of course, these filters are (almost certainly) not very -%% "Gaussian", and the subbands of such a pyramid will be garbage! -%% Nevertheless, it is a simple property of the Laplacian pyramid that -%% we can use ANY filters and we will still be able to reconstruct -%% perfectly. - -filt1 = rand(1,5); filt1 = sqrt(2)*filt1/sum(filt1) -filt2 = rand(1,3); filt2 = sqrt(2)*filt2/sum(filt2) -[pyrr,pindr] = buildLpyr(im,5-imSubSample,filt1,filt2); -showLpyr(pyrr,pindr); -fullresr = reconLpyr(pyrr,pindr,'all',filt2); -imStats(im,fullresr); - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%% ALIASING in the Gaussian and Laplacian pyramids: - -%% Unless one is careful, the subsampling operations will introduce aliasing -%% artifacts in these pyramid transforms. This is true even though the -%% Laplacian pyramid can be used to reconstruct the original image perfectly. -%% When reconstructing, the pyramid is designed in such a way that these -%% aliasing artifacts cancel out. So it's not a problem if the only thing we -%% want to do is reconstruct. However, it can be a serious problem if we -%% intend to process each of the subbands independently. - -%% One way to see the consequences of the aliasing artifacts is by -%% examining variations that occur when the input is shifted. We -%% choose an image and shift it by some number of pixels. Then blur -%% (filter-downsample-upsample-filter) the original image and blur the -%% shifted image. If there's no aliasing, then the blur and shift -%% operations should commute (i.e., -%% shift-filter-downsample-upsample-filter is the same as -%% filter-downsample-upsample-filter-shift). Try this for 2 different -%% filters (by replacing 'binom3' with 'binom5' or 'binom7' below), -%% and you'll see that the aliasing is much worse for the 3 tap -%% filter. - -sig = 100*randn([1 16]); -sh = [0 7]; %shift amount -lev = 2; % level of pyramid to look at -flt = 'binom3'; %filter to use: - -shiftIm = shift(sig,sh); -[pyr,pind] = buildLpyr(shiftIm, lev, flt, flt, 'circular'); -shiftBlur = reconLpyr(pyr, pind, lev, flt, 'circular'); - -[pyr,pind] = buildLpyr(sig, lev, flt, flt, 'circular'); -res = reconLpyr(pyr, pind, lev, flt, 'circular'); -blurShift = shift(res,sh); - -subplot(2,1,1); r = showIm(shiftBlur,'auto2','auto','shiftBlur'); -subplot(2,1,2); showIm(blurShift,r,'auto','blurShift'); -imStats(blurShift,shiftBlur); - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%% PROJECTION and BASIS functions: - -%% An invertible, linear transform can be characterized in terms -%% of a set of PROJECTION and BASIS functions. In matlab matrix -%% notation: -% -%% c = P' * x -%% x = B * c -% -%% where x is an input, c are the transform coefficients, P and B -%% are matrices. The columns of P are the projection functions (the -%% input is projected onto the the columns of P to get each successive -%% transform coefficient). The columns of B are the basis -%% functions (x is a linear combination of the columns of B). - -%% Since the Laplacian pyramid is a linear transform, we can ask: what -%% are its BASIS functions? We consider these in one dimension for -%% simplicity. The BASIS function corresponding to a given -%% coefficient tells us how much that coefficient contributes to each -%% pixel in the reconstructed image. We can construct a single basis -%% function by setting one sample of one subband equal to 1.0 (and all -%% others to zero) and reconstructing. To build the entire matrix, we -%% have to do this for every sample of every subband: -sz = min(round(48/(sqrt(2)^imSubSample)),36); -sig = zeros(sz,1); -[pyr,pind] = buildLpyr(sig); -basis = zeros(sz,size(pyr,1)); -for n=1:size(pyr,1) - pyr = zeros(size(pyr)); - pyr(n) = 1; - basis(:,n) = reconLpyr(pyr,pind); -end -clf; showIm(basis) - -%% The columns of the basis matrix are the basis functions. The -%% matrix is short and fat, corresponding to the fact that the -%% representation is OVERCOMPLETE. Below, we plot the middle one from -%% each subband, starting with the finest scale. Note that all of -%% these basis functions are lowpass (Gaussian-like) functions. -locations = round(sz * (2 - 3./2.^[1:max(4,size(pind,1))]))+1; -for lev=1:size(locations,2) - subplot(2,2,lev); - showIm(basis(:,locations(lev))); - axis([0 sz 0 1.1]); -end - -%% Now, we'd also like see the inverse (we'll them PROJECTION) -%% functions. We need to ask how much of each sample of the input -%% image contributes to a given pyramid coefficient. Thus, the matrix -%% is constructed by building pyramids on the set of images with -%% impulses at each possible location. The rows of this matrix are -%% the projection functions. -projection = zeros(size(pyr,1),sz); -for pos=1:sz - [pyr,pind] = buildLpyr(mkImpulse([1 sz], [1 pos])); - projection(:,pos) = pyr; -end -clf; showIm(projection); - -%% Building a pyramid corresponds to multiplication by the projection -%% matrix. Reconstructing from this pyramid corresponds to -%% multiplication by the basis matrix. Thus, the product of the two -%% matrices (in this order) should be the identity matrix: -showIm(basis*projection); - -%% We can plot a few example projection functions at different scales. -%% Note that all of the projection functions are bandpass functions, -%% except for the coarsest subband which is lowpass. -for lev=1:size(locations,2) - subplot(2,2,lev); - showIm(projection(locations(lev),:)); - axis([0 sz -0.3 0.8]); -end - -%% Now consider the frequency response of these functions, plotted over the -%% range [-pi,pi]: -for lev=1:size(locations,2) - subplot(2,2,lev); - proj = projection(locations(lev),:); - plot(pi*[-32:31]/32,fftshift(abs(fft(proj',64)))); - axis([-pi pi -0.1 3]); -end - -%% The first projection function is highpass, and the second is bandpass. Both -%% of these look something like the Laplacian (2nd derivative) of a Gaussian. -%% The last is lowpass, as are the basis functions. Thus, the basic operation -%% used to create each level of the pyramid involves a simple highpass/lowpass -%% split. - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%% QMF/WAVELET PYRAMIDS. - -%% Two things about Laplacian pyramids are a bit unsatisfactory. -%% First, there are more pixels (coefficients) in the representation -%% than in the original image. Specifically, the 1-dimensional -%% transform is overcomplete by a factor of 4/3, and the 2-dimensional -%% transform is overcomplete by a factor of 2. Secondly, the -%% "bandpass" images (fineN) do not segregate information according to -%% orientation. - -%% There are other varieties of pyramid. One type that arose in the -%% speech coding community is based on a particular pairs of filters -%% known as a "Quadrature Mirror Filters" or QMFs. These are closely -%% related to Wavelets (essentially, they are approximate wavelet -%% filters). - -%% Recall that the Laplacian pyramid is formed by simple hi/low -%% splitting at each level. The lowpass band is subsampled by a -%% factor of 2, but the highpass band is NOT subsampled. In the QMF -%% pyramid, we apply two filters (hi- and lo- pass) and subsample BOTH -%% by a factor of 2, thus eliminating the excess coefficients of the -%% Laplacian pyramid. - -%% The two filters must have a specific relationship to each -%% other. In particular, let n be an index for the filter samples. -%% The highpass filter may be constructed from the lowpass filter by -%% (1) modulating (multiplying) by (-1)^n (equivalent to shifting by -%% pi in the Fourier domain), (2) flipping (i.e., reversing the order -%% of the taps), (3) spatially shifting by one sample. Try to -%% convince yourself that the resulting filters will always be -%% orthogonal to each other (i.e., their inner products will be zero) -%% when shifted by any multiple of two. - -%% The function modulateFlip performs the first two of these operations. The -%% third (spatial shifting) step is built into the convolution code. -flo = namedFilter('qmf9')'; -fhi = modulateFlip(flo)'; -subplot(2,1,1); lplot(flo); axis([0 10 -0.5 1.0]); title('lowpass'); -subplot(2,1,2); lplot(fhi); axis([0 10 -0.5 1.0]); title('highpass'); - -%% In the Fourier domain, these filters are (approximately) -%% "power-complementary": the sum of their squared power spectra is -%% (approximately) a constant. But note that neither is a perfect -%% bandlimiter (i.e., a sinc function), and thus subsampling by a -%% factor of 2 will cause aliasing in each of the subbands. See below -%% for a discussion of the effect of this aliasing. - -%% Plot the two frequency responses: -freq = pi*[-32:31]/32; -subplot(2,1,1); -plot(freq,fftshift(abs(fft(flo,64))),'--',freq,fftshift(abs(fft(fhi,64))),'-'); -axis([-pi pi 0 1.5]); title('FFT magnitudes'); -subplot(2,1,2); -plot(freq,fftshift(abs(fft(flo,64)).^2)+fftshift(abs(fft(fhi,64)).^2)); -axis([-pi pi 0 2.2]); title('Sum of squared magnitudes'); - -%% We can split an input signal into two bands as follows: -sig = mkFract([1,64],1.6); -subplot(2,1,1); showIm(sig,'auto1','auto','sig'); -lo1 = corrDn(sig,flo,'reflect1',[1 2],[1 1]); -hi1 = corrDn(sig,fhi,'reflect1',[1 2],[1 2]); -subplot(2,1,2); -showIm(lo1,'auto1','auto','low and high bands'); hold on; plot(hi1,'--r'); hold off; - -%% Notice that the two subbands are half the size of the original -%% image, due to the subsampling by a factor of 2. One subtle point: -%% the highpass and lowpass bands are subsampled on different -%% lattices: the lowpass band retains the odd-numbered samples and the -%% highpass band retains the even-numbered samples. This was the -%% 1-sample shift relating the high and lowpass kernels (mentioned -%% above). We've used the 'reflect1' to handle boundaries, which -%% works properly for symmetric odd-length QMFs. - -%% We can reconstruct the original image by interpolating these two subbands -%% USING THE SAME FILTERS: -reconlo = upConv(lo1,flo,'reflect1',[1 2]); -reconhi = upConv(hi1,fhi,'reflect1',[1 2],[1 2]); -subplot(2,1,2); showIm(reconlo+reconhi,'auto1','auto','reconstructed'); -imStats(sig,reconlo+reconhi); - -%% We have described an INVERTIBLE linear transform that maps an input -%% image to the two images lo1 and hi1. The inverse transformation -%% maps these two images to the result. This is depicted graphically -%% with a system diagram: -%% -%% IM ---> flo/down2 --> LO1 --> up2/flo --> add --> RECON -%% | ^ -%% | | -%% | | -%% -> fhi/down2 --> HI1 --> up2/fhi ----- -%% -%% Note that the number of samples in the representation (i.e., total -%% samples in LO1 and HI1) is equal to the number of samples in the -%% original IM. Thus, this representation is exactly COMPLETE, or -%% "critically sampled". - -%% So we've fixed one of the problems that we had with Laplacian -%% pyramid. But the system diagram above places strong constraints on -%% the filters. In particular, for these filters the reconstruction -%% is no longer perfect. Turns out there are NO -%% perfect-reconstruction symmetric filters that are -%% power-complementary, except for the trivial case [1] and the -%% nearly-trivial case [1 1]/sqrt(2). - -%% Let's consider the projection functions of this 2-band splitting -%% operation. We can construct these by applying the transform to -%% impulse input signals, for all possible impulse locations. The -%% rows of the following matrix are the projection functions for each -%% coefficient in the transform. -M = [corrDn(eye(32),flo','circular',[1 2]), ... - corrDn(eye(32),fhi','circular',[1 2],[1 2])]'; -clf; showIm(M,'auto1','auto','M'); - -%% The transform matrix is composed of two sub-matrices. The top half -%% contains the lowpass kernel, shifted by increments of 2 samples. -%% The bottom half contains the highpass. Now we compute the inverse -%% of this matrix: -M_inv = inv(M); -showIm(M_inv,'auto1','auto','M_inv'); - -%% The inverse is (very close to) the transpose of the original -%% matrix! In other words, the transform is orthonormal. -imStats(M_inv',M); - -%% This also points out a nice relationship between the corrDn and -%% upConv functions, and the matrix representation. corrDn is -%% equivalent to multiplication by a matrix with copies of the filter -%% on the ROWS, translated in multiples of the downsampling factor. -%% upConv is equivalent to multiplication by a matrix with copies of -%% the filter on the COLUMNS, translated by the upsampling factor. - -%% As in the Laplacian pyramid, we can recursively apply this QMF -%% band-splitting operation to the lowpass band: -lo2 = corrDn(lo1,flo,'reflect1',[1 2]); -hi2 = corrDn(lo1,fhi,'reflect1',[1 2],[1 2]); - -%% The representation of the original signal is now comprised of the -%% three subbands {hi1, hi2, lo2} (we don't hold onto lo1, because it -%% can be reconstructed from lo2 and hi2). Note that hi1 is at 1/2 -%% resolution, and hi2 and lo2 are at 1/4 resolution: The total number -%% of samples in these three subbands is thus equal to the number of -%% samples in the original signal. -imnames=['hi1'; 'hi2'; 'lo2']; -for bnum=1:3 - band = eval(imnames(bnum,:)); - subplot(3,1,bnum); showIm(band); ylabel(imnames(bnum,:)); - axis([1 size(band,2) 1.1*min(lo2) 1.1*max(lo2)]); -end - -%% Reconstruction proceeds as with the Laplacian pyramid: combine lo2 and hi2 -%% to reconstruct lo1, which is then combined with hi1 to reconstruct the -%% original signal: -recon_lo1 = upConv(hi2,fhi,'reflect1',[1 2],[1 2]) + ... - upConv(lo2,flo,'reflect1',[1 2],[1 1]); -reconstructed = upConv(hi1,fhi,'reflect1',[1 2],[1 2]) + ... - upConv(recon_lo1,flo,'reflect1',[1 2],[1 1]); -imStats(sig,reconstructed); - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%% FUNCTIONS for CONSTRUCTING/MANIPULATING QMF/Wavelet PYRAMIDS - -%% To make things easier, we have bundled these qmf operations and -%% data structures into an object in MATLAB. - -sig = mkFract([1 64], 1.5); -[pyr,pind] = buildWpyr(sig); -showWpyr(pyr,pind); - -nbands = size(pind,1); -for b = 1:nbands - subplot(nbands,1,b); lplot(pyrBand(pyr,pind,b)); -end - -res = reconWpyr(pyr,pind); -imStats(sig,res); - -%% Now for 2D, we use separable filters. There are 4 ways to apply the two -%% filters to the input image (followed by the relavent subsampling operation): -%% (1) lowpass in both x and y -%% (2) lowpass in x and highpass in y -%% (3) lowpass in y and highpass in x -%% (4) highpass in both x and y. -%% The pyramid is built by recursively subdividing the first of these bands -%% into four new subbands. - -%% First, we'll take a look at some of the basis functions. -sz = 40; -zim = zeros(sz); -flo = 'qmf9'; edges = 'reflect1'; -[pyr,pind] = buildWpyr(zim); - -% Put an impulse into the middle of each band: -for lev=1:size(pind,1) - mid = sum(prod(pind(1:lev-1,:)')); - mid = mid + floor(pind(lev,2)/2)*pind(lev,1) + floor(pind(lev,1)/2) + 1; - pyr(mid,1) = 1; -end - -% And take a look at the reconstruction of each band: -for lnum=1:wpyrHt(pind)+1 - for bnum=1:3 - subplot(wpyrHt(pind)+1,3,(wpyrHt(pind)+1-lnum)*3+bnum); - showIm(reconWpyr(pyr, pind, flo, edges, lnum, bnum),'auto1',2,0); - end -end - -%% Note that the first column contains horizontally oriented basis functions at -%% different scales. The second contains vertically oriented basis functions. -%% The third contains both diagonals (a checkerboard pattern). The bottom row -%% shows (3 identical images of) a lowpass basis function. - -%% Now look at the corresponding Fourier transform magnitudes (these -%% are plotted over the frequency range [-pi, pi] ): -nextFig(2,1); -freq = 2 * pi * [-sz/2:(sz/2-1)]/sz; -for lnum=1:wpyrHt(pind)+1 - for bnum=1:3 - subplot(wpyrHt(pind)+1,3,(wpyrHt(pind)+1-lnum)*3+bnum); - basisFn = reconWpyr(pyr, pind, flo, edges, lnum, bnum); - basisFmag = fftshift(abs(fft2(basisFn,sz,sz))); - imagesc(freq,freq,basisFmag); - axis('square'); axis('xy'); colormap('gray'); - end -end -nextFig(2,-1); - -%% The filters at a given scale sum to a squarish annular region: -sumSpectra = zeros(sz); -lnum = 2; -for bnum=1:3 - basisFn = reconWpyr(pyr, pind, flo, edges, lnum, bnum); - basisFmag = fftshift(abs(fft2(basisFn,sz,sz))); - sumSpectra = basisFmag.^2 + sumSpectra; -end -clf; imagesc(freq,freq,sumSpectra); axis('square'); axis('xy'); title('one scale'); - -%% Now decompose an image: -[pyr,pind] = buildWpyr(im); - -%% View all of the subbands (except lowpass), scaled to be the same size -%% (requires a big figure window): -nlevs = wpyrHt(pind); -for lnum=1:nlevs - for bnum=1:3 - subplot(nlevs,3,(lnum-1)*3+bnum); - showIm(wpyrBand(pyr,pind,lnum,bnum), 'auto2', 2^(lnum+imSubSample-2)); - end -end - -%% In addition to the bands shown above, there's a lowpass residual: -nextFig(2,1); -clf; showIm(pyrLow(pyr,pind)); -nextFig(2,-1); - -% Alternatively, display the pyramid with the subbands shown at their -% correct relative sizes: -clf; showWpyr(pyr, pind); - -%% The reconWpyr function can be used to reconstruct the entire pyramid: -reconstructed = reconWpyr(pyr,pind); -imStats(im,reconstructed); - -%% As with Laplacian pyramids, you can specify sub-levels and subbands -%% to be included in the reconstruction. For example: -clf -showIm(reconWpyr(pyr,pind,'qmf9','reflect1',[1:wpyrHt(pind)],[1])); %Horizontal only -showIm(reconWpyr(pyr,pind,'qmf9','reflect1',[2,3])); %two middle scales - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%% PERFECT RECONSTRUCTION: HAAR AND DEBAUCHIES WAVELETS - -%% The symmetric QMF filters used above are not perfectly orthogonal. -%% In fact, it's impossible to construct a symmetric filter of size -%% greater than 2 that is perfectly orthogonal to shifted copies -%% (shifted by multiples of 2) of itself. For example, consider a -%% symmetric kernel of length 3. Shift by two and the right end of -%% the original kernel is aligned with the left end of the shifted -%% one. Thus, the inner product of these two will be the square of -%% the end tap, which will be non-zero. - -%% However, one can easily create wavelet filters of length 2 that -%% will do the job. This is the oldest known wavelet, known as the -%% "Haar". The two kernels are [1,1]/sqrt(2) and [1,-1]/sqrt(2). -%% These are trivially seen to be orthogonal to each other, and shifts -%% by multiples of two are also trivially orthogonal. The projection -%% functions of the Haar transform are in the rows of the following -%% matrix, constructed by applying the transform to impulse input -%% signals, for all possible impulse locations: - -haarLo = namedFilter('haar') -haarHi = modulateFlip(haarLo) -subplot(2,1,1); lplot(haarLo); axis([0 3 -1 1]); title('lowpass'); -subplot(2,1,2); lplot(haarHi); axis([0 3 -1 1]); title('highpass'); - -M = [corrDn(eye(32), haarLo, 'reflect1', [2 1], [2 1]); ... - corrDn(eye(32), haarHi, 'reflect1', [2 1], [2 1])]; -clf; showIm(M) -showIm(M*M') %identity! - -%% As before, the filters are power-complementary (although the -%% frequency isolation is rather poor, and thus the subbands will be -%% heavily aliased): -plot(pi*[-32:31]/32,abs(fft(haarLo,64)).^2,'--',... - pi*[-32:31]/32,abs(fft(haarHi,64)).^2,'-'); - -sig = mkFract([1,64],0.5); -[pyr,pind] = buildWpyr(sig,4,'haar','reflect1'); -showWpyr(pyr,pind); - -%% check perfect reconstruction: -res = reconWpyr(pyr,pind, 'haar', 'reflect1'); -imStats(sig,res) - -%% If you want perfect reconstruction, but don't like the Haar -%% transform, there's another option: drop the symmetry requirement. -%% Ingrid Daubechies developed one of the earliest sets of such -%% perfect-reconstruction wavelets. The simplest of these is of -%% length 4: - -daub_lo = namedFilter('daub2'); -daub_hi = modulateFlip(daub_lo); - -%% The daub_lo filter is constructed to be orthogonal to 2shifted -%% copy of itself. For example: -[daub_lo;0;0]'*[0;0;daub_lo] - -M = [corrDn(eye(32), daub_lo, 'circular', [2 1], [2 1]); ... - corrDn(eye(32), daub_hi, 'circular', [2 1], [2 1])]; -clf; showIm(M) -showIm(M*M') % identity! - -%% Again, they're power complementary: -plot(pi*[-32:31]/32,abs(fft(daub_lo,64)).^2,'--',... - pi*[-32:31]/32,abs(fft(daub_hi,64)).^2,'-'); - -%% The sum of the power spectra is again flat -plot(pi*[-32:31]/32,... - fftshift(abs(fft(daub_lo,64)).^2)+fftshift(abs(fft(daub_hi,64)).^2)); - -%% Make a pyramid using the same code as before (except that we can't -%% use reflected boundaries with asymmetric filters): -[pyr,pind] = buildWpyr(sig, maxPyrHt(size(sig),size(daub_lo)), daub_lo, 'circular'); -showWpyr(pyr,pind,'indep1'); - -res = reconWpyr(pyr,pind, daub_lo,'circular'); -imStats(sig,res); - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%% ALIASING IN WAVELET TRANSFORMS - -%% All of these orthonormal pyramid/wavelet transforms have a lot -%% of aliasing in the subbands. You can see that in the frequency -%% response plots since the frequency response of each filter -%% covers well more than half the frequency domain. The aliasing -%% can have serious consequences... - -%% Get one of the basis functions of the 2D Daubechies wavelet transform: -[pyr,pind] = buildWpyr(zeros(1,64),4,daub_lo,'circular'); -lev = 3; -pyr(1+sum(pind(1:lev-1,2))+pind(lev,2)/2,1) = 1; -sig = reconWpyr(pyr,pind, daub_lo,'circular'); -clf; lplot(sig) - -%% Since the basis functions are orthonormal, building a pyramid using this -%% input will yield a single non-zero coefficient. -[pyr,pind] = buildWpyr(sig, 4, daub_lo, 'circular'); -figure(1); -nbands = size(pind,1) -for b=1:nbands - subplot(nbands,1,b); lplot(pyrBand(pyr,pind,b)); - axis([1 size(pyrBand(pyr,pind,b),2) -0.3 1.3]); -end - -%% Now shift the input by one sample and re-build the pyramid. -shifted_sig = [0,sig(1:size(sig,2)-1)]; -[spyr,spind] = buildWpyr(shifted_sig, 4, daub_lo, 'circular'); - -%% Plot each band of the unshifted and shifted decomposition -nextFig(2); -nbands = size(spind,1) -for b=1:nbands - subplot(nbands,1,b); lplot(pyrBand(spyr,spind,b)); - axis([1 size(pyrBand(spyr,spind,b),2) -0.3 1.3]); -end -nextFig(2,-1); - -%% In the third band, we expected the coefficients to move around -%% because the signal was shifted. But notice that in the original -%% signal decomposition, the other bands were filled with zeros. -%% After the shift, they have significant content. Although these -%% subbands are supposed to represent information at different scales, -%% their content also depends on the relative POSITION of the input -%% signal. - -%% This problem is not unique to the Daubechies transform. The same -%% is true for the QMF transform. Try it... In fact, the same kind -%% of problem occurs for almost any orthogonal pyramid transform (the -%% only exception is the limiting case in which the filter is a sinc -%% function). - -%% Orthogonal pyramid transforms are not shift-invariant. Although -%% orthogonality may be an important property for some applications -%% (e.g., data compression), orthogonal pyramid transforms are -%% generally not so good for image analysis. - -%% The overcompleteness of the Laplacian pyramid turns out to be a -%% good thing in the end. By using an overcomplete representation -%% (and by choosing the filters properly to avoid aliasing as much as -%% possible), you end up with a representation that is useful for -%% image analysis. - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%% The "STEERABLE PYRAMID" - -%% The steerable pyramid is a multi-scale representation that is -%% translation-invariant, but that also includes representation of -%% orientation. Furthermore, the representation of orientation is -%% designed to be rotation-invariant. The basis/projection functions -%% are oriented (steerable) filters, localized in space and frequency. -%% It is overcomplete to avoid aliasing. And it is "self-inverting" -%% (like the QMF/Wavelet transform): the projection functions and -%% basis functions are identical. The mathematical phrase for a -%% transform obeying this property is "tight frame". - -%% The system diagram for the steerable pyramid (described in the -%% reference given below) is as follows: -% -% IM ---> fhi0 -----------------> H0 ---------------- fhi0 ---> RESULT -% | | -% | | -% |-> flo0 ---> fl1/down2 --> L1 --> up2/fl1 ---> flo0 -| -% | | -% |----> fb0 -----> B0 ----> fb0 ---| -% | | -% |----> fb1 -----> B1 ----> fb1 ---| -% . . -% . . -% |----> fbK -----> BK ----> fbK ---| -% -%% The filters {fhi0,flo0} are used to initially split the image into -%% a highpass residual band H0 and a lowpass subband. This lowpass -%% band is then split into a low(er)pass band L1 and K+1 oriented -%% subbands {B0,B1,...,BK}. The representatation is substantially -%% overcomplete. The pyramid is built by recursively splitting the -%% lowpass band (L1) using the inner portion of the diagram (i.e., -%% using the filters {fl1,fb0,fb1,...,fbK}). The resulting transform is -%% overcomplete by a factor of 4k/3. - -%% The scale tuning of the filters is constrained by the recursive -%% system diagram. The orientation tuning is constrained by requiring -%% the property of steerability. A set of filters form a steerable -%% basis if they 1) are rotated copies of each other, and 2) a copy of -%% the filter at any orientation may be computed as a linear -%% combination of the basis filters. The simplest examples of -%% steerable filters is a set of N+1 Nth-order directional -%% derivatives. - -%% Choose a filter set (options are 'sp0Filters', 'sp1Filters', -%% 'sp3Filters', 'sp5Filters'): -filts = 'sp3Filters'; -[lo0filt,hi0filt,lofilt,bfilts,steermtx,harmonics] = eval(filts); -fsz = round(sqrt(size(bfilts,1))); fsz = [fsz fsz]; -nfilts = size(bfilts,2); -nrows = floor(sqrt(nfilts)); - -%% Look at the oriented bandpass filters: -for f = 1:nfilts - subplot(nrows,ceil(nfilts/nrows),f); - showIm(conv2(reshape(bfilts(:,f),fsz),lo0filt)); -end - -%% Try "steering" to a new orientation (new_ori in degrees): -new_ori = 360*rand(1) -clf; showIm(conv2(reshape(steer(bfilts, new_ori*pi/180 ), fsz), lo0filt)); - -%% Look at Fourier transform magnitudes: -lo0 = fftshift(abs(fft2(lo0filt,64,64))); -fsum = zeros(size(lo0)); -for f = 1:size(bfilts,2) - subplot(nrows,ceil(nfilts/nrows),f); - flt = reshape(bfilts(:,f),fsz); - freq = lo0 .* fftshift(abs(fft2(flt,64,64))); - fsum = fsum + freq.^2; - showIm(freq); -end - -%% The filters sum to a smooth annular ring: -clf; showIm(fsum); - -%% build a Steerable pyramid: -[pyr,pind] = buildSpyr(im, 4-imSubSample, filts); - -%% Look at first (vertical) bands, different scales: -for s = 1:min(4,spyrHt(pind)) - band = spyrBand(pyr,pind,s,1); - subplot(2,2,s); showIm(band); -end - -%% look at all orientation bands at one level (scale): -for b = 1:spyrNumBands(pind) - band = spyrBand(pyr,pind,1,b); - subplot(nrows,ceil(nfilts/nrows),b); - showIm(band); -end - -%% To access the high-pass and low-pass bands: -low = pyrLow(pyr,pind); -showIm(low); -high = spyrHigh(pyr,pind); -showIm(high); - -%% Display the whole pyramid (except for the highpass residual band), -%% with images shown at proper relative sizes: -showSpyr(pyr,pind); - -%% Spin a level of the pyramid, interpolating (steering to) -%% intermediate orienations: - -[lev,lind] = spyrLev(pyr,pind,2); -lev2 = reshape(lev,prod(lind(1,:)),size(bfilts,2)); -figure(1); subplot(1,1,1); showIm(spyrBand(pyr,pind,2,1)); -M = moviein(16); -for frame = 1:16 - steered_im = steer(lev2, 2*pi*(frame-1)/16, harmonics, steermtx); - showIm(reshape(steered_im, lind(1,:)),'auto2'); - M(:,frame) = getframe; -end - -%% Show the movie 3 times: -movie(M,3); - -%% Reconstruct. Note that the filters are not perfect, although they are good -%% enough for most applications. -res = reconSpyr(pyr, pind, filts); -showIm(im + i * res); -imStats(im,res); - -%% As with previous pyramids, you can select subsets of the levels -%% and orientation bands to be included in the reconstruction. For example: - -%% All levels (including highpass and lowpass residuals), one orientation: -clf; showIm(reconSpyr(pyr,pind,filts,'reflect1','all', [1])); - -%% Without the highpass and lowpass: -clf; showIm(reconSpyr(pyr,pind,filts,'reflect1',[1:spyrHt(pind)], [1])); - -%% We also provide an implementation of the Steerable pyramid in the -%% Frequency domain. The advantages are perfect-reconstruction -%% (within floating-point error), and any number of orientation -%% bands. The disadvantages are that it is typically slower, and the -%% boundary handling is always circular. - -[pyr,pind] = buildSFpyr(im,4,4); % 4 levels, 5 orientation bands -showSpyr(pyr,pind); -res = reconSFpyr(pyr,pind); -imStats(im,res); % nearly perfect - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% The steerable pyramid transform given above is described in: -% -% E P Simoncelli and W T Freeman. -% The Steerable Pyramid: A Flexible Architecture for Multi-Scale -% Derivative Computation. IEEE Second Int'l Conf on Image Processing. -% Washington DC, October 1995. -% -% Online access: -% Abstract: http://www.cis.upenn.edu/~eero/ABSTRACTS/simoncelli95b-abstract.html -% Full (PostScript): ftp://ftp.cis.upenn.edu/pub/eero/simoncelli95b.ps.Z -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%% Local Variables: -%% buffer-read-only: t -%% End: diff --git a/evaluation/utils/matlabPyrTools/binomialFilter.m b/evaluation/utils/matlabPyrTools/binomialFilter.m deleted file mode 100755 index e5670c7..0000000 --- a/evaluation/utils/matlabPyrTools/binomialFilter.m +++ /dev/null @@ -1,18 +0,0 @@ -% KERNEL = binomialFilter(size) -% -% Returns a vector of binomial coefficients of order (size-1) . - -% Eero Simoncelli, 2/97. - -function [kernel] = binomialFilter(sz) - -if (sz < 2) - error('size argument must be larger than 1'); -end - -kernel = [0.5 0.5]'; - -for n=1:sz-2 - kernel = conv([0.5 0.5]', kernel); -end - diff --git a/evaluation/utils/matlabPyrTools/blur.m b/evaluation/utils/matlabPyrTools/blur.m deleted file mode 100755 index fccb103..0000000 --- a/evaluation/utils/matlabPyrTools/blur.m +++ /dev/null @@ -1,67 +0,0 @@ -% RES = blur(IM, LEVELS, FILT) -% -% Blur an image, by filtering and downsampling LEVELS times -% (default=1), followed by upsampling and filtering LEVELS times. The -% blurring is done with filter kernel specified by FILT (default = -% 'binom5'), which can be a string (to be passed to namedFilter), a -% vector (applied separably as a 1D convolution kernel in X and Y), or -% a matrix (applied as a 2D convolution kernel). The downsampling is -% always by 2 in each direction. - -% Eero Simoncelli, 3/04. - -function res = blur(im, nlevs, filt) - -%------------------------------------------------------------ -%% OPTIONAL ARGS: - -if (exist('nlevs') ~= 1) - nlevs = 1; -end - -if (exist('filt') ~= 1) - filt = 'binom5'; -end - -%------------------------------------------------------------ - -if isstr(filt) - filt = namedFilter(filt); -end - -filt = filt/sum(filt(:)); - -if nlevs > 0 - if (any(size(im)==1)) - if (~any(size(filt)==1)) - error('Cant apply 2D filter to 1D signal'); - end - if (size(im,2)==1) - filt = filt(:); - else - filt = filt(:)'; - end - - in = corrDn(im,filt,'reflect1',(size(im)~=1)+1); - out = blur(in, nlevs-1, filt); - res = upConv(out, filt, 'reflect1', (size(im)~=1)+1, [1 1], size(im)); - - elseif (any(size(filt)==1)) - filt = filt(:); - - in = corrDn(im,filt,'reflect1',[2 1]); - in = corrDn(in,filt','reflect1',[1 2]); - out = blur(in, nlevs-1, filt); - res = upConv(out, filt', 'reflect1', [1 2], [1 1], [size(out,1),size(im,2)]); - res = upConv(res, filt, 'reflect1', [2 1], [1 1], size(im)); - - else - - in = corrDn(im,filt,'reflect1',[2 2]); - out = blur(in, nlevs-1, filt); - res = upConv(out, filt, 'reflect1', [2 2], [1 1], size(im)); - end -else - res = im; -end - diff --git a/evaluation/utils/matlabPyrTools/blurDn.m b/evaluation/utils/matlabPyrTools/blurDn.m deleted file mode 100755 index 8120c04..0000000 --- a/evaluation/utils/matlabPyrTools/blurDn.m +++ /dev/null @@ -1,59 +0,0 @@ -% RES = blurDn(IM, LEVELS, FILT) -% -% Blur and downsample an image. The blurring is done with filter -% kernel specified by FILT (default = 'binom5'), which can be a string -% (to be passed to namedFilter), a vector (applied separably as a 1D -% convolution kernel in X and Y), or a matrix (applied as a 2D -% convolution kernel). The downsampling is always by 2 in each -% direction. -% -% The procedure is applied recursively LEVELS times (default=1). - -% Eero Simoncelli, 3/97. - -function res = blurDn(im, nlevs, filt) - -%------------------------------------------------------------ -%% OPTIONAL ARGS: - -if (exist('nlevs') ~= 1) - nlevs = 1; -end - -if (exist('filt') ~= 1) - filt = 'binom5'; -end - -%------------------------------------------------------------ - -if isstr(filt) - filt = namedFilter(filt); -end - -filt = filt/sum(filt(:)); - -if nlevs > 1 - im = blurDn(im,nlevs-1,filt); -end - -if (nlevs >= 1) - if (any(size(im)==1)) - if (~any(size(filt)==1)) - error('Cant apply 2D filter to 1D signal'); - end - if (size(im,2)==1) - filt = filt(:); - else - filt = filt(:)'; - end - res = corrDn(im,filt,'reflect1',(size(im)~=1)+1); - elseif (any(size(filt)==1)) - filt = filt(:); - res = corrDn(im,filt,'reflect1',[2 1]); - res = corrDn(res,filt','reflect1',[1 2]); - else - res = corrDn(im,filt,'reflect1',[2 2]); - end -else - res = im; -end diff --git a/evaluation/utils/matlabPyrTools/buildGpyr.m b/evaluation/utils/matlabPyrTools/buildGpyr.m deleted file mode 100755 index 3f3d07b..0000000 --- a/evaluation/utils/matlabPyrTools/buildGpyr.m +++ /dev/null @@ -1,82 +0,0 @@ -% [PYR, INDICES] = buildGpyr(IM, HEIGHT, FILT, EDGES) -% -% Construct a Gaussian pyramid on matrix IM. -% -% HEIGHT (optional) specifies the number of pyramid levels to build. Default -% is 1+maxPyrHt(size(IM),size(FILT)). -% You can also specify 'auto' to use this value. -% -% FILT (optional) can be a string naming a standard filter (see -% namedFilter), or a vector which will be used for (separable) -% convolution. Default = 'binom5'. EDGES specifies edge-handling, and -% defaults to 'reflect1' (see corrDn). -% -% PYR is a vector containing the N pyramid subbands, ordered from fine -% to coarse. INDICES is an Nx2 matrix containing the sizes of -% each subband. This is compatible with the MatLab Wavelet toolbox. - -% Eero Simoncelli, 6/96. - -function [pyr,pind] = buildGpyr(im, ht, filt, edges) - -if (nargin < 1) - error('First argument (IM) is required'); -end - -im_sz = size(im); - -%------------------------------------------------------------ -%% OPTIONAL ARGS: - -if (exist('filt') ~= 1) - filt = 'binom5'; -end - -if isstr(filt) - filt = namedFilter(filt); -end - -if ( (size(filt,1) > 1) & (size(filt,2) > 1) ) - error('FILT should be a 1D filter (i.e., a vector)'); -else - filt = filt(:); -end - -max_ht = 1 + maxPyrHt(im_sz, size(filt,1)); -if ( (exist('ht') ~= 1) | (ht == 'auto') ) - ht = max_ht; -else - if (ht > max_ht) - error(sprintf('Cannot build pyramid higher than %d levels.',max_ht)); - end -end - -if (exist('edges') ~= 1) - edges= 'reflect1'; -end - -%------------------------------------------------------------ - -if (ht <= 1) - - pyr = im(:); - pind = im_sz; - -else - - if (im_sz(2) == 1) - lo2 = corrDn(im, filt, edges, [2 1], [1 1]); - elseif (im_sz(1) == 1) - lo2 = corrDn(im, filt', edges, [1 2], [1 1]); - else - lo = corrDn(im, filt', edges, [1 2], [1 1]); - lo2 = corrDn(lo, filt, edges, [2 1], [1 1]); - end - - [npyr,nind] = buildGpyr(lo2, ht-1, filt, edges); - - pyr = [im(:); npyr]; - pind = [im_sz; nind]; - -end - diff --git a/evaluation/utils/matlabPyrTools/buildLpyr.m b/evaluation/utils/matlabPyrTools/buildLpyr.m deleted file mode 100755 index facb0f3..0000000 --- a/evaluation/utils/matlabPyrTools/buildLpyr.m +++ /dev/null @@ -1,109 +0,0 @@ -% [PYR, INDICES] = buildLpyr(IM, HEIGHT, FILT1, FILT2, EDGES) -% -% Construct a Laplacian pyramid on matrix (or vector) IM. -% -% HEIGHT (optional) specifies the number of pyramid levels to build. Default -% is 1+maxPyrHt(size(IM),size(FILT)). You can also specify 'auto' to -% use this value. -% -% FILT1 (optional) can be a string naming a standard filter (see -% namedFilter), or a vector which will be used for (separable) -% convolution. Default = 'binom5'. FILT2 specifies the "expansion" -% filter (default = filt1). EDGES specifies edge-handling, and -% defaults to 'reflect1' (see corrDn). -% -% PYR is a vector containing the N pyramid subbands, ordered from fine -% to coarse. INDICES is an Nx2 matrix containing the sizes of -% each subband. This is compatible with the MatLab Wavelet toolbox. - -% Eero Simoncelli, 6/96. - -function [pyr,pind] = buildLpyr(im, ht, filt1, filt2, edges) - -if (nargin < 1) - error('First argument (IM) is required'); -end - -im_sz = size(im); - -%------------------------------------------------------------ -%% OPTIONAL ARGS: - -if (exist('filt1') ~= 1) - filt1 = 'binom5'; -end - -if isstr(filt1) - filt1 = namedFilter(filt1); -end - -if ( (size(filt1,1) > 1) & (size(filt1,2) > 1) ) - error('FILT1 should be a 1D filter (i.e., a vector)'); -else - filt1 = filt1(:); -end - -if (exist('filt2') ~= 1) - filt2 = filt1; -end - -if isstr(filt2) - filt2 = namedFilter(filt2); -end - -if ( (size(filt2,1) > 1) & (size(filt2,2) > 1) ) - error('FILT2 should be a 1D filter (i.e., a vector)'); -else - filt2 = filt2(:); -end - -max_ht = 1 + maxPyrHt(im_sz, max(size(filt1,1), size(filt2,1))); -if ( (exist('ht') ~= 1) | (ht == 'auto') ) - ht = max_ht; -else - if (ht > max_ht) - error(sprintf('Cannot build pyramid higher than %d levels.',max_ht)); - end -end - -if (exist('edges') ~= 1) - edges= 'reflect1'; -end - -%------------------------------------------------------------ - -if (ht <= 1) - - pyr = im(:); - pind = im_sz; - -else - - if (im_sz(2) == 1) - lo2 = corrDn(im, filt1, edges, [2 1], [1 1]); - elseif (im_sz(1) == 1) - lo2 = corrDn(im, filt1', edges, [1 2], [1 1]); - else - lo = corrDn(im, filt1', edges, [1 2], [1 1]); - int_sz = size(lo); - lo2 = corrDn(lo, filt1, edges, [2 1], [1 1]); - end - - [npyr,nind] = buildLpyr(lo2, ht-1, filt1, filt2, edges); - - if (im_sz(1) == 1) - hi2 = upConv(lo2, filt2', edges, [1 2], [1 1], im_sz); - elseif (im_sz(2) == 1) - hi2 = upConv(lo2, filt2, edges, [2 1], [1 1], im_sz); - else - hi = upConv(lo2, filt2, edges, [2 1], [1 1], int_sz); - hi2 = upConv(hi, filt2', edges, [1 2], [1 1], im_sz); - end - - hi2 = im - hi2; - - pyr = [hi2(:); npyr]; - pind = [im_sz; nind]; - -end - diff --git a/evaluation/utils/matlabPyrTools/buildSCFpyr.m b/evaluation/utils/matlabPyrTools/buildSCFpyr.m deleted file mode 100755 index 101b6d2..0000000 --- a/evaluation/utils/matlabPyrTools/buildSCFpyr.m +++ /dev/null @@ -1,90 +0,0 @@ -% [PYR, INDICES, STEERMTX, HARMONICS] = buildSCFpyr(IM, HEIGHT, ORDER, TWIDTH) -% -% This is a modified version of buildSFpyr, that constructs a -% complex-valued steerable pyramid using Hilbert-transform pairs -% of filters. Note that the imaginary parts will *not* be steerable. -% -% To reconstruct from this representation, either call reconSFpyr -% on the real part of the pyramid, *or* call reconSCFpyr which will -% use both real and imaginary parts (forcing analyticity). -% -% Description of this transform appears in: Portilla & Simoncelli, -% Int'l Journal of Computer Vision, 40(1):49-71, Oct 2000. -% Further information: http://www.cns.nyu.edu/~eero/STEERPYR/ - -% Original code: Eero Simoncelli, 5/97. -% Modified by Javier Portilla to return complex (quadrature pair) channels, -% 9/97. - -function [pyr,pind,steermtx,harmonics] = buildSCFpyr(im, ht, order, twidth) - -%----------------------------------------------------------------- -%% DEFAULTS: - -max_ht = floor(log2(min(size(im)))) - 2; - -if (exist('ht') ~= 1) - ht = max_ht; -else - if (ht > max_ht) - error(sprintf('Cannot build pyramid higher than %d levels.',max_ht)); - end -end - -if (exist('order') ~= 1) - order = 3; -elseif ((order > 15) | (order < 0)) - fprintf(1,'Warning: ORDER must be an integer in the range [0,15]. Truncating.\n'); - order = min(max(order,0),15); -else - order = round(order); -end -nbands = order+1; - -if (exist('twidth') ~= 1) - twidth = 1; -elseif (twidth <= 0) - fprintf(1,'Warning: TWIDTH must be positive. Setting to 1.\n'); - twidth = 1; -end - -%----------------------------------------------------------------- -%% Steering stuff: - -if (mod((nbands),2) == 0) - harmonics = [0:(nbands/2)-1]'*2 + 1; -else - harmonics = [0:(nbands-1)/2]'*2; -end - -steermtx = steer2HarmMtx(harmonics, pi*[0:nbands-1]/nbands, 'even'); - -%----------------------------------------------------------------- - -dims = size(im); -ctr = ceil((dims+0.5)/2); - -[xramp,yramp] = meshgrid( ([1:dims(2)]-ctr(2))./(dims(2)/2), ... - ([1:dims(1)]-ctr(1))./(dims(1)/2) ); -angle = atan2(yramp,xramp); -log_rad = sqrt(xramp.^2 + yramp.^2); -log_rad(ctr(1),ctr(2)) = log_rad(ctr(1),ctr(2)-1); -log_rad = log2(log_rad); - -%% Radial transition function (a raised cosine in log-frequency): -[Xrcos,Yrcos] = rcosFn(twidth,(-twidth/2),[0 1]); -Yrcos = sqrt(Yrcos); - -YIrcos = sqrt(1.0 - Yrcos.^2); -lo0mask = pointOp(log_rad, YIrcos, Xrcos(1), Xrcos(2)-Xrcos(1), 0); -imdft = fftshift(fft2(im)); -lo0dft = imdft .* lo0mask; - -[pyr,pind] = buildSCFpyrLevs(lo0dft, log_rad, Xrcos, Yrcos, angle, ht, nbands); - -hi0mask = pointOp(log_rad, Yrcos, Xrcos(1), Xrcos(2)-Xrcos(1), 0); -hi0dft = imdft .* hi0mask; -hi0 = ifft2(ifftshift(hi0dft)); - -pyr = [real(hi0(:)) ; pyr]; -pind = [size(hi0); pind]; diff --git a/evaluation/utils/matlabPyrTools/buildSCFpyrLevs.m b/evaluation/utils/matlabPyrTools/buildSCFpyrLevs.m deleted file mode 100755 index bd75695..0000000 --- a/evaluation/utils/matlabPyrTools/buildSCFpyrLevs.m +++ /dev/null @@ -1,73 +0,0 @@ -% [PYR, INDICES] = buildSCFpyrLevs(LODFT, LOGRAD, XRCOS, YRCOS, ANGLE, HEIGHT, NBANDS) -% -% Recursive function for constructing levels of a steerable pyramid. This -% is called by buildSCFpyr, and is not usually called directly. - -% Original code: Eero Simoncelli, 5/97. -% Modified by Javier Portilla to generate complex bands in 9/97. - -function [pyr,pind] = buildSCFpyrLevs(lodft,log_rad,Xrcos,Yrcos,angle,ht,nbands); - -if (ht <= 0) - - lo0 = ifft2(ifftshift(lodft)); - pyr = real(lo0(:)); - pind = size(lo0); - -else - - bands = zeros(prod(size(lodft)), nbands); - bind = zeros(nbands,2); - -% log_rad = log_rad + 1; - Xrcos = Xrcos - log2(2); % shift origin of lut by 1 octave. - - lutsize = 1024; - Xcosn = pi*[-(2*lutsize+1):(lutsize+1)]/lutsize; % [-2*pi:pi] - order = nbands-1; - %% divide by sqrt(sum_(n=0)^(N-1) cos(pi*n/N)^(2(N-1)) ) - %% Thanks to Patrick Teo for writing this out :) - const = (2^(2*order))*(factorial(order)^2)/(nbands*factorial(2*order)); - -% -% Ycosn = sqrt(const) * (cos(Xcosn)).^order; -% - % analityc version: only take one lobe - alfa= mod(pi+Xcosn,2*pi)-pi; - Ycosn = 2*sqrt(const) * (cos(Xcosn).^order) .* (abs(alfa) max_ht) - error(sprintf('Cannot build pyramid higher than %d levels.',max_ht)); - end -end - -if (exist('order') ~= 1) - order = 3; -elseif ((order > 15) | (order < 0)) - fprintf(1,'Warning: ORDER must be an integer in the range [0,15]. Truncating.\n'); - order = min(max(order,0),15); -else - order = round(order); -end -nbands = order+1; - -if (exist('twidth') ~= 1) - twidth = 1; -elseif (twidth <= 0) - fprintf(1,'Warning: TWIDTH must be positive. Setting to 1.\n'); - twidth = 1; -end - -%----------------------------------------------------------------- -%% Steering stuff: - -if (mod((nbands),2) == 0) - harmonics = [0:(nbands/2)-1]'*2 + 1; -else - harmonics = [0:(nbands-1)/2]'*2; -end - -steermtx = steer2HarmMtx(harmonics, pi*[0:nbands-1]/nbands, 'even'); - -%----------------------------------------------------------------- - -dims = size(im); -ctr = ceil((dims+0.5)/2); - -[xramp,yramp] = meshgrid( ([1:dims(2)]-ctr(2))./(dims(2)/2), ... - ([1:dims(1)]-ctr(1))./(dims(1)/2) ); -angle = atan2(yramp,xramp); -log_rad = sqrt(xramp.^2 + yramp.^2); -log_rad(ctr(1),ctr(2)) = log_rad(ctr(1),ctr(2)-1); -log_rad = log2(log_rad); - -%% Radial transition function (a raised cosine in log-frequency): -[Xrcos,Yrcos] = rcosFn(twidth,(-twidth/2),[0 1]); -Yrcos = sqrt(Yrcos); - -YIrcos = sqrt(1.0 - Yrcos.^2); -lo0mask = pointOp(log_rad, YIrcos, Xrcos(1), Xrcos(2)-Xrcos(1), 0); -imdft = fftshift(fft2(im)); -lo0dft = imdft .* lo0mask; - -[pyr,pind] = buildSFpyrLevs(lo0dft, log_rad, Xrcos, Yrcos, angle, ht, nbands); - -hi0mask = pointOp(log_rad, Yrcos, Xrcos(1), Xrcos(2)-Xrcos(1), 0); -hi0dft = imdft .* hi0mask; -hi0 = ifft2(ifftshift(hi0dft)); - -pyr = [real(hi0(:)) ; pyr]; -pind = [size(hi0); pind]; diff --git a/evaluation/utils/matlabPyrTools/buildSFpyrLevs.m b/evaluation/utils/matlabPyrTools/buildSFpyrLevs.m deleted file mode 100755 index ad2c8de..0000000 --- a/evaluation/utils/matlabPyrTools/buildSFpyrLevs.m +++ /dev/null @@ -1,63 +0,0 @@ -% [PYR, INDICES] = buildSFpyrLevs(LODFT, LOGRAD, XRCOS, YRCOS, ANGLE, HEIGHT, NBANDS) -% -% Recursive function for constructing levels of a steerable pyramid. This -% is called by buildSFpyr, and is not usually called directly. - -% Eero Simoncelli, 5/97. - -function [pyr,pind] = buildSFpyrLevs(lodft,log_rad,Xrcos,Yrcos,angle,ht,nbands); - -if (ht <= 0) - - lo0 = ifft2(ifftshift(lodft)); - pyr = real(lo0(:)); - pind = size(lo0); - -else - - bands = zeros(prod(size(lodft)), nbands); - bind = zeros(nbands,2); - -% log_rad = log_rad + 1; - Xrcos = Xrcos - log2(2); % shift origin of lut by 1 octave. - - lutsize = 1024; - Xcosn = pi*[-(2*lutsize+1):(lutsize+1)]/lutsize; % [-2*pi:pi] - order = nbands-1; - %% divide by sqrt(sum_(n=0)^(N-1) cos(pi*n/N)^(2(N-1)) ) - %% Thanks to Patrick Teo for writing this out :) - const = (2^(2*order))*(factorial(order)^2)/(nbands*factorial(2*order)); - Ycosn = sqrt(const) * (cos(Xcosn)).^order; - himask = pointOp(log_rad, Yrcos, Xrcos(1), Xrcos(2)-Xrcos(1), 0); - - for b = 1:nbands - anglemask = pointOp(angle, Ycosn, Xcosn(1)+pi*(b-1)/nbands, Xcosn(2)-Xcosn(1)); - banddft = ((-sqrt(-1))^order) .* lodft .* anglemask .* himask; - band = ifft2(ifftshift(banddft)); - - bands(:,b) = real(band(:)); - bind(b,:) = size(band); - end - - dims = size(lodft); - ctr = ceil((dims+0.5)/2); - lodims = ceil((dims-0.5)/2); - loctr = ceil((lodims+0.5)/2); - lostart = ctr-loctr+1; - loend = lostart+lodims-1; - - log_rad = log_rad(lostart(1):loend(1),lostart(2):loend(2)); - angle = angle(lostart(1):loend(1),lostart(2):loend(2)); - lodft = lodft(lostart(1):loend(1),lostart(2):loend(2)); - YIrcos = abs(sqrt(1.0 - Yrcos.^2)); - lomask = pointOp(log_rad, YIrcos, Xrcos(1), Xrcos(2)-Xrcos(1), 0); - - lodft = lomask .* lodft; - - [npyr,nind] = buildSFpyrLevs(lodft, log_rad, Xrcos, Yrcos, angle, ht-1, nbands); - - pyr = [bands(:); npyr]; - pind = [bind; nind]; - -end - diff --git a/evaluation/utils/matlabPyrTools/buildSpyr.m b/evaluation/utils/matlabPyrTools/buildSpyr.m deleted file mode 100755 index dffc714..0000000 --- a/evaluation/utils/matlabPyrTools/buildSpyr.m +++ /dev/null @@ -1,62 +0,0 @@ -% [PYR, INDICES, STEERMTX, HARMONICS] = buildSpyr(IM, HEIGHT, FILTFILE, EDGES) -% -% Construct a steerable pyramid on matrix IM. Convolutions are -% done with spatial filters. -% -% HEIGHT (optional) specifies the number of pyramid levels to build. Default -% is maxPyrHt(size(IM),size(FILT)). -% You can also specify 'auto' to use this value. -% -% FILTFILE (optional) should be a string referring to an m-file that -% returns the rfilters. (examples: 'sp0Filters', 'sp1Filters', -% 'sp3Filters','sp5Filters'. default = 'sp1Filters'). EDGES specifies -% edge-handling, and defaults to 'reflect1' (see corrDn). -% -% PYR is a vector containing the N pyramid subbands, ordered from fine -% to coarse. INDICES is an Nx2 matrix containing the sizes of -% each subband. This is compatible with the MatLab Wavelet toolbox. -% See the function STEER for a description of STEERMTX and HARMONICS. - -% Eero Simoncelli, 6/96. -% See http://www.cis.upenn.edu/~eero/steerpyr.html for more -% information about the Steerable Pyramid image decomposition. - -function [pyr,pind,steermtx,harmonics] = buildSpyr(im, ht, filtfile, edges) - -%----------------------------------------------------------------- -%% DEFAULTS: - -if (exist('filtfile') ~= 1) - filtfile = 'sp1Filters'; -end - -if (exist('edges') ~= 1) - edges= 'reflect1'; -end - -if (isstr(filtfile) & (exist(filtfile) == 2)) - [lo0filt,hi0filt,lofilt,bfilts,steermtx,harmonics] = eval(filtfile); -else - fprintf(1,'\nUse buildSFpyr for pyramids with arbitrary numbers of orientation bands.\n'); - error('FILTFILE argument must be the name of an M-file containing SPYR filters.'); -end - -max_ht = maxPyrHt(size(im), size(lofilt,1)); -if ( (exist('ht') ~= 1) | (ht == 'auto') ) - ht = max_ht; -else - if (ht > max_ht) - error(sprintf('Cannot build pyramid higher than %d levels.',max_ht)); - end -end - -%----------------------------------------------------------------- - -hi0 = corrDn(im, hi0filt, edges); -lo0 = corrDn(im, lo0filt, edges); - -[pyr,pind] = buildSpyrLevs(lo0, ht, lofilt, bfilts, edges); - -pyr = [hi0(:) ; pyr]; -pind = [size(hi0); pind]; - diff --git a/evaluation/utils/matlabPyrTools/buildSpyrLevs.m b/evaluation/utils/matlabPyrTools/buildSpyrLevs.m deleted file mode 100755 index 4c00077..0000000 --- a/evaluation/utils/matlabPyrTools/buildSpyrLevs.m +++ /dev/null @@ -1,37 +0,0 @@ -% [PYR, INDICES] = buildSpyrLevs(LOIM, HEIGHT, LOFILT, BFILTS, EDGES) -% -% Recursive function for constructing levels of a steerable pyramid. This -% is called by buildSpyr, and is not usually called directly. - -% Eero Simoncelli, 6/96. - -function [pyr,pind] = buildSpyrLevs(lo0,ht,lofilt,bfilts,edges); - -if (ht <= 0) - - pyr = lo0(:); - pind = size(lo0); - -else - - % Assume square filters: - bfiltsz = round(sqrt(size(bfilts,1))); - - bands = zeros(prod(size(lo0)),size(bfilts,2)); - bind = zeros(size(bfilts,2),2); - - for b = 1:size(bfilts,2) - filt = reshape(bfilts(:,b),bfiltsz,bfiltsz); - band = corrDn(lo0, filt, edges); - bands(:,b) = band(:); - bind(b,:) = size(band); - end - - lo = corrDn(lo0, lofilt, edges, [2 2], [1 1]); - - [npyr,nind] = buildSpyrLevs(lo, ht-1, lofilt, bfilts, edges); - - pyr = [bands(:); npyr]; - pind = [bind; nind]; - -end diff --git a/evaluation/utils/matlabPyrTools/buildWpyr.m b/evaluation/utils/matlabPyrTools/buildWpyr.m deleted file mode 100755 index 26a8704..0000000 --- a/evaluation/utils/matlabPyrTools/buildWpyr.m +++ /dev/null @@ -1,100 +0,0 @@ -% [PYR, INDICES] = buildWpyr(IM, HEIGHT, FILT, EDGES) -% -% Construct a separable orthonormal QMF/wavelet pyramid on matrix (or vector) IM. -% -% HEIGHT (optional) specifies the number of pyramid levels to build. Default -% is maxPyrHt(IM,FILT). You can also specify 'auto' to use this value. -% -% FILT (optional) can be a string naming a standard filter (see -% namedFilter), or a vector which will be used for (separable) -% convolution. Filter can be of even or odd length, but should be symmetric. -% Default = 'qmf9'. EDGES specifies edge-handling, and -% defaults to 'reflect1' (see corrDn). -% -% PYR is a vector containing the N pyramid subbands, ordered from fine -% to coarse. INDICES is an Nx2 matrix containing the sizes of -% each subband. This is compatible with the MatLab Wavelet toolbox. - -% Eero Simoncelli, 6/96, based on original lisp code from 1987. - -function [pyr,pind] = buildWpyr(im, ht, filt, edges) - -if (nargin < 1) - error('First argument (IM) is required'); -end - -%------------------------------------------------------------ -%% OPTIONAL ARGS: - -if (exist('filt') ~= 1) - filt = 'qmf9'; -end - -if (exist('edges') ~= 1) - edges= 'reflect1'; -end - -if isstr(filt) - filt = namedFilter(filt); -end - -if ( (size(filt,1) > 1) & (size(filt,2) > 1) ) - error('FILT should be a 1D filter (i.e., a vector)'); -else - filt = filt(:); -end - -hfilt = modulateFlip(filt); - -% Stagger sampling if filter is odd-length: -if (mod(size(filt,1),2) == 0) - stag = 2; -else - stag = 1; -end - -im_sz = size(im); - -max_ht = maxPyrHt(im_sz, size(filt,1)); -if ( (exist('ht') ~= 1) | (ht == 'auto') ) - ht = max_ht; -else - if (ht > max_ht) - error(sprintf('Cannot build pyramid higher than %d levels.',max_ht)); - end -end - -if (ht <= 0) - - pyr = im(:); - pind = im_sz; - -else - - if (im_sz(2) == 1) - lolo = corrDn(im, filt, edges, [2 1], [stag 1]); - hihi = corrDn(im, hfilt, edges, [2 1], [2 1]); - elseif (im_sz(1) == 1) - lolo = corrDn(im, filt', edges, [1 2], [1 stag]); - hihi = corrDn(im, hfilt', edges, [1 2], [1 2]); - else - lo = corrDn(im, filt, edges, [2 1], [stag 1]); - hi = corrDn(im, hfilt, edges, [2 1], [2 1]); - lolo = corrDn(lo, filt', edges, [1 2], [1 stag]); - lohi = corrDn(hi, filt', edges, [1 2], [1 stag]); % horizontal - hilo = corrDn(lo, hfilt', edges, [1 2], [1 2]); % vertical - hihi = corrDn(hi, hfilt', edges, [1 2], [1 2]); % diagonal - end - - [npyr,nind] = buildWpyr(lolo, ht-1, filt, edges); - - if ((im_sz(1) == 1) | (im_sz(2) == 1)) - pyr = [hihi(:); npyr]; - pind = [size(hihi); nind]; - else - pyr = [lohi(:); hilo(:); hihi(:); npyr]; - pind = [size(lohi); size(hilo); size(hihi); nind]; - end - -end - diff --git a/evaluation/utils/matlabPyrTools/cconv2.m b/evaluation/utils/matlabPyrTools/cconv2.m deleted file mode 100755 index efba438..0000000 --- a/evaluation/utils/matlabPyrTools/cconv2.m +++ /dev/null @@ -1,50 +0,0 @@ -% RES = CCONV2(MTX1, MTX2, CTR) -% -% Circular convolution of two matrices. Result will be of size of -% LARGER vector. -% -% The origin of the smaller matrix is assumed to be its center. -% For even dimensions, the origin is determined by the CTR (optional) -% argument: -% CTR origin -% 0 DIM/2 (default) -% 1 (DIM/2)+1 - -% Eero Simoncelli, 6/96. Modified 2/97. - -function c = cconv2(a,b,ctr) - -if (exist('ctr') ~= 1) - ctr = 0; -end - -if (( size(a,1) >= size(b,1) ) & ( size(a,2) >= size(b,2) )) - large = a; small = b; -elseif (( size(a,1) <= size(b,1) ) & ( size(a,2) <= size(b,2) )) - large = b; small = a; -else - error('one arg must be larger than the other in both dimensions!'); -end - -ly = size(large,1); -lx = size(large,2); -sy = size(small,1); -sx = size(small,2); - -%% These values are the index of the small mtx that falls on the -%% border pixel of the large matrix when computing the first -%% convolution response sample: -sy2 = floor((sy+ctr+1)/2); -sx2 = floor((sx+ctr+1)/2); - -% pad: -clarge = [ ... - large(ly-sy+sy2+1:ly,lx-sx+sx2+1:lx), large(ly-sy+sy2+1:ly,:), ... - large(ly-sy+sy2+1:ly,1:sx2-1); ... - large(:,lx-sx+sx2+1:lx), large, large(:,1:sx2-1); ... - large(1:sy2-1,lx-sx+sx2+1:lx), ... - large(1:sy2-1,:), ... - large(1:sy2-1,1:sx2-1) ]; - -c = conv2(clarge,small,'valid'); - diff --git a/evaluation/utils/matlabPyrTools/clip.m b/evaluation/utils/matlabPyrTools/clip.m deleted file mode 100755 index 28804f3..0000000 --- a/evaluation/utils/matlabPyrTools/clip.m +++ /dev/null @@ -1,32 +0,0 @@ -% [RES] = clip(IM, MINVALorRANGE, MAXVAL) -% -% Clip values of matrix IM to lie between minVal and maxVal: -% RES = max(min(IM,MAXVAL),MINVAL) -% The first argument can also specify both min and max, as a 2-vector. -% If only one argument is passed, the range defaults to [0,1]. - -function res = clip(im, minValOrRange, maxVal) - -if (exist('minValOrRange') ~= 1) - minVal = 0; - maxVal = 1; -elseif (length(minValOrRange) == 2) - minVal = minValOrRange(1); - maxVal = minValOrRange(2); -elseif (length(minValOrRange) == 1) - minVal = minValOrRange; - if (exist('maxVal') ~= 1) - maxVal=minVal+1; - end -else - error('MINVAL must be a scalar or a 2-vector'); -end - -if ( maxVal < minVal ) - error('MAXVAL should be less than MINVAL'); -end - -res = im; -res(find(im < minVal)) = minVal; -res(find(im > maxVal)) = maxVal; - diff --git a/evaluation/utils/matlabPyrTools/corrDn.m b/evaluation/utils/matlabPyrTools/corrDn.m deleted file mode 100755 index 1f493d3..0000000 --- a/evaluation/utils/matlabPyrTools/corrDn.m +++ /dev/null @@ -1,63 +0,0 @@ -% RES = corrDn(IM, FILT, EDGES, STEP, START, STOP) -% -% Compute correlation of matrices IM with FILT, followed by -% downsampling. These arguments should be 1D or 2D matrices, and IM -% must be larger (in both dimensions) than FILT. The origin of filt -% is assumed to be floor(size(filt)/2)+1. -% -% EDGES is a string determining boundary handling: -% 'circular' - Circular convolution -% 'reflect1' - Reflect about the edge pixels -% 'reflect2' - Reflect, doubling the edge pixels -% 'repeat' - Repeat the edge pixels -% 'zero' - Assume values of zero outside image boundary -% 'extend' - Reflect and invert (continuous values and derivs) -% 'dont-compute' - Zero output when filter overhangs input boundaries -% -% Downsampling factors are determined by STEP (optional, default=[1 1]), -% which should be a 2-vector [y,x]. -% -% The window over which the convolution occurs is specfied by START -% (optional, default=[1,1], and STOP (optional, default=size(IM)). -% -% NOTE: this operation corresponds to multiplication of a signal -% vector by a matrix whose rows contain copies of the FILT shifted by -% multiples of STEP. See upConv.m for the operation corresponding to -% the transpose of this matrix. - -% Eero Simoncelli, 6/96, revised 2/97. - -function res = corrDn(im, filt, edges, step, start, stop) - -%% NOTE: THIS CODE IS NOT ACTUALLY USED! (MEX FILE IS CALLED INSTEAD) - -%fprintf(1,'WARNING: You should compile the MEX version of "corrDn.c",\n found in the MEX subdirectory of matlabPyrTools, and put it in your matlab path. It is MUCH faster, and provides more boundary-handling options.\n'); - -%------------------------------------------------------------ -%% OPTIONAL ARGS: - -if (exist('edges') == 1) - if (strcmp(edges,'reflect1') ~= 1) - warning('Using REFLECT1 edge-handling (use MEX code for other options).'); - end -end - -if (exist('step') ~= 1) - step = [1,1]; -end - -if (exist('start') ~= 1) - start = [1,1]; -end - -if (exist('stop') ~= 1) - stop = size(im); -end - -%------------------------------------------------------------ - -% Reverse order of taps in filt, to do correlation instead of convolution -filt = filt(size(filt,1):-1:1,size(filt,2):-1:1); - -tmp = rconv2(im,filt); -res = tmp(start(1):step(1):stop(1),start(2):step(2):stop(2)); diff --git a/evaluation/utils/matlabPyrTools/corrDn.mexa64 b/evaluation/utils/matlabPyrTools/corrDn.mexa64 deleted file mode 100755 index 94dc932314b988c9d0e7a47b06b1cacfb751e2e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33734 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 diff --git a/evaluation/utils/matlabPyrTools/corrDn.mexmac b/evaluation/utils/matlabPyrTools/corrDn.mexmac deleted file mode 100755 index 75a5407e4fcead5aeda0f956ff80b681f39915c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30168 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 Ba(@5- diff --git a/evaluation/utils/matlabPyrTools/corrDn.mexw32 b/evaluation/utils/matlabPyrTools/corrDn.mexw32 deleted file mode 100755 index 51406514657a70eac04c1815ce3aa3845df5ab5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25088 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 diff --git a/evaluation/utils/matlabPyrTools/einstein.pgm b/evaluation/utils/matlabPyrTools/einstein.pgm deleted file mode 100755 index 99b974c468ae20ffabb8ac163820e56b94c959fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65596 zcmd?R<$4@hx-MA1=PLSn&X3boCP{`e$TCBjNnlxIVKM|WWkh69Mnp1;EXlU)qTan{ z_T1gP;XZdUDp!@&AZNr{>-%2%)~n0^_`m+wKkmJGaOd62H`o91;MH&U{xP>jkm+LK zACu=N|M8DETg>%;Oio<5hX3KzE?c-B162|2m(1UATakll*n=%$ale*M)QE zC$GO*TX;Hi>((_hC>q431OPimpml)b6!f zt#&g?zWiD(j>CG`s5e^8?y%#?hF-CvSW_z^t5<4avwt|;-`_nLw4(0*{=vcSa5x-~ z4o1V#-u`X}-|X)W$NNX0PClJ{`O>R44^EB_hOL?*6AUd>s$sLYEW;) zp{wv@xx|Qys+rZQ*K9Owl2C)77Wi&Zv5cx?RlOi;hOKrS)qnbFa&qF_xu4IRzi|HC zx$_q$&R_WDEWYp(uD@GacysUm&0nA7n8JexZ{|}ukuI&Xt{(-lU-JV?V5^O~+i*kE z&;&tJD-~5T{Z_x*Z+BYtFbHeDA4GmVj_Zwj*y#-Wp{r$Z`e{_(%gh6|6Z!kJKI63)@zXpDD^!em))OJjsAsJcogGQ^< z>W};V;a*G8qgJaPy9!5@N`xS3n&tW--cPkiX`veifmgNkifNd5{6?+WP1fkApU$64 z*8l8<^B1PhT{wI0+?gLwf8oN^%=3lWmv?U8oq1K_OOGGFnoDIxp3I1~$PfIe7DblG zTlJ2M$8$7UkYvTO6xpnIx`SS$(Fo(%!{dk8AyK{7Xhe-puj6Z`68T=(KW`?hW?$PL95ue*5Ed*Kh0}ogR-`fiBWC zBe_xBYIS?#VQ+6ZY6)he)vnh)RVYz3C#$-Sg|0VSb-zIBZY_*!9$tXsRGqLE#aN+M zJ8J&)(^+i#v**s7pE!5n{M7mLXYu?O@b8Jq>F4urpWL~9XJ)R*=k7jyKDUz$=5GmPrvuA z#^Ld&gT1b&a%Gy+Ospez+i=hykH?Xy*W-4(;R)qZp-f4tY+1gKKfZ1kh{}%z^PGxd zRZQE9>&*_9zuW92>;KDHod5IZ&*3DTKZ9>3CnlyQCokT3zOe9k=JxGdZ_8Zv-ouxR zTUn9HtrA|X7Bu5HYPqtgMy+yw@G8su!pyBa{L)@;M>=Z zT|YSf{At{>6^0}^-SDvD!`^UrfbG)MbSy?Qc0{6FDpR~9>ZVhRo4t-juvQR;LCv@A zs%cnwfUwyb^s)Rn|7U(VbN0s>n3$ZJI(P0D)BrsG#MIQy7mM?cZr^%%XP#zurXRdo zSWodnX@~N$vSA}?dR19cLma?{XQ-0Ev9henycu`L!*LHApn(H`BM`)KEpF7KMt3mW zZ%TM zzI3bg!_zN&qdICFOY@rL1?lhYcmg? zzg6=;fAZ6}HvjcyNpVmyvTwTAs)vt^bj6D3ZTb<6QX>tvIx+qRa^*>c6N3y?%et?V=Jzf#V1D0KKo##*XQB zdjs3^6w|F${E8_s9Lp-arrUL|(P)KkcZ^!z>5j*HgWbWP+aC=N_VJrxfA{e7@$vEJ z-%p1@_vrKS-fqV;c#h@KOB!*r-5>OaqtURYN@26nifx%HmncTi72T}{tyZsPQjDIg znD4lD#k5=p1t5%@^=7k;^`AI@4qE^%VCvGu#fuk{4v5W8f6>@Dfv|D^f+!>{?vGPW2jxLsYU+uZ?mx8n$+g+5=znI|>UQc?g`-K1mJD6BJv?T+sg*f1 z2%~z{GF{uMI*yNK&}uYMlau=ffUkz(yUmlfBwG}$)vUek@8)@Xl!Fvi|F9H4@Z_V#vxjP?Ku4o^RQIXpP} zhWLQ>II0mPb3b(SPghmRb}laUJc? zwjB%4?_%=;|DY&^*#AlGOMc>h*zt;?Q$ll-(!}@j2o~b3AIhs_IpQnxV=l z;k0CGy6L*M)Ck&DueEo0P;c&ycgNTT-O&IzaCg+(J2^Z)Iy(AxeER*gZ8!H$P7d~( zeuZN>-mJQ{s6FTmlh?HysZ!MLHbP5bX`)2Qs%BNIe$c8n)I3`OTnT-?l02K+tFejwUiJrh{bV99NX zmCD#NykqJiAfjf({R7mb!LT{%k46dfMF|{_j}P}g9qxZR`S!=RZv(fx|M|<|UMtXe z8T;Sy!g{-n?GFSo4h1#t^zi(efc0kt5%sU?*XpfUBSjmfT0GE0zd%v ze*%2*_auscau84qCZ;Z4oS6Fc_T2K^qq{RR_jU;8$@Fi}mN$1;mMe(OR*0kRhc!zU z-KZJY8li0ntia2tf4UQ+X$^;cZ~)KoUEfEcsD*AEH(UK)5Lk}F3cgk~HPkPG&{RR! zs%ooJbyTl$;5X~NZo4-ebUXORxc_MnFmSYcuy^wH`|0oB2Ttqc^y~gUU^FL?g6wz^ zo}t$pb%B&?s@Xt6uQ@7R$`%<}l2B$`AIMuNN+v#}@0!^CR>i@t!A|L*LU*zMr!JfU z<~?_D>f(i@0{mb@m!>8!UcU2s>CNMrTQ~3TQ1sI~k6$jYWH?zUNH{k*IW-(KO{wB1 z)til~B}o9>Rl_pu22SsA*pAzEFRJ0N`4PZIt=Z@{d-cH7HJ4>8PFS^NUXwVU69p4A zz`%}nyEUiox593JcMr|E(+39_bw=aeu~`5a~{|iI{>Bc z;>09q&*X)vsf&|SmoD9UHUH+>?K`&~rKr-QTTh>VSlgx*Au3^(dHN&14Z-NNrHI&nN49DX_+@1G26{ez=pbP?TPs3N0RToB7vuRj>0RK#Kh z`?&^C!V_hZmNf;B>xWUNA?A1&#mMt2hG|t@+jTt;k>DRZ`w!N83C|DeJB9O) z<)6BAoafBZmh8~vCi9>Yy$kox!dD+lp$!P$L z4)IRnpc>Y}f4$HRLbq0{hMfS2*+mJGRKw5}O2bNtio&QO%jGFuW-W^`EZM5^*+}qDzt?XMaR4G-^}*s69l&7Rvj$94b+G|iT!|_2}7?_=ux#HC9!&*xr0 zymj-&-R&arbo%k@rF2G;n3NQw$Ka=iQB@XfbdgRo0utgS@OeX$&4m8+Q6Xz?#X{MI zT3};iSQXXA1`sI8(mjz=EyKd@7i1N*Q7D#ZTEv=4oKc~x)z$#*6BG!5`49+b_cQ7r z`rqkZ-K+2JecneGRYj5#@%(-Zq5_aoZ#?#SJ*u~{$7G>YBuGJ36|Lf;O^1AuvwhSe z*9H9p_;p+-j%wiKfF?ivbZPPj@lT3AfG;}WxupK#0Ni=^VeZMD=^KwySbUVS49BC8X~Jj3ah z%$XK1DtG}J#W4z1q>1ffDaW%6dN-@0gLH7F6EcWe0swGy_~p~*<1f38+8m7bKaU%> z%25oj8eZ7$jqrxh|Hc8RSEm`frbHErMUvuV&9LksY=-DrRp0l#plUl6fZwVI2oKgC z;}GEdqX1k0_iwH3t8S!2~!8A6!u+JwiulHJwIP$CB$nI!2Y3GzX-sfyN2k%A0{)5i7DtN~EkS za>gZ~ng2!0cS zRO7e-aExjYqdMKXXUJ@!NYfn0>i~PuA8K??w1dcX{OS+#gX-&{CU=@0Y~r7OItS?k zZ4dDG3R(bA&=kH<1TWuv`+oM(^o=Wb(`4z^%%k7tR!f@6rTDnr1gmI7KB_Rv8>Eyd zung>fPSI2uA1N|T8%u9_=m~s<<^+M)RZiBi>1A0^HABTlDa*1bu#76xAJa6sC6$&_ z>gI=yEuz5HV^wi11yCYN&~5K{cmL!BfMB;?MG*m8ifoM{X+eRI15v3v+y!y&)npU& zr|CghE0B14$*5Ez0M+U)Q?;;q@u4^M7RUw@D#h`aY5J$9(Nkb#b5@0I;Zo_14}&w+ZEN?{GY9+7d$o;FxX*{RfRQIRu_q3A?>0HZ`(TphR9$ zDwYp`Q1@8U^r3$J=LO)cKov`fGI&WVPWpfH_~)i3&QGD}O+Wzy_6G!>m|0j^e0=l9 zwFh}RKXdo-<98p+6$|Sh^?-R|bk?daR^kSTWZRPk4tg9f2o)Oupl60AUWjHJI07;U zZGd{OEyTA`> zA@na`QnWvilNQ)t1NaA&2eJ>upNo@|IQZxWco|78y!mcr?!nDlH=m@*)U}z1k6x_i zEnV6W(4CvL7zM?V1Rc_5J%RrcLn&%S;OVO0jCCc9G`XtKvTZS($d`+tWJOUR={&1& z3|lJjV$q;2gOD|nE$69xDxITEj;4wNwSmHh*J*+q)?1;UoYUd>;M38kuSZR_Hs0Ic z8wQq4lO*^r6sC5<69)akFpw=M&w-~&Orb<^e6l?Nyjz`sg3y{gec;=kZ8?DpR*LH1 zXm@|`f9QTFeL%lc5WygRCR6}W_|nYVmDzhYZcV=^P??zrzdd@flvfOLn+D~@>U%y! zXc62M5|nE|k1nxVMTe$S)e<~kb8JylN*R{Sm1SEOXqGMue32*{JkKh$B$o-<)_6fL zWJHptOR1uu5g9sbZfx<8(sa4v1n5?pp}T-^;B}4GVNaJE!@Ygf0au|Ziq~u(a2a(0 zO3~h~BUy2$QL`&DTPl`W5C9#Yu2%1QC87fD3qTCruj+ap@I|xLX*QZzM(E$bJjqih zv=7|>9ONLpkjV>^Gq2{~J-9J5{W4FdrtjZ=_K_ng-LmrtWX3(70Qh^7l+wbdJq`$Omi7GJ@t z;#A5^p+K;LphD>jYPF6>lX?Ke2hj%F2f!G#5FnpsFHt9x=f^XjpSTG1WAeg97$0Z| zI13XO@4lIP{a|ML#)}-aJ$?7?!?!DW%@nuTL{jf0>V8#G!F_SUe8?F*O(=dHg5Tp|Sp zLK8?@v+EFawN^(Z2tD5c3Pw>t(XK;{Z#1y}(EiV&>m}tM@MmfQFJto3rOTHt-G2J+ z$>SS0re7D??dgY4p3Q!wEtB2`{(-6j0W1X4uAqvdk|y|v7C^XV2sw_RR#n+hA;K#_ zNOn+-16xH+mvw>H&=v$Z6QV#6no%?@vMiEBSzy!HCagel0(J^ohQKfxo)9#lL{h8` z5Z9>>M?JSag3<#;5AToSO}z#vHU!_;#Y?edx6#E~*alTBmU#(kEE;{-?Anx2jle+Q zM)@`1u>d`>(Qct{^^)gLs1Fc8^61b#aq<&32skix{pstcx3Ay0`l7^dT)+G9x5X@N zRfG*bK-C}m$r~zPPH!%+cSTakKJg<9hwF~zT z^lvn(a@hZI9ry?Ir;N`dfc0Rd+BU`8wV>9j2Z{3K020E91iWswK!Wl77jOWe|NbA{ z6E7gCg_kC#rr#{iKfZlyX0}AHUA^_-+2T%Fm+4IoRJK_Mv&Q*XTB`{BrJ70CUOt}KsT%dA_oMqSyRg`HapQF-S%UeZ`T-$nA z5K3E_ViBLYs!8zMOw;rYilwF44IEI{VZ9Rv4r)9p5Wv>xe-Ow=pb55A#i?!tCQtCF zf0AN43C(SHsuXWUSoE431$cZnNLn`Zg;uv&2mbv9gb%P6g72k^IQ^)GP=NsiFV4JL zn0s{V_RV)i`u(+g_n$0o6=a26qks6B0HJ{+@it737#l&Cz_>V?XB4pvh{K6=K2NC< zK{2F8>w+rsg5esv71uP%ie!x=1a^}m36f>VbcxAjcF^}y>1;adIc$1oX*~rJN2@p= zI*K-Q#fl_#2DP}`=mrhcaap7(l2J66YGWwmSkHki0W(77(FNcig5e|uHZQt!&(1^s zsMTCBAT&P*QUHvv7K{b#fTaF`09`nL=7;Aqc`hNt$zecExb|{>_QCY@%tDb`oPPA^ z*@qqM=fV;hgphpNttc`T8W6o12iW!{QW7cNP<4(j!EP1FLbeQaD~Le3I!)+m1ysQn zcyx8$j!jxrIfiC%5NMt((FG!v;Yu4H$)X$!o5hW#1%fQ*3I*7hQms|3gs!VVA7@l2i#9ep|qg@mMQ}(;fX5?!qe+95(2tbMc)94sQ8GGLQVOk`5EXXT_ zGKkR~i1c`V)H~qc#Q((C#Ued_fY~4bwpw-c|Kxeko&5!U zAHDxSQW(@9XkgQ?7H1#bxOsE2NX%Zpcjw8%dQK#BD;(S`=)X_^Az|A91Nfc7mx>I< zr3jWP?BKv#OlBE}g*I)@)q)V(rp3XE_oGHw^-XvHs;P^XVkvq>D6?dmOXb0n2$iz= zZL;#=W4@3s8Q=-A8UAvH&;GH7KFt)LXklScQXK^nZxFO;AyZ z%I67KOMoIsU^E*>Nrw3nMv({RgX{u&LZj7%$O4(dgZ_2q%rAKQ$#XyfQvg3ds6c`M zr(b?pcyRsdjYX1vcm2+z7xNq2G+kV0tC0NRyho_%LKSZUo2aL~LGPr>>5c7` ze1;$kG|!5P2}RiUT&Lxr^O&KBEm`+`R02nIRY|iXtt^&``L(R5?&J$J%jaqSeQqVC zR!zPv7(v5{vG_3zWY=)3hF?cR3;ha|vjWS)Y_9_U;_wegeS>#^L=i>d=|V2gFdC3P zx?ZEL7i7G?5CQ<84}_2qz!$9_6drKlhyDl84_|0{06#bls0h&ir*6Jkn*Z&_%*+Bw zy}N$*>8r&LD>3Zy z7zzN|KPonuZyN$V+Bp30AAt`5z(o3n7>eQt`3oIj`pxqE)0xEnrRJ{Pef;v>n-75R zJG6^EA2sm>jRNPY(XJtm!RB);EZMCxLFH+-xRc#ZX9z0C(B*8AVkNYH>{U3YJ!rah z-vg0^7XgmM(X;@Rz)A*3L$;7jlIHVUYn_3*wmerTN%eN8k4KMsXu7BY)xfE^aQJvp zg2&0LX5H%}E->8P?dzhCf*$%m@IS?98g{$afDA7c)vyMaI&hQikD5?J`Gc~IB@9vj z{`vFIh=3%32i-5J1t0`TH@tB5`Qp1Lw{Fg?Q1qLtcOSog`Ff$uv0EHOX9OTxjR2V^ z9I=FQ0L-wcSUi{B$mTy5^4UyoGnFfR1ko>wT8^SfvEr-Vr_OM{3%IP;LRl9L(eU90 z=c|Q^UQ$%MSkNd*SP|K+Rj%1lbL$UZ;Y9VIX^a{{w^uU+(*&b&TApso43#PKvL25+ z?StX&{=sNqN?uae0!`pbWtxQ+g%=P-ow``iEx=VjswQz1KW@|-ZLsP9JhqAccP6R$ zKNPTp|DF2<`vIHa!o;O(FBjiFyg7Ymlj2@pzx&(sm$SfkO@Z1| z)?o&D0vIh-=J_2lwOk!HOPP-gn=4?P4c|ouXf*EacO2b8<&?oQSSSi*L9)GOx8Fx% zXn(J7s(z!%%YO!Jefgviz3f3KlO@Pf0_S=FP(SZJgO%VFY`G@?I*q`UH z`_G>J1up<70DoP7`C6!bBc>WvM|4(Pmtw8Z~qjpok{s&!6RxGjZ>rL$04xkc}aShaeG`}-HBLRXnNAxcdKz_l~ zLlu~Ly*PjG`pmrrf_XK4|KW=li|d?NT49kSh|y3Qv8M}e+=7~1)l@8gmedHQRLb&H zs!-Zon0uevN~PE4cizk`5=KQ6)P~Pi3^;NQ*h8FfrVbn$Q_-TTF9Me`8J18Lo!e<} zeoHCSYpaF4kY39$aTQ^OP7+t??HwT))A1^%WGFnRSXJ;MSS6$3ZXdxS7)HQPyuB zn>TK4kld>~51&1Iy_n%;a*1{7aI_osTD>aCZp*Wf@=EG)j$tc8eurdtQpFsQom3Ia z)OLECW+(-L$PvE7XF92Mp;oZN!04pCXje^oxjNcE+8?xn4z~LMezUI70tbBI)*2&p|NXs#v8i~?UKdS?Cv!QhKai6Jz|n8< zq*9F&8@>kQh8zNNfOwto#S;f8+5brW;THh#k17B!{D%d8@#>TJZ|>i`dv}9kU(P&! z{^ISzmMjpfY|uggC@~N0ite?2zv^g=C>JQ`S~8Ve&*sxvl9f1)7JzZVT!aLAng$?i zQIrX*4j|JGdS0#Np|*MT8r+=F@6|k7HEcyLl?WE4%xAZXbR}QePV*46IK{5@$Dg}s zAA?aBVKJRjl!{1dhF$CSb_XE9Jx2-qy>7z;V=ka>a`UdbErlN!m zFK&iWFz7{n8*w zC&-3@24C~KNKSUDYS=@_^1g`O_2TpT1xmY zAm1<806#Kc006)Ig8VDM;DrlU9>4qz{O92&Nj<&&@X74#N?K&7P0mez8pLz3P#FS4 zO|`2aa@itqOlF(N7R$v9QO;#IcQX0n=GuB%&^#Pfie6pb)Og+wk^oc_%q2b?jl4k< zL4+ejlY$Ul5#mFpkYh+h+YFA9e6^r}>O$+*Yc+u2WZU-QYBiErC|o3sHw$DHyIvB3 z(De|}IZ#6g%K1`RMEnizbA3?f=pQb00M8ngA2Gl>jz0`s2nk94Z(`!?&p-c?NWkaM zCidqq|2%URO7MlL>8Ed=-k-VtIK>q1+`Rkb)#6%O;^=ig0QajUaVijWx7Dznkf*`o zibakurgIdMxjT69&Gkfr;2ES`0rC}zqBhquqG^X+6n`y>8@)l;{{;CI6>7iPLOwEC z6t`}BDBmh0$xdF3HcsCCz;cNXwZ)P`(q8hA&fJa zQiW_TSEdxiKM<&Bb3(!^G9$5I!>a0C72ia=L7_S3n$rU0D+0A z>rY-iyE{GoTdJJ8dF#%-ryt;dvgIW{u_Xc&0jQjO&~i0ff%r)m3!LUDWDyxDfhjXZ zlFSrKlG|u1jG;0zBb2v3N)_L&e(Grz^x(KX#?SHniX8`t(A0dS9~{rETdu^HI0A}~ zs#hq(;$#ARuawKAHkR;meIV($LJ<%E0COy8fFN>leY`ia^~R{*i7b_;@`WI`ExNq;tAN}~FOvE@SlM*GM2|IxpZcn1FYj{<_+FKWSs^A}-&U%2t)-HVy))6Wak z#?_g7k6$dTmqaPQ%DRZsz(Gt>zXB{4*L7fjGGv)iRgF#MIF-f@ATotwnv-n1iD;0{ zvTUlj!`GnK$IZPasE`*&hF$e+z3Kz98x=$-ZR8oj@m!kU28)&nTB>LY67?F;F;l@= z^D2~(rmKeA3{6w9__8ERwi}IFVRLUZw(WYq*9$FJ!v(0LY7%sV=HH80q8dO5juAq` zFDoG|O&~xR*FeJ1zj5XP`CxiM0fYK+=I5mU;e}j#Is5Yd^o_SUYU$$r+xMTn-^>eq zevPf-_#^%v)sgx}{;6GqI04n8#37T+mndFf$UIq2?`(pf!V!d$s|t|11c*fu(%RiR z;vuzu&2uYiD{{k{fk0Wcf^b^3Y6Kn=mzV-@v%;1QF^^mwivvYbs!^?Jp2nAVk`Ruf zYl=>HvK90%Sn#AP`wI z7&JSvf#?hhQx)(Y1^|3guEgdG0w<%I5P4E46l@E555I<5lLWlUBBy$$qU&N}f{*vd zj?wIQTQ!)HrDCDP8(!6OAPDpvnuiYt?>*VJN%95U6|@)@NDS@r2mZmTpPxLB&=*Xw zBneu`%p+F;mJ3 zrXuALm`|58IkPJ2V0fNds~JIzO!VP5=-2yQr|E}1gfYX4hq$t>!HQ`NLi{l7e>Cu_ zt}5`zxk3&RCyFLgWwx-)XvM8EMHRee)lkLq$6`5`M_E;x?W)o3?jH6*lxj1pBzwtpi8^n{pz=pPach=l?GC-pxGJAwcp`~%|mpD;{90M1QbeZDk% z@7B$Qa{1-eTX*ihcsKu%qSoJ2eya)J1z_4j{sm+jas~tG8s1(enz{ys#2nq9~9V^eZyMM#+#HsYaR=T%yC z5L3nZ#~vRQ<&lUF3)a`3Kw z$8PVR9`5%m4Q!faHd+G<+_Zv$Z`%9!gx57~smoH!tqb-1?AVUR=Eg{rmZwrEF>u>yH5z z9}O$8k>g2tWeq77dV4DkNxqmPnZnA4m6g?xFtlw!g0)vN%vzFE4b^JY#u!xOAh_y6 z&VqZ@g=Ghc76%_0$*>808et1qQU!r}mSoa&p2^b$v9Pr9p`6cg3M<(>8ea+OA-X?$ zT!L*7?COliwQAgNbs$QzrFzHu>Pp{ zcmtQfd*A|s{+)ySnb@Bb*PqP4g#W!*BA;KndHeq3=d;V1_1Q(Nf0Cty@MFt##f66y z>Oww~+1x5^Z!Q(f<;~5N4@)a68;oFa6o)SZUr4-R^vkXTiui~ip&|o_g^hj}frd7C z3*?yOC7>x_KnpuS6hv(A0x!YJqPRjvfKn*)lt_}Apoj`VE23y=Ufn^o1Da2@Rfn<+ zGFS&UrYM9-3{=-@h=_wxMoJl?A52K!vmM*7Aqs-NfYJbQ6wjYLKIk6Q&xy&i&_ZDb zCzxpB@^7zS-nwyPiQr#dxqbKU(--ePrqhr$jzL~Aj%`k6Ql)HqJ4=!I zjV)?pZE<$JkQNn&71dJNRdXmu9Q;4cK>GnJL1PNqb?9O3#J$0;?KY9zghu6o-21*& zK~_lOSXiMN&*bvOd^5d?%B}pvLuz?%xtB$cDAzbpT2yP zVHu@@Em~CNY!N1InbQOw`M!!~)#{K?AfkKC0DdmUUD~_JFiHR*i0LH9adlbYRg0Aw z5z=^ed#jjAt?#7LES17LMe+yXFRNR3Z5k#AlTQ_R5}6NL^M~EY0~R9@075tf;}4jA zYHMY_;z99=LTC(VF$hg1CIE7yP(c&^gEc>c1_;W73UKDS1)zshaqO%z!8%OP6Gd^Q^R$ zFKlj>%BlQLdTWPKT%bv<*}<4w3Ms!lZ&C#sV<*LxtlB_Zw?!JQv5YV#bax0Gb)~Fe z-UD0K2Oq=B!~dK02D&}ef`Os7q_ndx{#+{{d(ih z-KQ@X){EJ-1=0imM?ppYOBUg#wL<_oKEFJ-kuNeVk-Mkiw!n@uZv$M7G z{v*^7bXg)xSb=XA$XvEWmGUWCtZF=|H^oiLX`{2qECVnGre(qZ1kIPqisd0Fgi}|= z0GMVcHgHk`FrgPF^)F#OsQ-vRpa%Zu{3m(niOY}XpWV88ZLv&0y*P90&eP}bx5?th zd)n(Hd3Llwgx>6=igOt6=&(#_8}`cLayAbySwMay zG8i(I&J;Fs9ok#P!E>Z|+>Xwn|XH{d(ut?MKfSw$R$&aR_*!S7H6( zdZYitRzk#+%u`ULh)huwH#btN>zSeePb^)at({DEXS+zUf^6|BEE!1ViTPOXjQ5WA zj}YtLKm3GLFGSqk0h)AT{Hrz)5QmBhYk-25#b$Tb+05!YBycF20m0LY>#wfQZOv`I zd$*k~66g$Yk@3e9UdxeKk_2XwD}X;?&}{Q%1z;8G2b2#FfY;gvhncOJfcw^=ByFEUPY^fA*483x8OFr-&S z&&9{!i^T%Zmp3<7Qkgu><#IexQmFN<+{RWGJVrnu0Ul&BuAB_K9v^-A>yK~WKYzt+ z8)jUF?bf&pkWfuVi8Y=jFv4uhmc*uLff37@t@&3=TN~>eXo@tmxwgHq`e9{zZa%x2 zUM}KjX(k9kLDU;AMgtIlfP!LSHV>l*5&@YMr$5BI$MhQ>AG4777G7lihyDlK2dW1+ ze**rKf8aPk54&*n!QAtESFf$mPb(m<3hZespdtfIp-F#gMy zVMnTqG9zB(C#D?fyo3$51SQJNl>FYI0;Al473lywXkU2KHmd@t3w<$W8Pko$yJD>Tug3`Y|yZmuWteJ=iZWc%uG+;ee`OnSln1(YN%5PQN)qOb5$I%2t}> z4F`rLtR}znadWLm6(|~WE{G!q(ClHx)t~|Reyi6zJox?dx6fZrjt{;f<34OvRfQ5T zNed9eAU~zT%P6j$OsGZHWn59VqDt{+RH;U?MPr^2w=bZ&cTImhNVH<|40jbCrRdj0HP23DlJm1Q^|O^GQH z#WJ*Zj7K7<7K^L`k2*vv^dTL>LBmuCyX4nIt$2Iwq=9r!zi4i2nowjbFcgIr{wl@81tU{rT!oLx1b3m{>QnWvEk2x@j(BcoPZb%9FQ0wSMR-h zGjn-*gCK8RyLsc++mGMpX?kasjBr;2az)(;8BZT}Zo@&%r3yJ#D1Tf>MuIQxh^8gy zE3!}*7uS|DE9q=Ln-@Z)GoXBQ$Gb+k>P-+zDq_T}^5*Q4W6 z!81_{$K?RT0aw`g}LQ78*x%I`B+{*I$yC*MZ-(%Q<$&~d9 z{CFhe3S~yrOcPTcQMX2w4fKJ8uf}M8N%}cq0FAhcF}7s?Uzh~vMb-OH{`o>8g<%c| zDd>y$UOv5b@zxrdK?vgd^?PsAf@RPp8N)eA`n%pRdCqCq!9FZ0#|RY3XE&F3Dh7=C zAL6Lu=tl0t;_CYH>UxS&gHF)J7<6k7R~qzo_r9E*{`u|e@xk#Q-@g9q^z$wVCB_FW zz(2!K5T+Gn5ML3V3MzpN16hGvfRV`^qPPWhgDH{3(u4QgUhzFiZejD!vt04U)tPHEuhKBs8kS;0Z;s%hwCWZn&S9beb4wJU7?s=F+7k8rCLJHt z9jQ#{vX*=QVS90PW22y$wpK;G8TS!ZLZ{z7I6NHheS&qpzlZ4_6oXI4d!d2Yye=x5 zAqXT(Ax?&xswx;R;v_Zd@4^GeloafxTsE^g|7iaGqxY(iW${Le(BgH)u7_0%^G~TA zNUym416{fq5TxNluf*o}k^chwO75Zn`b6J?_k{INu6)4N4@uSZKg0EG~MyL9=+ z!?!PIF5Ss-xocOhUAea+IvBNVSWb)~OJo2L7f5h6rkXi8?MP)dI+lxX7pN2%SD zh|-26(9-(s+{(gACRNDnP+HWBh6jVA!(BY_>DT}I`}Fs}{`}Wpr+@$JkAMC9X!P}X z)Wzenw_w-K^ITD=%|)t%(uh2$hawX}UmV)2o}5yuOjyDwGNYhe0YG zmb?do1r&<&uWJ^Tx*d@;_5qk4ihlxsk_1!|0cqf+;2sOqzwk%_ctVJn-}4ZR<81qlZJKl~T<|DQ<)ASwPJ z0H}aC0T(Vmdj0y&<;MjvedW@%8?#x_7@U6XKv?!5c_D}tA^#k-+hL4!CqrzkZkH&f z{C;6O%hoj6F&UW?wbX~rwaxq*f?=E#)CX;ByLhmBe0Xv?JUYNs`|0t?$?1Rp*T4V! zXz%;CT?oS-JQ0NFaFGZPgHMD23c!FsF)b2|s(BFjK(;=@djJgh z<)8RX(h-w+keg3l+`e+Zz;0f-diCZ4z~#YTf9|TZ96)6U{%e|&p49XRO$!4I+uJ~@ zh2nO4ornv!C0@~?k=`*wQL z8}<7Q5aUjSDId#2K3o?P1jSZVOb%k2i^BB^7#H{315;H5T~aaIqzc8&o!rNwTF4Z6 zu*_1fh@m$LZWMw2UxCTe==ii$h1H78HugP+Ul1e2@JfLF3e4M&*`PK?1oDcrzUqi0IfITKjqS%t<7+yf=Ry8ia zy6`bmA`4_TR}efO(Ktp@SZ;Y?{bTxLDnlU0T*da^9q)ZP?F|N_6V!j4fUl?f2Z(Q- z>>nQt7>5>UwK*?uw#XN3&F}x{R z_xb+y6#w10({w`{WeUSYvdYRLCAyC0w;aTM%4OBUK)D+^I$a4hB~uUx)-`NpLeWo~iu>aWiVu;HRVK92~*t{hzd1o=ScF>-(b2;6?662*Lp zRFOQ$Z-{2u(5&JHXgWLvYY+!{_&?1Tx@mt+;hQJ2!Fd`s<9u%JuKx8fB_X08c_hYUo@Ae*p4C7RJ$vWVVzm z3x(~auz+l0O+f^`!mX`stmbk#vaGvqJiv8EUp{|3Ir`(vx6{$l*Uv|vPzgUDd;<{v z{`F7%9>BPdo0A%W=V-W7ge{d=(O?`1SUOkA7jgw7_EBxIjFoDPvSyl8Y7@D!P`|;m7!kLfK<#_gZhL#~vjaqkjLw5FvY$pIYTRxuY)Sjd#9 zVp?1=aw)o?yD-}kao$|p_?X$waTfIA&JdT^eEQ?d@26i6PQM=GCKuGeac}q2pMRhJ z>kk0ogHL<-)r7w0o7D;~N)tGVmq6ZdJqoUFkjSi1ru+~}l31}F06Yb(V`C0D_|2P# zZ|AmF^W`VMexP6yl}XYt;d->*cqE{OZEBE5B{CytDs#FDBA?UWJ8@@ElrAh#|t7hj0%=7O7^3{QyY;<;(^EYA*V8|aPCgwRAOGtRx1as>`@jD0 zzrXzX??3)Pc|?x{KgZP_xJ*SRfrO!gnMjJZhmpxK5V`9(_6oqRE)bdR<&A85W9`Mv zix)57FKklpFHLOoAdUngg}UV-E8Mb*GN?`)_#bT_;uB;rm{$k@BK`*>1oaQ5N3!J; z_6OZN;eSxSVSywQ(U&IQP{PX#SFb(5B`8M!k8h3i7Nor70*zK!!Hr{3F<>mo7;O~T zonlcS{LSs8DhCc^?tm+-t#6UIsQ}}AiQMRV-J^ef`+WTMuRl*tkM}=)`TiYOe4PA= znbrYrhlu-q1k3O#;g2}50QfSdNF?~jm}Ipv^vi%@>v2=mvEeY_BeGeTPNl7dx38b9 zyuLoWx&3lt8WZ+3rpR;w@h7CzTUt>Kj}wIyx*6e~7autY zO#gD2)j-sRT7AEif#4+qeF{`&b1_vYO4-@9Co}IhK$Fzq)A84DfBnz@{Pp|S@8ACX z_TS^fFUK{FB!zsokitkzij!o_=s7h@Au;BFYlTQcFg!=W1cRz1@3~SHn3`6^Pln;J zw!x*}K74Y2dH%!mM`!=nvLTV1A|Z051Opf!vQr^UEO-q9C<2GjK?4^|7!(MzLf8OU ze-wT^HV7~{AohHs0U-;GVu(8cum|3f;-iUc*RI`NSlv{6pF(mYE8zB{q@y6foQ(em zXhIBCrZrs>m_lah^}^yu0uf9a@O5WtaVO6gpWS_OWqLNJ=@|Ox;4-(<|M%a2{(18G zkMDo~*RZ+YbKub-F_l7ATr49$WSK47@r*=B;YAg*(}*zHL37xEp{i)Ep^~|xgc}|U znUAYfsjx6}=gs?93-e3&Ui+4UH$(|CE93cbM^{}gYA$@$I`TSbcYr?#p(DNcBmagJ zVDkJR`x9rNe!&4wj6WzrlZh3cY>JB)=LqTXrJ3t9H*P<9UG!=el714pNit4nOL+cP zC&XkU7&(RUH#WPu`uh2!CHNGOf~5+zzVLQEL##f&cl*-q*%UgWp@+TEr=!3A{Qmo& z-~RsN`|0tpSFfts@?sjAMwXMyTWo<*8_6vtG_F)rkpF>ji~yn4-mi<8h*W$7S&NPB z&5fOf^>k`(ey#lGw@0gUz<}?NB33XxOkw;(MT>C2aV0`W8wdtGFm#@6owj8y%L*r#aLutAO zQ^6c%8|5G4-*9PpzDUxmx9>e(TF~-9VFIzT@qTuz{CeljgC|>?ne{9p@=6uM7rS4- zd^`Gr1MvMTX4hgH^8I#h3z}wnt*G#(K#8GcVrUw71{kKwlqDS=XALRo3I^;2%$h=H zmyn8?eY5cHMJiX`x%+B!V}41h`#}yf0-0~9C~zn`~x}IAK`a=hYVaI1uangy{YNx>({Q|ndNJ^OOM7CJpc~iR63{Q z48^dlB^rq<5h!4FbLr00xy4L6gFaCNB%fVg-(KWjY>417GE3zOlnh;_d(=nqJ32i1 zc6>1I;QAOozrMVkrv!Y7Dsp6;UEyJOW2RU&z$0;;mu6JpXsRW~VG0ljSOFo>^y2c; z^4v;+B$j74%G;uct7S4!o1w+v{A2zFIwuTRSoIkHNoJuj`U;C7gm{VU513oh|3Ljf z0Kob$;L?Zxh`~UDXaNXB;-3p8?)IgbThljh|F%%7crsi(8v{LHfB|lp!w@|rTT|f~ zFix||F9VCcdG_Je%JLc#nmooj7gs-S5g$n(mxEwDlrHB=oaztu$9rHrAVIr_-M*)j z*?ciwN~epttf z_)Qib2O;?`nFK=-IFDe+McBVLFJ8ZXeHs&R8#%}dxadbUQAVPgBAB=fq8)msg#4d? zsSIlA{lc}o_utNMzF(N1&6O8EY`$M!T@k9XDO-9nBS@0qt9rHG0vbBp8y|Q4npIH{ zo}+aIYUbwV`$Y*iE0rm91RC^D!zEKna%BxJ3^N8j%98-ReN zGP7P3t0u0e65+rU3Cy74mdB_QVS*IiH-i|4TBz2>tz# z!4L#L4=|Jj0P*nX|C1j`>gLqd>$h&)dGYGS`*rl3oo!n4sKaz`oK--}ICH)`fC#L^? z6am!##QnkcM+bxggcopWi6UpFu3f)%>%r^yukYS|`e7@VAr<_fI_BREq*tJSR|pAh5gKr)DqA_^fqz?woU||o_W#lJ9!z?j z*R|%)n5kR$-Wms80%$aV&N-noI>#@E^M#YYoI2;6&^e+rfCfl_6q96IvaKwOvTVsj zVvuC{&Q#6MnCETQKr8_iDH7+L_uXObwbvs5@%%T%;>UH=&%OqNIQ=3Z3Mqg*Pdrne zTUt`i_@lqKy(+)FPm2u$BC<{}JvR3c%E<;R2Lt@x$7k3M_SILFlvh{OlvdsEcMc^T zlGN7aNKH=lcu>7!Rby`mY+@wPuTJiu_Dt>^7#NC<&&LC1O0##|E-Gw~#Rm;_e0hlZ z*B~|3_}nBb-9wXbzE@5kEuj~Yj@ZLtD83n{Jg8^RL%5f^e8F%a4Cf2&<9G=AJ6w9s z98G>QF)P@rwA9c(RuUv*L294VZSpvuJpuKFFtsFygrSjQek>v$_Vn+DNPPLt$~ot3KY8%Ix2Ee!xeSfL-U)P6BENpMgxfi!EtJA zX=!6`b%5n>D2lYH2v#rvX8f_lI^901J-fSGJKTS2o-9s)K>dh-w{PBn4@>h48Ip3K zz?U!!^Gg|jHng<&yCjPvv4qML6I8fILo>TayL)TwL1nlAw57vJb5TK8ptiVx0=lGe zc+lsOo7*KbV+mTydgRhP+f8H?48IxgQ5Vi%oNldfYf>?eaJ0ws!H3ORjrX!^jM|o9 zI5s;z3=twTFo}TR%<$kK^8P8(f3vf0il&z{Ps%40-p+#mo1dRo zP*z@)SL{!iB_)-m6+C}ir^9CP#3?6Hd}Ez>bYNj~_W(A;43fKyD#r!}LM;WwU9O6} zyZHs#Wp(}muN3I)^2Jl#eYx#B@~wiEtga2nJZjn*7&~}=23uifAvQITo>t|f&tBT^ zRNl_EYYoDW zmS}(w04S=iuP!K6Qbs{hNpX2q-GlC4x2xYdu!!IRdzCwMC^KuPtfQ<>(Wqp`Mqpu> zU1jx(E4L&k=jQFZjn)Bsz|&)K#^m0TZ2h_Cz1z9BTAw@_PLD2|>eShb#|JBu6HD=f zAHEzu-rM~6^YzxkyNxsFNy9~SS5VrV-J&T*(v0&zHZ?WBG`2XX`I>6#O1qu*+Kx~> z4Y6v1x?)_38JfPfHZcJ83BC{=6NMx2-_a@>L~uRG)>OXaKgK_hZXcpW2>`(G4*dHX z`M$pN-1%!1oI03lFt?(up^WF(^NY(Ws_wV7bUOn3D_L1y^- zBuzxbF-S)OtX<8lu5brMD;8(_jQt;E9#)cKM^TW!R~J|uLH~$Rh|nSykI(E*)IT>U zfxy3E{|P9Z_aQRio$TC_ruyP4gXb@+uBooAYwh;eY=Tm1y9 zfx)rqSi++x+iD%1<+)(!Ie86@9y8!JD1|+R>cGR}p^m!H^X09@h2zC&cox|TkkZM; z#3Yd5DFh9a9G~qSY%EB@*u+>UJTbGlv$4a{(sg~ELKnsfiU? zd+++Wi2@Wt#6M01Ng=PQv7xkDPxodLxz7~)mzul- zGb5(g=eNN~jG1cK)9GHI#u} z#r#`*d{&+W3-0#q8@D(Pz`^1L`M%Wz&1>qo){Qeg#xm&wg2ShY$yhN z%jV0>=-9&a!xwungB~3(goffnv*Y0F^UL#_D@Xt$f4MRz)}3R+BQd`v(QvPAOi=FDYgM;C|=vKKoJA zhzKz!8Ug88ef;F%-ovdY&mqU}EY3}$l=+a2fD?8dud!fMAXqDlxh$UCJN0ub>!aP# zriOl1?r4*OwT(_w_BmZa-OK<>Bv6I)A9n#cAq1ed zb~g5i|DyR9q#qI?Y4E!Ix#q#;6xG$0wnYZ5cPM|Vs_WXIvbg)LG1_RR9*}^ikv|e5 z8kkwok8adHpIaOn z7NGRrlgGz^k?UudM=*1imJha;x6Usf31;*Lf(Ii5ldwU;R_FcO1=<3Nd-jpW7DuGL zvB_$!E_JvK*=r9-W^8VE4s>8-fZB0b6wK_L%ngVYNui4c=adYQK9t!{) z(-SKPPtKn`Ic2MKcAjL7pvU&!$>s4n2sWAr0{{V;L?#vN?6=%@%1%0yVDIrI)@N{FK!1p$dJ?kv%G%yEvbti~7tMOcJ@f&XfGofx*cTc$ z95WIBZo+sFQ-9I@T)zmwKZ>Ee(%J`g-O+S!PHAZ+`hOigF0a$!POUKdhB`^x#{_y0 z4jnpnnL)9#IhL4+4ll&Q6lGog;drxD)FEkP@s))%yzRl^wG1f*h>MdR2XQ zTW3YjgSNhwR)^&7>TK+@^amDMe?dVNk=3zjBsihiPNk-(g5hYwg@ONiUH&ov-QU?; zMa53w-*>Zby?2A=ho^`Ac;_a6!YmLzU|wl+>;0}svWw@3|6bqL@Af*ajO5J(FHGe@xB-5(rT8sFHM9ZXG3UoT5+9B!?yg-sm{uFn)J-T`;R|( z{(LvlTi8+8*j4Z7=(6=VJl<}HOAaSh@9_Kr@^8buumSL|g|(esR2E@@F#Tg>4FjG_ zffE8%D;%Eneblq*e~5k@d~!bXUw$oa0_6`9I2Cox4c17aDZjL=qPo7htHbZ?spN8k<=^SWKdJxX63o9HVrY zR1DP|-DVMLdS(z&3yPA%%kRH@_TuI9i;L$^_R+IA{Q$v(BScn~LDkVhN=0;!4VwQa z&p!F=(-pI>uDO(q97@ykToI@r6w$#MGP@+erRjlHz_mP%PA=g*|4Rle628c9wm}8TGYwKvnn8k0!d~ zLnuFS^%xnR9c)vJZ>|o+&FJhFx~6;A8afzRR#H<_)DsO= z=afKz1pjF5=<0Z28AODQ#i^~W`RTERgGVSStxO?Q$Cm%X)YKZ*Em61J+f!Wc*3*+Q zb*RUr65ZH5B;D>D9PP4^CE)(p_!8?6K(OHaP+qp?)>aRN|JBvsefaUqmmfUg`7dD# z?r$Kdhn%URCM88ywbmz>aH|5l5OX@JyHZ}G{k;|_LSY5^Nql^CM000g|775v4S<)g zJlx+#evDE59=DYVAnFJ3_4oD=4L?5J2fEo7^$$UhEb+0d4}*4Md~yGn9s_nadyZ? z@4?08!8Ry=#0;50x*nI$mHy=Ub|QT^SLtl*tF;9aDfCI)$=R`Rz>I5|p_EmP(Td=H zkw#jJN8Z~U9iD!;&+m5)(wbNZ$1n^@tlfi?1L0D(kN*>NC&B!p<`ob)7hlld1R9c4 zR9#tYiAL`il$VxO);2%r>g@08a}7ZK+2THJg8!|Ef5!GA1qb_<4_7B9*N^ains*Hv z<(8(di7{`|))C0eENqfQW@7yA>ZSN)InQ1*UjMnK7j+ zJT`$c9D>u#%b0a-Zw?PluOczAv(BO@iB?2faDNO&PT3meJ&5}M)=k(Rpy1T}G(W(> z*HGBKdqtIHC6+|Atgx~S8K8!i&R$!8uRkT0cM%WSSe_Uc_kVW>y3YWVO$Z;eTSr@m z`->h+S5>mdzBDrGH(ET#@(k7I_8}lVmFU6V()40#X6O9r2QOIq*j<^3j*pG39$!8^ zffD%m0*chti}Rz)r#nX+ncc;~Ojt7q;noIZx9#e)k4`7H=kn`n8f=!31IhHJMpdRz zf*-|X&fy!Kr52CJ@kSe;otbC1bZD3wZCltet&8C&8)Ez(uxQw2?Q$FSMA832eiGOx z%-?JHn@T`HVa$K4Yf9{iL{(`;B>+f$OIN?$(jQE%pd7M|D+4YrD<{0#t>u}~L9{Q| zk>}euJ;ADCt~W=WOhvY)Mk9VpZ)|mj{|lIbFe}+PLdaw!MqM@Wv>=o3)HjU5)J(@KX=^FvD6Se>0*+d4eh;Q2>} zA$W-WIv8HZ=OSjBTF@yT2{O`X$U>sM0$-4-faZj!zbbcCVg&{PE|Xe)M>M ze+d!!>FM1^=T{$m`2Mr=Cu{?qA^430-U%2DEP#}$M?;FoBTJ#rU%oh4oU}b~*dJJ} zie@S6^!oy-XzFOm<*>)&?)c;s(l9Y75JMA)3vBLhpsqx3GVU5*3r{bEFIw1z#~m7v3Lw_pVFm& z{NekL*5_SjLrH&&&k^Wo@kyEK5no^p@hB-33uKn(riY;&Gmd9WxwLh(K0LL?jxBG0 zg~30}&#ete+_(%P8oq~gxcL4zZV>+RMAMG~7Ku_I@(#DK!;#rb`8n@eWAnz#ra@sGlR_W_(Edb>K`6mz|;i7 z#P%bUik_XY;CpcK(T{%i^MCyO`SI2oyzuqOiT%sNi_iY<<41)P=T^$ks=zVxv9zTZ$7}WB*5#UfD2!;8lKjqCUs;nrl zt!iv->+Z9;)d5&#R1Tz+>8Wj`*LRR32A;)?5Z0P7BDy$#^k^HbaX77eW|eur1KE@X zP99#LC+ElKXL~E7sqKsRKmEsl`up!cMzCpi{c>l1bp7SU!Lv_4`oYUjUOaiqDZvBm zV3UA7nTeW;VQQ-1-F66f=E=r%PukkhP~7H?3Prk*nN|Yx>mb4E;JlCqWE3gf|KPtN zezlw)Un9>m`=I$JAyBzd4GVLvN00XRuni^tXNl*({^Ftv=KEg*KtzDNs+uY_>BuJf zSAzeyb#-;)fiuMB1N?z)mcXVkUqMBCVNQ(f=aA)@J-m3#{Xf}5A!=z%?suAMOmZX! zhY(<0-p0uE{P5y%e{NKtK01H?;**z1+D{KI?>{CHibKqQ!g1tp zXsfsP=F`)Vt`FH!UEu<(QV@e!Zl9e#<^WuPGjRV!!vo<%*3mM$S*A5{Ym$ z#0?k(S>D7Hf}uI8ILq^pA80cWK1KTW@PxHf%vJb$0{^-Ozr@pvP{;uQ2_z$A=N44q zeUh-;DKFzcH4i#^`ud%24H5`!%593kxyg0RchIn5O>tyq=HcSZ5?X|3Cv373Y?lW+ z+nU>B-l)YGMh6Tk{?Wzx(^9nB)ghm9tHGE{m_l#>|G&lcgPF|iLkfOMVXD53O)Mr44hT^vPcAQnZ_F;wFCPB-2EctJ z3|zkow1D`dthTz|pX|6*Qc_F;zyQ=?vALB2@%2Fzw^`<2<-G4AL@+vvpd&nZ>cLa6 zi}iyIs;@;Q(Aw^cL|h7RWO@!Mw##SF&ato9a2MUa*B*@e{H}(-%Ce3vC&Ldv`S?>d z;+|iezxeR|GgiX)na+aPEiDX0Rml?$IvtMs8(DYWV@{b>Xz_-1!z-&w$V4P+fzAH) zxPsi+h}iuOnHpGdVsv7Bc71;~Im>b1gQd2GI1+*H_+al5yS7grUtC9zVHyc8P=3&f*T@r8{f0gJC&<0=`@7ExUcMATKwku)3ws z!O^5H4ZkEt#NhUhb} z+2Z?C_KC|c@Gr_>e(>nL4ahGA_sg4=cw1I!QBh@iWld|Z%jxL#58<1NVJ(o_{N&of z+37y~4}{2O88J;S9-Uy~cy_eAze80xGNSjJ>yr`N08&Mn@s0iCkM=fpp6=|=&5b}K zA0HlDUk`FnEwj<1s}GK!K3|xcxw_b92*PkeXaup&H#rga1OtlC>+Xh|z#%OxEVuOa zTWwOXpG9jqo*G6@W@R?$W8)s-4_((}DWIEim_W138{?@tvh~rmLDcCXJBMP?mk?&t#QC3+;|I=^lcMLs5zzc)py{-AN zb%Mz*j)S89pT~K60Xy#tD1FC3t9Wf=Z?*s>LmC}M4JEm?j796hHfDixNFPout(W|Ma z*uo_L-(=h;?mW4V9{741E{XxbkiyE+W<6GyRajhFTvAT`W9hZ`yN1>g>p{5_6V|bZ zCqycQ8&R>vVR{9im)*uwOx&5Svt+e|#x2wxH%!oEiuIv+6K2ZlMl`8O@uA_li7|I- z#?m0`{^^ya{nPd3qn9raHV;>U#o*Mfi&^#bsIH@>#Db4h#fQned$+8pwzam!-q+q% zU(3TL*|Wz^a4Oi1I72*Q27Ml<&F)uC_Qg=#MsJj4#rJ2=;+*p9;_~s?+0(15tBdEf zSa^$F*FQIJ!GGcw@YTux;?F1v?%pk~DsKrT?q}y0mK2v&R=4!@^pgR>zhV8-_OH&2 zuj9RgFn<7a%5nQ!5l(rb#8Kl zZN8ngIhyX_@mc1eo0OI37g$z{u{g?pGvgDBD|M~vU_6nSTpCSV<71rCkZ)*gAS$OP z%r3vPvq_GH!@E;MOIT7P3h~3|m*xxc;7+l4JN?23kRGM}NP|!$vTY;&U4#@%im7`X3Cn=_yX3oRasR zUOs;R>e&^o>Lc<$NB`z~6upA|O&`Fk5d0^=@Ovfq%X?$-@>}_ZrKM%~A9ZwhwY542 zw-2tj_?drCZs5?mvx4NT(DqoHo!#UmUtrLFgrFT|67v=zcO|(JsJIL*Z%qb!Ty7=d zbGO(A`@HcfsoJ9TSGMSq!8Y3%7TE*LE@4NLTQ*ncp@z++k_kmIdt3Xv>vFQ{?lic1 zJKHQayB2INuX@mL_et$-y`C0}KjLCK8&Ct1)oSf#70jdIfQvmK4)qU_y4%`2J~%l( zIer4H{P+qp<>$|zJ?1Eg`~O|VD^kCR`=SFBlK|ep-Mp%DOFUkFr?{e`tXvo%cXf8P zd4~jqvb`tzzw!0MNBg^LOTyV~5|n>_^Yrrk{PN-i1L*aKJFFU@xw*VC-L0r0n7m8z zz8a^`Z|SLS>5O^ZcD2T4Y3pq$wMj;BY(YlxGJwv(Qf7`-O?FilXNIuU7}Ql~Z+mld z*_|7GHC>J#x1-Nx3CQ*b&260lk8HEq+}5rKy*`)2Bgt;3)!NtF+h_60krXZP!%U1N zki+fGqetwST%4Z6xE5yekDok2aOU{PXp7JX~t8tFyQF`SP1QX+yH>eSP-6n)}5KzF4a=>O(N5*V;NgznU3YLQ)7< z2?lv1$(ZbF?`Y^K%)a62^@jbNa9_~t>+kPt?RTi2?#}N1fYR6Rb$bGmPqO#*b$0dk zSR}*1Vq|_JZlE(Q{PAc@zT31v!%3Yzyr=A%QK^dh=ep?^Y417{vi(Kza~%u|DywaA zvnaQ$w738t*p}|zeo7B^-T~C90k>wrKThc=8Dax=EN#xu?ehWwU3PX%{$uTc)mwx&aFj)NN#s8f_sIJq1ql4(Iveso-7T!Dam7PL zIfVtqMP=ppAK-`C*XvHNiu2Ft1pmhkqzq`T!2d?ZSHai!z^wtmE=~@JWo*bV0lTd& zuST7OCL=Q+mYd3o3)))pbMIu`t!pmFTe|Y@?f357>&PjoXlUqZdr;A@>%ORGY;AjK zVvPOb5msN6-qP~=f~@Z~pRPDOKEJGbCCzE;wo5*TtF5zF^?MYsL8n*pd0k$QSJjY8 zQ&7(yo?6{Vg(g(govH#io&)?5q<*mm zdl&rE6*F>kiVE0&s;X=1?6q2ZrGeEwc<5Ujd(1I*Pfw5cv78)-ri&lcj@3Hl^dIy$vXx(@A_czBu?oN-f`9|3eZMW5h z`8{?TFS!7xuxkb8#9$A?(Zal6VO1%$FgF%!&AG*1b!%HOEA{f=aAsi<%OG~Q`(3Iv zlMI-;WV1TBBBI{Iyr-PX%@ zR}|K3+%Da3_joM6fIr}J@gf8*)aP@1C9iCx=l3t4Jbm`$>Iw^OF=Kf~B_Q&jAb*NG zFHXLge~NmL5`bzjzv8|(s`32`i;7Dtuldj2W!^y{D!3KlfEwXa5H8+mvYciRNgp@YkKDWgAlTR*Ol8sK#>5+Xtzt88eN;oShy}n@3Z>oOX zXZHh?xD~r3dE6d%zwEaAJYK6yl6<^|U@$hedh+4}M0XHeA^~2~|5N|mg#0F+oh1N} zZ-U|V*XPf33My)SF*Qfr{-TnK>ZaCCUbZ)lfWS86JSI1gc}`Dp|HadBoJ>Evw1cV< zQ5D;IB*Ipfh2<3T70jo4^^nhr4)grl%&6oG=vq=3h7Pi#d3-R*s?+2c<=E+u}*X+uM0W@3=ZXy?J_ejO6MJB;>jEt@$~8y03_U z#|*`V)eM_LSiQ_G&&`ee0?~L3?_YF|5NMcL#x;I-{gA{$O$se? zd17cZnHi6wC1o$o&!hFL_`&Btxir*3SdMA2fEm(b5dZ+ylzgh>_xsd9$j`@ixz#|x z;}1xP0VuNHM!a-;JiQK|Pq8{ZYA~pIrRc)Riw_yJQU{+>|J=G3{1P)i(Ewd%L-A|k ze?fJ<6p>hl7cZc^zNxzp1jIeC3^VZ&X%GB=^W@}g4<7&&x@YhMnC1IF6*69&4#78_ z$7~&KQW~8Vs~m~A_4#r5=QB~H!tlWyWpP1gTM>VRhr+`BfS3Ak@8o!Mev^oTp-dPl z2gQ27B$uV+yqTYU_R~v$P~po5xc*w$uYq((PA6NFs@o9&BnSjK_)6IDIlW%HTeA9P z7xMcQMZVsCmqYUSY!06!1xb?e^~)D@fKLvtpI<;;VgSzc`#K5|5a7dPfqyjwB0gB* zc|}Df<@GHcy}dnFKl-N(a$sgIk58iIbhra8e;_jf*=m02;F19*&krcRvw7`TCp6a< zK*};!BNB8ccqj8y8HCFRfy{8ITAD_ZZk2f&nqVgg;A|m;Dn@Gy1Cg+vNHF$lDnX3< z*4>6rfAphYJ`Q3O%$BTz*rpk#-;outflw^01cH8l(2NG9pyo6cNpS~VcE7}5w7W@% z_7J>HIq3Jg#PcJ_h9AxB(c|Zj#rGG4UvfVIkg^9d6bLAFFoz+pq^eemdhVbEQCv`5 zUEki-(b3oK&ImKg;{))&;Ymn}XS=w0LHlAAbYY1N|7Ta{%zut{V0W&fz>TQ${Os)1 z_^QtmF`b?f{OzaF1)83poF5mi2g@kd?C!#iI7GtylxYeR#a%)`+>g>FCJLSRi*xT~ z-7FgT^$&mg%RO0-uv#c{^@E|P?3cA5Ij=Wq7%|D__L+#m7zVdo51Xd$6@nN5Cr&vK zkR;}VE|*_MD?oC%q=1i_K^>c(yxxE0bKhbH#^6Ih!N7qcBj5s4Qq!i!9CwO}NLD4> z|BkNC?heP`!xgw3M|=CoTW#^El==ga!mAtoTp8(WY)E*_mdVV1TbvTxk3 z{l(w?^yk0OQ+#+?lN6Qbk^^|77(v+|P}C^uLqt_c4Tn8WryMf8KH2TFaVB^{GzN;- zC)xT`#YI%?^g7&L&C8m)-KWT+{)O`VUDNOFH`AJ}^&rlRofms%@|5oW!4bNP!O z{pxpzEioCLk#Gn_QN=WQcr!#@iNK~m;EPBev}Z%AQw#ESC0z#yvZKYT>ypDkW9T&G z{$MDm29V@{OQ17Pjf7nu`hN;wvGOQ7Kn?+IfQSVA$So>;pu~G`=a!X_{wfhbZSU@C zccjse-seN@tj)~rF{#*Q{15wU`4CH&M;DYBmjJBrtI-9TL2&~$=cTm8-cy>D)#UNC zNh8Sjj7=>IEtKaUz-4><;=>O=Ven5;_5%LH$sv^gm9=q0HpygtEd@C_S+~B|{%`;A z^IyDj)(_yTpdhVf##I);l$aWnP4p!wuUWMhZ9L!fx*PA?xnhw}9UW?qk%~hGd@Uwf9tFNPgqy zfB)>~KmM2B{!3Y}E+>;AQ-KeoDrQIsEe8BNzoL0f4Gxsgjs~&nQK>MHqGLcHNuZ&$ zM1i0g@Bk0EgK^U|eKwzgNUMr=L`d)-zbkRZek5haPPM{wsk1T2%4ccu%U(i}| zht9gjXK@b!mX7oP-#a;b|JlpWKmGXgPk#96_dh&m>VrDkzPMIn87-(8a=`ka^xmBt zH~!n&7ytC@e|bIezwC)XGHnJl%r#7t^>0IQsXf(wcEMZdq@oEB+KNM!qT(btXfLk_EW)k0DARvH#;_iz)NcBr2z_BPQ@6jVow?+HM z00alXwvM)@{v?`b*zoKfEsf0`onIdBqjfjT2omwejq}T=@4vjdU?>E+2EiT3re?oS zA_==1a|E-pv8~pi>K|u=aBc1A*;Dl2UNG`{`ROx;o{x@>SHTU~VKm$}KPu|&)yOg2 z{44YK|MbgW|LZ?i`kI zls;KeG>sD=sp9BF0z{CYN7FRkna?ZmFI2x!y%zU?rVlUpYYsR;ptz!6iPmKygH#Lv zivDL`Z)=?`x=fX}cW}73G_$ySa(R02P#C~W&hGEfWr@=I#nZD>L3D#|!Cb1#?^g|~ zuC@XJF8?o#6eCzZ&mtncc=+`FXJ=2IJv+R7|H&1U1a_&Q#4e=L;UFMMz}8b=bT8-D z|JnBLAAkO&?SW?AcQwy2VFtjMq?;9bz+c1L)lQM^wps0lXUZ26> zh_EMd?^Wt0c5q}&>J(Ge!d^|Gfq+s={u5O{aNl?u>#r)jcAtd56f_GZRg_Z!_U5di5)aH$PA)&zm;-} zY%PaOck%zGRit1a?a?DckHWr~@_!Lkw&9c<=)Ygv?&?kkF`D^31 z|NP6}eDTGr&fL7_n2MwTG;ai@W%ST6I?y!52nJ=kL4ZYM$2C3RmZ*+{&_%quFKj}a z=K=&t4?Y5AC=v#O*UeZ=CR`|x3Pk=R+!F&t1`t$WdO$&iL=lTgQ#f9gU0hVm000M| zj_#h021gQ65e_QUyvfzw)3c*P_F&LhUESYW-h1}+a4i{hIRZYP7{faKo~RH-3UC7K zb)0`%YfeFSO}~o4&k}oyyAK(IU{t%fg$f4pqM5KNb(dD!L9zR~>g&q>rs?ND{@HK7 z`1K#wa!PV6Ot&H+=|(WDxha6rSkwbPg&tq_o2E3N-V-;z~y}UVJ;B&tFhjh5&YF ze@jDOf~{Hxhx^;esWVYJBVP@${I|yD-u7g$-$GBy@stBzx7Y7g6r8{iC|6Z$%{}p= zsWrI<1uX$RJ+-j9vADcF!>;B6yNL^kTOsP&S65tWby;0@Yinc8-E*^?=6=n{Ef$Ur$EmAT$w0 zBNg(-%m@-31~w{DC8Fc0!TE>(DI)%NMUa61MK3Jyz@l;~8qFjA7f=F}RIvbI>1^st z!Y7AAw72tca^;wT>fXlGaC&fd<8U_S=w%_#i{u+=NEbzhW*AyT_v7E7^*58r2>`rn z4%xj*`Zn;%DW--KV=P9^PqI7)blFf@UefFHxtzBC*3RPp8WAB}lQ^71N>A(eH-N0*@aC3-~Co!6uCw+dIl2t8Fo zT!LgM5exBYg5Tla)cfMga{vSZjz1wD-o9H+e!T@5|ShiLfj zvOu;vwhW_%VGRNfBg0YM86ev#e)o6vh7i5?M?*S&sYBPzsMKGMykd^1FE|G`@0GS# zQH34F#&0C9i}eoGW9w?fZ>yp;;C8w^_8xor|MYzOyMOuDfBoHCrLeHJDuzK08PcXlK!+)LBHV;f!0+)z6mX}Y7u69xi8DbooJyG#kr6F5 zq?l1eN4Wp|eh7d-4A;-ipNLvmeE)m3D7Y7L{sEw9fa_X2d)piP5(wuqPd~wha_Q*u z>JmxVk+7wYSYi>K8O0X2AIe^st@ap#kZK@e5^UYp&VuaQC56Z>-n_+@?Va4hy7nH$ z=T~)Kw_Px6TI;AX%PSh3ewS`{X_4apS@Y)WFaG5Zzk4^DTb$oindOc8#6!~n7#bx2 z{@~C+OcM>vpkf3zF?5O5T7YaAjEMw8jLB#j(8$wO3~zS(ic@& zni2SiXnC$LfM9}vhV$%{f-La%B}OA9cfdaiiuj$?H+48VT5K6qW%hRu_IGE;77mXe zpFEoM+I>FBFZcOW96zN{2z=6Hre_-AR4ASbL4lwWb9>Z=dpS;9TPZ=7dvNPcesLl8 zlA^8d?`~_TWXf0x(YnzZl)Ns4fC~Sr;AdaI`{I}X{${nhqNt#;C`$_wk78OpE>pT0 z@O)x%2o?rqKCnL=K_jSpO*j|S1YSNx45Zu}i~tyG6#q$9yX=u9H$5jGTG+q@HQubo*N-J5VFmvxdNiBjx0KZ5jB2khL}e9_A*Zw!WVNuY zxUh^9R#aYE#g=Jvhm|T-RsEGWZan?-t9QTq$yXPZ56TNGTXJ(kvX|eq;P+9(Mbc`V z*Q)qsDJ;2-STt_vepv}bVqw03&Tqk|>XMh#AMipR_hTazP9WX{s)Rz!5C&b6oCz9y ze-Zoven9T zSyYC?7#bsW&0SU~mLd-3{P!pS_2%`vfBV%@ab0IwUPDV(d5k<3L1sGwrZ0f~uqu0f z7;Q%Ue0vpn%uvAa(-%d9rs0>vqE`00HBIu1Xe>(Kh@m4sf~ZehTzEHE-2URSs><5do~|}4@o#&Rf%4AM$m-*vmd?H&FcmKc z4u>Aqj~=0}Co+ko={KTLZ738c|Hq6S*S81n-_9*8D#$M>sjh1l&u>Yr?riTLJ$iJoI5z6HS=&86 zr#Sjj06bFSBg9Qj#|J4G!?iCdY=N-GFmR3_@sOB}kke)fNO}M3=FRuA^2#t6&3-Sd zu&SxO7gY<3#b&eHExmo+9aVGx&)awJzIy$i{_nNfy7Kc{a`VZh&>D1{)@f{6ErjR^ z1yl(${WDQai2F%B7RmG?xEE7Qe;`hGK;-ctN$ZcYBuFI|OQ?o{(R2)__DDw6{R;PA z6acrx&L?AEu>*0FN)R4k)}2ao=Xkgw3mwdSCLj#J0f5?j6QGrQhmYX>XdRN&-|q%r zaxj51R2EW91B4w#kKR^*tGeDl@2cW>Ul{=Y}>Iql84IS;a1h-4<}!lV_MA_i;q5V=n` zIMm?~AHblbQ!z^N*&-Ck(SR?=-xcWT^~!z?>s1**K}3K!i{$Y^J(d--)|x9{D$TUT4pO23%E-_2*h zij=Dj=E7J?{?#{My?OKY-P=DM6)AnCIl1+@J}RonAc{9yD5>BIqQ?!BKSCkR2IfPM3 z-(o=qE)tPHe#_;5%a5;qULjeF@7C1SD1IGD^}#V!O=VP+FL@2oXe2;k9}IKVLq-(! zVNHojx>pa!^l-v0iDJ~<7SaS@7}i9nOeakfU0p7}FD%2W^%4I8yoi6I`{mw~`icL7 z0GFLz6Ixy~?xBN?{y7SO_3Zz3KCld|?;Pz71l!sqZ!b)6d4OsQN!|9G?lK-;5}`Fjnn@i{z1#j*JlU-MknAeA_2AP zt%~T%ikx%vE=t&BDbV2N)|Lia9RD+^PlkWc)$eowwfSOE$}PpmNz_A{KODh-MUSK+ z2~!Is;*qE!Bb^7;%aY zITDlHBH|znPks^*q?7i}SKrn9-i;f7)BevF=$*5Z^yp%_Zrfo%i4C_dTB#(>tBwHJL~=Kn%$sIWf>oQh6vU$sv{47*z|4U9kvlEj2K5lL}ii zeOd@85br!)^#Xv=_Mnay17f3jA_QE=e;P6{aLQn=00TfG07>xH?efs2XB9`Iv zOWB5RY3Zo#Pp`^Of57i>A#DlzO1zPD!zZf&MlvDAkky3vH_@qLi5-ghLusFZWfM|W zoIwgZr)=6i-e7x=yNDdv_SL`s?u##e`|rR1!>g}@U#VPl53L)hSHwtbN+M>2$um)dqQ_+3;Z%dpmiw)4jfeLD_UPndofqE6 zSPT%HmmgCljM1q_^pu_&HcXY|3H~F%Pf`AhnGalGe)%2zpLMq;x-j2$GrNERU;zW* z+FB6s=H7v5pKS3lSniR)lml)zx(--|9?O9A@(Du(;>`1;&MoGr0{#e2`3_ue2O&fnpD3nMc*q4Gy!v2RKyzsny_wOE?Us3dq)DR{hw57UUxYUS3*rzp1UQ zwa+8<5s4K5H^$IGhsn_j;rbYdsOyZFz|j<-QA+1sh%HSiJhW~%Y_zWF^_2sL}7x8tw~MwJV*sF36uc|Sd#VvL?ozE zjKl!?iWJPmf1=+_Ho!#pNAW94VLm@3Nb&p|vsQv(PA)01w5;lWb4z<`cfe`q3ihdL zNTu`uRyMfqk>o9Yn_QZo z^_y3(UVTZTd&7x;{q8S+z!G<)rB|6e`N`LR`SZIk`Kzx!`Qz)izh}=Yq*1qVv7tbj zRPG@y!5B{s4Obm#`d=Pe&|hf(L;*w}eCy_&j-j3D?pt>Y$bU4z6*VBB?X7(R+l=|0F^zM@ zOo1Q^3nMv*>6s%XvyFxgKr%&oCNoK~xa>jNHIvkR%&PhHqH*`hPPfOf2D{^j@7?&P zcRaf|0dL=Y{ipvp(3$RcsY3(SQcHjI@E5PX{qxsv{_y3SKm8!Ani`(+6mme94F5FZ zSlFM`C47(fCE5ZqS^qMKPw!@Dc?Y@C6<13;=9o7!4h><(=Byf|S3MQMsNj=VF1 zqnz>~6Y#?rNC$cJkd{j5=+Nt?8|W_-Ch>Cv>5;(&comY(9`BZHtW;+L-RUtR$k zsMp}EK*N}Y2_nSpris0E2ghHy0f`B4T~kxrgP>DV$YDVyjxtjQ`f%MJMsPpD22xaw z0(_~_OpG`kO-GVO*hK+kMEpv?8c?BNDV$D1v%_av?SZz5zsy{H^&elpeNE*1*$Nt% zuok-9gND;%t?G<<+8P?`?p5@uZ{NJ4VG$x2Mwr@XkZWvU3z_0y6+?|yL;HZKNCQaHe^khhrlLU|uQgmS7bfhU0VZ(?-{JZY{L=h}bfWSX)2qq|9 z;oS!V8>=>G(7Bj_vi(9;2kd(TY}{STL+d2D;Z z#vB;<2L!adth%YWxerLetx@fpfmnnQY&=24Nph)DS`^vcXiPEU9Ic3)MwB_`_s1Co zLH6^g(I^ZRZa|Q@>F~qa>Wyig+u#1jt5^T^zkfW~j((A*nEf68V0(SP+tUQr*0}%e zSFgYR=9{nI{^tcyB5)1=vS=ccma#XChdC?;M$gnSAwB{nXcAAfD4YnmFEFFRV2~lr z)f0eaVz7dq-{T{gFD_}bdN&Z>5APgiF^l{)|7FRx#}BL}{I z^Or3XCa3`+bTGr7cMy?F3ZI}6OAbUyEwPj^LH4J^;H?y6Y{4+>Fhe-9#H-xYKt$pQ znkbytNZ3y44qBqiHcm=vK+HeHT#CcbLsJ6qGB^;T4ZNAvIeoGd%)NsMeD1wG1|SX1 z9jzS>kHe#@5lnu8qfB!w5euZ^gJS72#h{Z~TNJ3Hl-Ojws7}gGOcK-m!W@}-D>y7I zf(F2EcKd)r{_f8|t-qO9(c06{;`cYU`MQg}aodBAAiS%(UwuOXB)Wh%e;Np-hf|`7 z%%sAmiuL9<7FN0V=m;3EPL;CQOd8bzsrC2O4jIS^7^{k`Dk zV0F4gsYcMC{)GTUu_FpT>R%BDn1vGmZf3Vl9IiNSA&HL|Ecp*?wzaj%j-8)3ZnnEZ zNo*~G+;Mi$s6u@j613bol>I{KpevmW83P{v(m*D|K*TR5^3))*OOd2l$Zv6n;UHKo zi~sw@U*{KP)l?T%ceJ+4wN-}mL8~k1lOGgy|LR-n9}1$czW#SScM>4~!qKQRu`wEj}L5 z(y7Q0MFvNH07MP#`7rYwv52Wfja15rF%nUrp<&nxc{w06o7KI2!9IJ)?v;N3N!LG4 z-NtOAxV5>qyiMt8>hi)~tjQ~}{_gAVO29YY{DWe~<2X!$rHScPf)pN$7-2Svk`c;% zf4Ye=-b0HKJv{07j(je;6~AirGLJE|exI!)ZgX`#`{t{!-}tc}DQ~K( z_R4K7y}^Lh)mD;QZ2A2=(HDRL{`uG&31_er863h{iMcQMGC?eaMm#kv*(Mfdz8lh# zXyk?bd~lF9&|cFpN}xqh@*3#p#6;AQ1djYgDF&EFagX? zOh|cwJy11=vr9GZ_2^a`g|f>XphF4y`aF#hziOHL>ebt?f75U;ue`X@<*94w^Y>eQ zmfF0$vYy|4O*_E(fAyy+Xn)CwiK%lWis*GR&VA5T{uMAqOd^cV&?7vE>Vc11T%j~1 z2gSo_!&l@thv@W)PW&Cg6hjDy#T8&%AQsN3J}LqFU!L^4XQ%yv3nwmsXoPrv&*I)f zR~EjI1)=~H49J#Fx24B#1!y(FAtfu5rKFsUi1!;wGEhd1-7w-lH!vt>P-Z$f#OiN= zsboNP_yUqc02A;}{lL=x;Dc}=Wb^*`+t+XZ^ieU6TQ!aMS+Q-id)=LNckea2fA&YN zKYh{LuM$4$J!(pXeYjjn6pm6U1|exKJzZxALIh;Ngb@??LMX)?8G<=jsMgXHq8Ai@ zXa>|lHtBS?wc8)kI2)l<7=#@B|GPU+{1Yy41VNtv`lnm>T=P34l{e8s&My!ZUfIqvPdF12+*zaPAK`P`C}0nU&4T14c9s;dyOc|N17HDFNh+%r!xpT z4;B~+`D1bL9|9jYfGBvaeM&Z99>$rt`CeXdWpB9Z)*a$szL)^R0PL!<^z}4aodJq| z91p1g5~HEvq%s7PETIHq;UU3W7Bz}cAy1`Z=~32C(jmqXbf%ieK>}nP1sz70eH}JU zGi<>>kl70EcwA-`NYl=&}fy(5O}1VLM)zo)MIazVi_cfnTS&) zfPYZ-!bqS8rUVc>0KAOr?&oG+VEuTe<(4o4DJaY@C@HIN?W}9+Z)+>CIMrx`bOsyS z9Ex%jhe&*}A?vUn8;*jy#A9RWh%1CBcp|Lp;k3-vfc&Z(E=^`G=TDXaB`xhPU|Sxa|G^!M;L4#3vhsB3&kVa924uAhz!3`(9Jnv@WUi35|dd$j)#IlSDQsn=ya{o49QyHe|&h3JIPNpeWDhm zAh=a<^S!&?rM2-oWPrr+&o3*x-`(P9ZEVy3zw*wkSCTZn>vhd%0EyAiUHf*HI{TU@ z^W?s7k+Ej%8JQ80nUQ;*bE>*$#JFdsdwP1t zMqKh8_`PMm1yxcnwVsUSeV*sPJ=*BFWrb7rTGNe3Cd(EUQ#-v+3(84oZLM=>^F)2qJU<;9V!pJ|0LKhHnXkWflL12M}^tb4w z9HOxWS0LCpps7K(T`Twa@ZOjQq;HAy@5Kw`7@`N@67Upo1poq{K6$=x|Jn~eE3g=f zH-IVNuu^D~Ja7xm*gfl_Dx1U(3?IuI7Kln1zQTS`U30NP=jWIgXp5&rUr*;gP$)0I z&(|{OYiz{S*@_^Jq#L@GxYhpsp8@xN@zZ~kdHXgcHG)9R=5BZ2ob3OzUvT(;_2rlU zsZT-kgXH~k4so?Y!LS-8l-mW1-p8BOn(IBCPlC;eCoGT~?K;&cSWbuKlNtZTNk59G zlL(C<=i`7qnQ7G@X{J9Nsk%4e{)?yo(i~CP?I>{Hh zcBknU<;e8pvO|3V`H9@&hW%WVK8hs6o@vgKwrjqCqX5UBc#9=mIAUJ7NqPnT0VyNw z2o}e0G%Bevhp@B$nE*h(_={hCy>s3kA$+?%q8YB1e(xIr0)O$!hF3ab z_(aJ?2kuMNmPzs>eFBYf97)+qUM}eobi+N*!VE~ReFa-b2TQ8n} z>OSB3_`Lq&Ab7IZ|BYWAG7GQ=aA)tJCMnIfPqYd_16t5;yAmU260q!!tceB299=PC z-rdP$y96FUelsAp6L`+Uj_ERm8l1w6XwW#qoz=IebG-?K?Rk~o`{sWN4E&ehJ27DT z_g?Q@);eXi^@qRUx%l#npZ|SCuk@DO>HEo+XCUFZ7fViOkY6M%$2>%{$leXm=h=Q zm30UX4^k~4asa9X4i9M%VXizF^R_GG+WvPr066Eq`qwYvS+7&s=k-PHwD{zQzXTTj z>Wi=MF^|vKZi7y6&Z529!kun`)MH>aryV z&`T!~Jp}Nup^qH1n9(#e(*iIP{D-*xAK!ltzmM#nxDXrzPu>mx!9V;w1slX(u(vl# zvruX)p^f3x5=dUDF-qddA6OHTEn+{8v{nyowWTh+IB|IaN6bTGuD+Lek&vc@Hii@G zKM*vR9*tDAfTCn(ceOwJl1fLZo1gZI_Ip26-1_yE^}}BXRQM-98akY$WMHyhZbr-* z)fHNKwww=bVxHCk&F_Lu;Y=V?98(FKU}A^?um8?Li|3*iu-U)~bPhl1(=EB}UXkRK zzQNfLn(*JqAH?$x?J1uBkM)oLp(ET2e)wDWX%aVfcHg|K%k56Pq!@n3QLA&mInuJD z$V=eA2in|Y9TW18hRv5*Yb~7-nvckjW(f%&(DY_NHV1NS@FI`Km-Y`$8uc=5?)$b=i{r4uUHV4K0!zNyD=Zt=cI44WMWq?*% zp&8@-3_yFhm-Cbl(9n(=e4QVj6G6e2>K|vC_q9C%==zhtx zJ#t&vkA`t~8HXDhPiFxm8$b)dLz))$3!phM20I|YC{dQYtRoA-+$89I?;H4D$nHNW z-45E_Qv81ArFLJY|Le~fet!1HvYSv($232y^@g3mLd!m14kGA|Nu2PYF%yCRv3(Uh z-*?#+A4Bz=SI3ae2!@bG^5r7Pai>IS@I$#=MuW98g;0+B|5%tmsDa|p7t^0O2t^%y z{LcTi@457ZL}6Yv@TNn2^qL*Xb0Aqqu{5Ofq;4b(`M1D9*MKZOBd3i#%CYURdNA#ao7b@}3xAqC(^ zU;mT7$8kOm*6)`qs5GLmiGu|RW?|k6do*BcvfN+@5)kYN8XT3!ocX5gE1uz-#*kve zPsRo@+MLp`RF(9NA&?-RJWtF&y!E055ECFYFy&C-pnU$5=@0&n&G_@?&3Ub)T1{-V zq{~P`uIeVCG7qvSzL>KF7Sab=ObT4+a6C%~3qIzI>NiD)!l*}ELdOeBtjF+mFkxg= zxyfw6-X{jPXlf{bCbTY8fPZeyJK2=f0ks^QygL5%ufO>7pMOBSz*VHNOdjS5mw;r8 zF~i3!zZ=vuvE6!`Gyt6ha!&aML|lK|h?sE%E<`CFipG+_dCi z%~!+c7q^{PUx1%$0Mn(8pbb0g_;nDp&QRk2se zGBkB2@D=_O2{sHsz>qf6XwD)sbXs@GggI$Ekqv0D&=TwuQ={kFeGm6Dbc9W5Qj~xD zHF}pXe*Ehc&JSJ^aUgyy7s*n&@BCn-vA z^S+?R>|lb7<3;2VM|F+-UKrX!O47$;SEowN7vNNeGxH7t2(Ib- z=V&`o{`E$pLqj3yIY5$;FNLlnRm)|q)3e%=tKfeUeGj)B*bB}>JO-i+@FPzzlHdFl z3sLNOtHSVosbZys$r3;!>e`T*{d4_;-XzNpdE$|*4TAJrvF0hbkiR}SUbjaVl zL<`FJN2P)Y7()>Ga-SXog2bU;4a0ta`<39jfBe6`e^{802Xa&OZIq1W&bj-|pZ3Mz zhF}Y_g{CK2PL>awcro{9o5=>sEl4)}ZDF`%^A|=y+(F3WMp|c#|6R4%vtijB00~DC zIB{&a16!_(y(yZn_S72u??>$mtq-ziaV13eE0};6kN1P`zpp%g^)lUR*Xtd}lCTu^ zG1Ah*OozG7)R}A=Ia>(23?OzM!|BI~a5$T`nzIipREfcW@bUmDo{cFB(v9jg^cnhn zO@V{+84#Ly6{gsl{`4!@|DXIk*gaR7T;yK2T?Y*4q|^WEk7O=4l^y!yZh^9FI-ISS z_wSkMI1c9trJh*Ez{V3R3kT{NH(PaASu-0M%gVrA(~+U>dsP zNYjvjnoK<;G6+Rz6eC&Y*RsWqLPd=j@&e3VU-_qh@zu|M`j-z+U%xFQqGEWFv`nt# zu-XiEkx>x>BVyoX9dry6bO)&(P3Buj?D2LLh70J?&4^x*26s4~2fmaOe+s%&oWS^D z>;YT>dony*j&T=stL4*+YBS#e#Ss0k0KYySf9PL1{dfRq1ztSgkw)oHpBz-%QcL%6 z5GVuo_KhSRb!F12`)W2Kd!u@i2}ej_;HF15XgII}oX~et>Y6rJ(zxw7szJBrSO)6NiIe5T6+nYRVbX6}{C86O>4Z)nzvAc79``081wUhe7;(s;U1*K<-~Xv0mQIV0DrU0dxiw)AtyGG`dCVth5E z*D(4U>wL{ek>{hr9+BLQC2JVyeGE90V1zOWAO=!wDtJqVMxa~$U;Oef|G?RM`f0w~ zND{_lbn~rj<>Js9kJfN_qj|7NwjUOA0se2+VMNR|O(uHKBmr`qZXrPElHh}utOC3# zlY%TpVf=UY5ZbM$gE;qtxUcg5D(!0F^zCikh?SP;e|X|QR(_s({w+>EzCnc@+EZ4Z z6v<1FiCBQPjD5CE59iaqt};HFj+Co7YSbV2DV1q5oUw=Ojv@qCm&}wCY`>`exy>V2 za}mblhGS7Th=pkimcT}oPxH=P>qJxE{73)$zl7?W$4`$JFj>e}H4x0+?ad`D4f`xO z^`@)Y@_sX8>+5`VKU!>X0!7rtNxX*Z;vtxh9t6|}`esLOi2oAeUUcz(OWZmMBEUCP z=5v{*y)zU^;)PR`tP~n)UX!g<#;`vr)zl4SWJdG3VpZ`{zS?UP%IMSV0Q=` ziac|%9attrMdaQ8pEz@+oE#Sounte|YE92y7-v03>~Jv$Kpu}jU$P16;k)6EuO;#MJ)bFW-u*pW(n~LMxYXfg8+-%3-ozIt2ecVM8X)Y%+=9u*&|D- zqj3LmKF|Vx8~{;%Lj6(#z{8%Nk^Nk2s0yK4vJ)E^j92d!2LY+&ND>m}@zS!>7AQWq zmoPSeX(E6^@yTDc!gYG+%_7Ceee8Oc%KMLSPsgjknK$$Uly@j}Q3%4CAdqBa{LSM- zf1LEy92Q5bTQ3((t&gA*mD_+j?*p@bxce}^zgrTD#MCDyUl_lH>JJ9Xa>!|dEH(l9 z8ZXWZ=-;TSJ^`^dJGeN#bpz6SETE@eO{(7>9qrUdn8TzR?>~25Xds2;hhyM1b`YL^ z^spDhVY5kUPG2H1ARu}NQ389dX0td@!>L`?T-}fh{gUa>5_LUiX7nIbr)U+13vkeE zIpR0zkPQJ{?~rLLLLVyNU7G!x3$o`?RajBp$_dM$$L<18~F@3x;aGl0PCy(MMV%4g8B+6p$agilE8N9CAQU8;p+;UehDJ;X*yuIN1IIio zR<13_I*|bTgb@=dOvuIJp=>oqL(L^^hZfIvF+|Z0dP7XNfRiSZAhQ$z#>6*fi)d^` z&0^7*EQ<$u_W6anbkhxt-3EMK%Rs%xNWw5%C=3U_KxUO)`le9A)41Eij+H#ubK{MYq@)FJ)P;N@qc)b|f zpv`I-T)+|@G)`lkF9sA7bvlI;Fcbv}_}Cn7Zlu%HQmmDpeC;k8S1CnlU};p!o^mEs zE9lt}u+vVn0+SV@Tb}uZ7iBh%HrqM#KeZ8K+Y$nNwStct1gMy>E3a z(`c4h-<3<>9v{`q*QdKLUZ*azHB0D!_$Jqs_os#!1feQW_b&NIpyM!nD<7kh&~>knMsGx|OrcH+7D zL%=ey=NMcN1g#*&!Zovqf=G4G+R>nO)n!6A5}~cHL-0%!Tr1PX2$W;J{2Ty~{Vt2u z6h9GIKlpb-P!iRV>m8$XClJ5+d`<)mWoCx^48@Udscp4WOl7XqmD`h>t8=xM+TVHp zx|TI2p71|2_;Tb44~Y0Ck2EioIWyYU=v0<5r?!U(f1C8#dtAaY_U7iaH2J#^6>@?_*IMf z2K;ZbcQWOJBXIE}-0(~rrqWC|N>@kOQu^ld@}x!e-rIe;Z&ky;;y(rEC9VKRKLC)p z29Ga@`sw$DWsTMsrr0&-p!!KfDGM}D8zO+ibW7Msi=cvbdeF(F&r6Dl?2NAfXPGrx zF_~%=Z@?SWVC2KM=ObZS4<@{oF^C4reYDH5zlg_%j*fw<=k)x`zOBVUxmvFG8Y|H# zp>6deFs_9&!M60C(+?hGNfW%?@`*p(O=HFa^hfBu5cwr5WIj*8*Q0>I?ct2k6W5j6 zqMBS@-P~l;$7g31r`$}P?LIzkw|kBb{?D{8D&EHt@RjI*K>q4&NgZOCbwMgTBrX1w zw#=SN1Gp}|UnfV(9K+)E3_e}esb6=HFcvy}Rvo}NZA2s$6135vVTT48lsI*1dd7%W zLr5WZ^)Ud^1mR>Sfe7`I0*N@D&q<{z)txiX_UnyCRcb>b4HGfbGSVc21?=bNi|v*z zvJ1-nb`2pYB}-618m{F8;E9J0=}GDxrt_Ki5h+0f!Ro|*CwE&aT(dIr=4!90W=Z_-4crP}Qjts8V={ zW532R$eJfdll0bJS1}hxz0vOF(Wgwqv0*dyaQY?VyI)x?)~wpwPRWIZ{(b-!p)P<6 zAseUh;qQpuZ&wk?E!dY7ZIad02IeVOvboz@h5U-_VQEq>o>hwP_Maa}r9xW)|KZdV zGaq`VSJXkF`%Gths;=;Rkq%?vAU}qe4JoUpEZhN#?`|YQrRpA<=1vaNrm9^P3Rn4> zcI&JnY!<{P-j;6m_n*Hjw9DBR{SQ-*7yw>9-{w1bmz%5 zi{cHx3%)hrN?h77(SUg|_LcFPMzC*330B0}NbyXvPbU3b{wO~fcI?sIY3WUg@StrQYgVAN4W(wJoBPwsS*8Lvn==rGRNG)z$sD!!1|XTPb8)}D->iqL_vDAs zIy}$=EhcN$J#C_qN}-H+1N7%mJ;@l<2+gVR-AH;J3v|8J$`@`M^>U?{Zyx8$r~6Nj zJ3XnOlK=MfQvv=_{_y}kfAYzB7f+{%O^8XC8G3|<%J$sh`nn_;S!Qq0Gbk=YU6bXZ z)-9svR!R-D0awk6)l&iWb+|Elb`Xc{vRYAeRU}hVGA5DuxbWhfd1K$7&K3h6rvX|X za8NpItgAuqr6P}1sc>c`(H$FJe{%30AXKy&=~MVNzVXs2Q3DY@$0vVenv@-Vg;Z^&eC06cHR;&?s6a9@Z$dA_M&f zm`$&iv#B=k41$&Q9p~hDj+1B1!!Pz=qjmxZ=4WP~vFHmlkTa4zjOBQoIA;7#U(hL% z5fY1D&2luQ(rq{7X1Q6ZTG>?oDqG5(To;R{FJDy49o$?(|HI+;3c)jw&$HLETvcSX zZYIXKAJJF|WJ&Jv@dsUxN!>R32p*URiJcR*&ggp*e|n*i@19EyXmMaNhV3x|7qDPg zE!CO`KD{6w@o7Qk$Mj7Q^+LEApi+XX0fPe*z&{B@8z`z02EAe`oxf?gqlC56?^zX2 z5#SVDZE+Xy)O@~r&z{?G`~L2OhwBJ69L*-j!umc6dS}p1!vQO!W(mpy$CP{Q?2~Fr zqubVs*~@&U)~a8YjP&m7XZgIIzAb;e|0n>^e-Zrlv?5hxsomB4j-?V<%7|u6#w77! zC^CHzg}@#I=a~F&aiaoo;lAhRl~bLZ&@p%1L}!uHn+Icl-=n$xYd(kLU5^ zR*EzjstNC?DPB|x15!oA8In+Ojr(e&Wenwulvr@aaP)xI7r1#oTUgWh{dR_mKjG=0 z&DN78L^x>smemU+g3|<0ST;wkDY$=s1hs_B+;DYIlY5G4s6DNFTP$1^b2r82b+&bi z^X}&OtW<4_{+Iht5#;-m^PXNKQkMi#2A2SZkk=cGW=txEq`*9IDMFF$G@V;)n{YtA zSv4Y+3)xB~cafI)wLqifQi>f+LUhFq(CU9MFZ3yiVGp;C#1^|WZO}K zGqdX@K1HU}yHfjxbC$}Ko8$3t_I@>^;l;EK>dz9X<-_MpVGq+#q$AJ3LFV+rtcPB* zb37T&f&-Lr06n}^1mnnxry|u=SO_9pJ*pIUsdRN)&K52h0G?%=<v+2V1ZJqvi zgYy{_4m5BxC!bx_&1wViS~%}%cKBfc8VV~^9sV5HVKijuxJYxbn4Ac4HFUd3l7Dbh zENQc$JD<;HP~MyM+@}9yxSy}r)4NTy*q{bMalabP@7H(3=#F(ai_tP&cmPYCjXnku zx&69IEU?{ETTQ*4&eWAgEmytG77CX)*>`VVofONmniu#7Lk|`Z9)oL1X|qM5sXCFP zjfN^nAE^p9hdo`G+Xn{K+dZCbkLKSU$&ROWM|#I@S8mQu53*I3y96qb%X*l&Gyy6c ztKrY{i2WQg*n++r!DXO|!I}chz1pWsQ;B4~e-|clOseCnEx=o#4 z?!Vc6SxVt(=J_Y}^(o&WygQyubhc5~M*WUpY%~+|NMxBr3|rK5j`lV?+Xn7foP?xJ zaXp-_Eaz*@PWs?2yK-h-NJdO)4C1zKwlq?BrgN#PPe|(q@pIh;N=-U;;Xnik#e_zm zlnmMMK7^{$HP!02T8;ef8Q2^mPAB@XqTmlEt5uAme8Ih+-)$bYvxnJoLW~VLkZZK3 zo5|z>nd$v8h(CHNLLpR#)N^uB7&%O{Np4%))au1HhDw;vLjLmPXm9Ujx_Ff@!G8+S zOCaDcsy()>;?eAKS2YkWa7z-Son8wJlYw{cDfIp_WEdOy&~*AnkNgkKDAv)%R<2$b zz}pdS(9y@?&;oNXhk?eh9$iS#v(TRC(O|u2=zvFpDW(h#$nwUs87^18))H~$MpJGT zTluq_j=?9U_oQuDB6Pu397PZxEE<||@-4S__p_MYC^LY69*x;O?}l`?B=`4-B(A2Qa1gu|7Yzp0LY#u`-(B@w|n-m ztuV$Q)c38P&)StxK{=z!DmYwVmWt&Hi)XsN)O8G&QkM&vCO~mMgFT;ppW*b5B!sra zs;tO2LXPR)iO4h|q5`$wYygrL&wMk1vLBDeR)Dc5Ue04%v#p+@_qvMQV%g7*7J{Jx zXW^wDqbBvy{LB~c7oWj_uuA7Ugm^I#%-QxkoNQn}Bk#kz@`?yF1m8TeRzL_^&?TM3 z?f1Jihd(t_sW)=vd?s^~y1Kf0wg2i3c^0Do5hou-@bRe&)(u3CNy;&66A>8*lF^1F zvI&ZTIq>I>xe7@V&!mb?mciBggO1U!*2)0ROY) zda)rGpOxUSUjr-=0RPi?wO(zO^olQWqy~LxWyC-RG;^EBRI&^b-&;zn-D^~PA7 zI^yW4UiEr5R9H)CWQ!N6Mzz6`RuL?P->omHM%O^`i~kJm!75v~1_@D|!ji{l2C!jJ z94r1XNb=&2x+RAmxg-W$v5dHI5*r}o^I#;mW`cB!cT?lS#velLSNrqR4#n2*VBBx)$*kG@7+quU71Gv=lO>)aA|P;oi}~+oSr` zC7=Hz{Q2zhZdjugq7k_!qjFKUq5E)c+t^HuDHQ?&$i6+^Kg*Y^mY!=h zs)bgma(jL`goIv2gwS&Cy`n!;GV!SBRo5_)fjd~moflNA5F&q z0#2GGFu9vtDs!@Xpr9R_1>~C2e|YrTF?N^DhwrU77;aa@AW;-ifPe-Mr*}X?L?eA- z;|T~{2Rl$N2~1S(0Rl z@UW4HOP!!_^9&nlw|ASr@qJnV`abl_PG26#2t16VZ06$h>ZVYt>1KiPFMagp#6^1; z552BM14t+^-`2zVHd=I?HiCm7kZ8l$ zxdN#NdcVBA@-X6rfFE$-gcrp~)<&EG@hFKv4bbzl&f|n#P$y?M^$O%eTdZ5FuydQy zEq&Dsq0vr%6n$(L>}Zq5&O58v#)ew#0d&;MjEU9Xpb?@%gDz&*(@!as+q!x;(bpvOy{anEr!*A- zi?s~MyS`pE)#|yNBeC@Cpqj3wcUeyO^!a%0qv+~{anI_uQ)SnedK75Tu*u9Gyz9Y$ z5sH9d$q7Ef>9opR1NtS()(|t(*s4^tenT=XJt!7hs@$#?^ZE33zLe7j;ri}9)K_x% zuvmfr;4mX#aLoQwIMLN~^ZGb}_=c(*7>+eXYhv2Ah1g8(4%vE>Zy?yJ6v^+oNpk?4 zpB){X?CrjOb#TP_cV4+I6boIs+0^tN)1Sl+J=tMzkO7YKXj~?w8Dg@gx>Zv5h64b8|pWQcfsjhVfv8)dCa-&J1bEpc1hFVp+a*;z%)im|+ zO|EW@tWsI0zf|j|k9Q58Y(k&)YPR2K-R7Is8fq7c2rj80svaW8hpr_PD)OQS##W}E zSv20paCtx&c)R(#SEO{%_k^%3Y{yFt#)?X+&9pzBY(T%@`8TTvvEF*J-EODR-F=K2 zcKqRJpE`-V2O0qNi09+_?{z%(9=WQnOB#Vg>~1a;rCK&~Sv(1{GUW7J|8R>_wTMc>icQs%Nj%4vIQyWOl8Z_g{)Hq3vnw{u->*9Etl zuH;{T^7PZoQcr0W8XyhXO8&Og?387!2Hhzm1AJ^_AJIQ=01Otd0SZ|p&C4-(7;*R;T*ZBG&;3ZDkFDqFHU!! zlIQrz^Xp=%kge4VnbS-yUuPL3JcLIWH;G_O@Z~eGOqiJkeUI%!kqDj;EQk!_;fzFX zq_9kORP=4Es-x6dOHZBPB;0%l5{HFZw0_I=1{X~Da6b;PKutH?{x!tN;d3!U#-1tY zq>!;)7?o5avC)A$1d|3zsa@~1Z`fgfmA$<_zt}%LJ3YbH|K`!7wjRX9=b#P@U_C0W zMxm;=J5ZS4vx|At*FLob)@+lVD=dX`m zADuTcmsh#m`Ejw@Zub@0G8F8Ns3&=nqQ$!$Gu@b)g`Z=D6oOm7KrO`)KQ{OvAB?}=!FEJ09FrBM zdPfX#sNF3~!J@~A2CC7mspWb-UnmrAZ_duo4%ui%s^9*rN00m==m99Fi9BN@)m5W* zdQqrodK`{=^q(dSeisO_-gFeZRd1CGO}SgEULK!aT$~(S<+`5!rmY1I(sPQmc2p&@}wRHb6-S*Ok?PU=nmAHPC{$j`ubtq=Yd;VVqi7#wJ|IQO)X zF&^4lPk1hdoMoy)cT+DTdu`-TQt7i(LWfTn0S>wUy+ORW6FD-;0(P2Az>%q39b6Zs zPCPcl1#%U_dYopjsIzF&ZSx@XTHW03&GqTY-m9170$iLoy0yz!d+e!t{OV|j{QBLi z>+1`WQDvje9nf`d#?T`+xIuI?!U#tx9LihCXq1#*_2AL5Z)qcEx za`8sPL@Q3cc(`N`TGIl&|FB$sez$z!*Ui>j#4wY&^fxm^Aj}`o7i;W znxvH}iS>3s-Xljru~e)VQmM23-M2z9C>->kKK|tRZ@(ognXvGK>sq-f$$h1Tgstu3 zkO5Q#8|n|FPc0VTkq^zyA3D&QYd}5T0A|1sSf$POL+G&{j|nf>+_A%YK3qI(AUXk6 zAC_x2?Jk!y_`iqGMj?8j4QGJ%t^9^Blf)6ksN$IMiG~JQM{N}FKDhlJGK_Y&skZC6 zd^vZOy1qC)-)E;Qv6jytJ&Gb6>|}uvn*_*#ZYaXg;4Z>``5@I%L2gye=yV+#B(p9R zdV1Hu2V>Uda*pFadvOKwb@ZArV?1QvvOYh3xBvFy^6Xu%T2~acSFc*ypw+kg$nKHl z#2sUldBNH$svoB=6CpzlQFK%6UGvok(lUa^hR1!mMau>GIsNW(JY8)!3nDJV=#E|S z5BE?ai^X?7n~&EJp!Z2I+52=jA94C22PWu|fGf;(oP!RZ2QY+8dd%9I(Q0u{6)$tN z|5vFi*4dsP@9potc=U*90g+|~b`bhA9dFLqlN}0j)UUrgueJ#)n6z{4da*Lpi^En9 z>8~OMERyRrgoh?mu69bN&}WZ7ef;gK&(?+Az5Tt@%xS9H>`As#Zm_vt#WSY08))${ z+-2mKFe`|p>+{QRw}1p^f+I2?hf$@DQQK=@09M!Js7mT3?hm?0|^uTr*@1pqot zT^t`DzN7qc|9S0a#G)a|f$jBRCIhQ4m^ma$z00Fpc)qw&x;VKhOC86rHycGsX_-Ac zXg8R#>|RHz6XDI>fBg7UUg0*|a`%q1g{x+_*;JafwnL;xeL!ep7ZFgb*_>4Am%OX1 z1=$FY8!mZns8~qnK;paHP6yq)F)-(N`#CV#7NU0=tryJ9et_cb{<8<+eO*!mqt$v1 z6YkG*-y#v6+7XlLgXGW9fXyrgZ3P-~6|51hx@sFVd1c~@E1=(J=~O<$O3$60-51aJ z{N$qz2CDClx62j2^Z{Ny+hNZh%QJfU!*m6sM=dRw^OjsIw*9WwE6HsTvWDyMR5^C` zB?|HW7o}7kdMejA3#XL?lqb zR%9A%ClsIsxtS_&@&m~Ucl1h&4Mh&pX*ea&46Pp?K;#0O6}1lvgnj^@>yzCTiNK@T zkeEN{dXacfz?;I;7A*~wdyKNIN#$;2YrFu&ZC_ny(pQH^VzJy4&cFZ9zx}oU3&Ii9 AO#lD@ diff --git a/evaluation/utils/matlabPyrTools/entropy2.m b/evaluation/utils/matlabPyrTools/entropy2.m deleted file mode 100755 index 78b0325..0000000 --- a/evaluation/utils/matlabPyrTools/entropy2.m +++ /dev/null @@ -1,31 +0,0 @@ -% E = ENTROPY2(MTX,BINSIZE) -% -% Compute the first-order sample entropy of MTX. Samples of VEC are -% first discretized. Optional argument BINSIZE controls the -% discretization, and defaults to 256/(max(VEC)-min(VEC)). -% -% NOTE: This is a heavily biased estimate of entropy (it is too -% small) when you don't have much data! - -% Eero Simoncelli, 6/96. - -function res = entropy2(mtx,binsize) - -%% Ensure it's a vector, not a matrix. -vec = mtx(:); -[mn,mx] = range2(vec); - -if (exist('binsize') == 1) - nbins = max((mx-mn)/binsize, 1); -else - nbins = 256; -end - -[bincount,bins] = histo(vec,nbins); - -%% Collect non-zero bins: -H = bincount(find(bincount)); -H = H/sum(H); - -res = -sum(H .* log2(H)); - diff --git a/evaluation/utils/matlabPyrTools/factorial.m b/evaluation/utils/matlabPyrTools/factorial.m deleted file mode 100755 index 9255f43..0000000 --- a/evaluation/utils/matlabPyrTools/factorial.m +++ /dev/null @@ -1,16 +0,0 @@ -%% RES = factorial(NUM) -% -% Factorial function that works on matrices (matlab's does not). - -% EPS, 11/02 - -function res = factorial(num) - -res = ones(size(num)); - -ind = find(num > 0); -if ( ~isempty(ind) ) - subNum = num(ind); - res(ind) = subNum .* factorial(subNum-1); -end - diff --git a/evaluation/utils/matlabPyrTools/feynman.pgm b/evaluation/utils/matlabPyrTools/feynman.pgm deleted file mode 100755 index 7d14101bfc44ac4c134b1c8af9b3d6c36e1f0b1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65593 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 diff --git a/evaluation/utils/matlabPyrTools/histo.m b/evaluation/utils/matlabPyrTools/histo.m deleted file mode 100755 index 3366301..0000000 --- a/evaluation/utils/matlabPyrTools/histo.m +++ /dev/null @@ -1,58 +0,0 @@ -% [N,X] = histo(MTX, nbinsOrBinsize, binCenter); -% -% Compute a histogram of (all) elements of MTX. N contains the histogram -% counts, X is a vector containg the centers of the histogram bins. -% -% nbinsOrBinsize (optional, default = 101) specifies either -% the number of histogram bins, or the negative of the binsize. -% -% binCenter (optional, default = mean2(MTX)) specifies a center position -% for (any one of) the histogram bins. -% -% How does this differ from MatLab's HIST function? This function: -% - allows uniformly spaced bins only. -% +/- operates on all elements of MTX, instead of columnwise. -% + is much faster (approximately a factor of 80 on my machine). -% + allows specification of number of bins OR binsize. Default=101 bins. -% + allows (optional) specification of binCenter. - -% Eero Simoncelli, 3/97. - -function [N, X] = histo(mtx, nbins, binCtr) - -%% NOTE: THIS CODE IS NOT ACTUALLY USED! (MEX FILE IS CALLED INSTEAD) - -fprintf(1,'WARNING: You should compile the MEX version of "histo.c",\n found in the MEX subdirectory of matlabPyrTools, and put it in your matlab path. It is MUCH faster.\n'); - -mtx = mtx(:); - -%------------------------------------------------------------ -%% OPTIONAL ARGS: - -[mn,mx] = range2(mtx); - -if (exist('binCtr') ~= 1) - binCtr = mean(mtx); -end - -if (exist('nbins') == 1) - if (nbins < 0) - binSize = -nbins; - else - binSize = ((mx-mn)/nbins); - tmpNbins = round((mx-binCtr)/binSize) - round((mn-binCtr)/binSize); - if (tmpNbins ~= nbins) - warning('Using %d bins instead of requested number (%d)',tmpNbins,nbins); - end - end -else - binSize = ((mx-mn)/101); -end - -firstBin = binCtr + binSize*round( (mn-binCtr)/binSize ); - -tmpNbins = round((mx-binCtr)/binSize) - round((mn-binCtr)/binSize); - -bins = firstBin + binSize*[0:tmpNbins]; - -[N, X] = hist(mtx, bins); diff --git a/evaluation/utils/matlabPyrTools/histo.mexa64 b/evaluation/utils/matlabPyrTools/histo.mexa64 deleted file mode 100755 index ac65ceb2c016e55bf979cebe6f1869e494cab2a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9211 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 diff --git a/evaluation/utils/matlabPyrTools/histo.mexglx b/evaluation/utils/matlabPyrTools/histo.mexglx deleted file mode 100755 index 4d67bfecac9f82cf94596beb5a69181e4b3be1b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10228 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 NGf16(^Kzqt{|5c57j6Im diff --git a/evaluation/utils/matlabPyrTools/histo.mexmac b/evaluation/utils/matlabPyrTools/histo.mexmac deleted file mode 100755 index 9c9d47a09809453af799b2a363b6899c4c8c2ec4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8852 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 N!fVLP{r{x`e*;TYamWAw diff --git a/evaluation/utils/matlabPyrTools/histoMatch.m b/evaluation/utils/matlabPyrTools/histoMatch.m deleted file mode 100755 index ab82782..0000000 --- a/evaluation/utils/matlabPyrTools/histoMatch.m +++ /dev/null @@ -1,35 +0,0 @@ -% RES = histoMatch(MTX, N, X) -% -% Modify elements of MTX so that normalized histogram matches that -% specified by vectors X and N, where N contains the histogram counts -% and X the histogram bin positions (see histo). - -% Eero Simoncelli, 7/96. - -function res = histoMatch(mtx, N, X) - -if ( exist('histo') == 3 ) - [oN, oX] = histo(mtx(:), size(X(:),1)); -else - [oN, oX] = hist(mtx(:), size(X(:),1)); -end - -oStep = oX(2) - oX(1); -oC = [0, cumsum(oN)]/sum(oN); -oX = [oX(1)-oStep/2, oX+oStep/2]; - -N = N(:)'; -X = X(:)'; -N = N + mean(N)/(1e8); %% HACK: no empty bins ensures nC strictly monotonic - -nStep = X(2) - X(1); -nC = [0, cumsum(N)]/sum(N); -nX = [X(1)-nStep/2, X+nStep/2]; - -nnX = interp1(nC, nX, oC, 'linear'); - -if ( exist('pointOp') == 3 ) - res = pointOp(mtx, nnX, oX(1), oStep); -else - res = reshape(interp1(oX, nnX, mtx(:)),size(mtx,1),size(mtx,2)); -end diff --git a/evaluation/utils/matlabPyrTools/imGradient.m b/evaluation/utils/matlabPyrTools/imGradient.m deleted file mode 100755 index a120552..0000000 --- a/evaluation/utils/matlabPyrTools/imGradient.m +++ /dev/null @@ -1,50 +0,0 @@ -% [dx, dy] = imGradient(im, edges) -% -% Compute the gradient of the image using smooth derivative filters -% optimized for accurate direction estimation. Coordinate system -% corresponds to standard pixel indexing: X axis points rightward. Y -% axis points downward. EDGES specify boundary handling (see corrDn -% for options). -% -% Unlike matlab's new gradient function, which is based on local -% differences, this function computes derivatives using 5x5 filters -% designed to accurately reflect the local orientation content. - -% EPS, 1997. -% original filters from Int'l Conf Image Processing, 1994. -% updated filters 10/2003: see Farid & Simoncelli, IEEE Trans Image Processing, 13(4):496-508, April 2004. -% Incorporated into matlabPyrTools 10/2004. - -function [dx, dy] = imGradient(im, edges) - -if (exist('edges') ~= 1) - edges = 'dont-compute'; -end - -%% kernels from Farid & Simoncelli, IEEE Trans Image Processing, 13(4):496-508, April 2004. -gp = [0.037659 0.249153 0.426375 0.249153 0.037659]'; -gd = [-0.109604 -0.276691 0.000000 0.276691 0.109604]'; - -dx = corrDn(corrDn(im, gp, edges), gd', edges); -dy = corrDn(corrDn(im, gd, edges), gp', edges); - -return - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -%%% TEST: - -%%Make a ramp with random slope and direction -dir = 2*pi*rand - pi; -slope = 10*rand; - -sz = 32 -im = mkRamp(sz, dir, slope); -[dx,dy] = imGradient(im); -showIm(dx + sqrt(-1)*dy); - -ctr = (sz*sz/2)+sz/2; -slopeEst = sqrt(dx(ctr).^2 + dy(ctr).^2); -dirEst = atan2(dy(ctr), dx(ctr)); - -[slope, slopeEst] -[dir, dirEst] diff --git a/evaluation/utils/matlabPyrTools/imStats.m b/evaluation/utils/matlabPyrTools/imStats.m deleted file mode 100755 index bd2841f..0000000 --- a/evaluation/utils/matlabPyrTools/imStats.m +++ /dev/null @@ -1,43 +0,0 @@ -% imStats(IM1,IM2) -% -% Report image (matrix) statistics. -% When called on a single image IM1, report min, max, mean, stdev, skew, -% and kurtosis (4th moment about the mean, divided by squared variance) -% -% When called on two images (IM1 and IM2), report min, max, mean, -% stdev of the difference, and also SNR (relative to IM1). - -% Eero Simoncelli, 6/96. - -function [] = imStats(im1,im2) - -if (~isreal(im1)) - error('Args must be real-valued matrices'); -end - -if (exist('im2') == 1) - difference = im1 - im2; - [mn,mx] = range2(difference); - mean = mean2(difference); - v = var2(difference,mean); - if (v < realmin) - snr = Inf; - else - snr = 10 * log10(var2(im1)/v); - end - fprintf(1, 'Difference statistics:\n'); - fprintf(1, ' Range: [%c, %c]\n',mn,mx); - fprintf(1, ' Mean: %f, Stdev (rmse): %f, SNR (dB): %f\n',... - mean,sqrt(v),snr); -else - [mn,mx] = range2(im1); - mean = mean2(im1); - var = var2(im1,mean); - stdev = sqrt(real(var))+sqrt(imag(var)); - sk = skew2(im1, mean, stdev^2); - kurt = kurt2(im1, mean, stdev^2); - fprintf(1, 'Image statistics:\n'); - fprintf(1, ' Range: [%f, %f]\n',mn,mx); - fprintf(1, ' Mean: %f, Stdev: %f, Skew: %f, Kurt: %f\n',mean,stdev,sk,kurt); -end - diff --git a/evaluation/utils/matlabPyrTools/innerProd.m b/evaluation/utils/matlabPyrTools/innerProd.m deleted file mode 100755 index 11bb8f8..0000000 --- a/evaluation/utils/matlabPyrTools/innerProd.m +++ /dev/null @@ -1,11 +0,0 @@ -% RES = innerProd(MTX) -% -% Compute (MTX' * MTX) efficiently (i.e., without copying the matrix) -% -% NOTE: This function used to call a MEX function (C code) to avoid copying, but -% newer versions of matlab have eliminated the overhead of the -% simpler form below. - -function res = innerProd(mtx) - -res = mtx' * mtx; diff --git a/evaluation/utils/matlabPyrTools/kurt2.m b/evaluation/utils/matlabPyrTools/kurt2.m deleted file mode 100755 index 8351eb4..0000000 --- a/evaluation/utils/matlabPyrTools/kurt2.m +++ /dev/null @@ -1,24 +0,0 @@ -% K = KURT2(MTX,MEAN,VAR) -% -% Sample kurtosis (fourth moment divided by squared variance) -% of a matrix. Kurtosis of a Gaussian distribution is 3. -% MEAN (optional) and VAR (optional) make the computation faster. - -% Eero Simoncelli, 6/96. - -function res = kurt2(mtx, mn, v) - -if (exist('mn') ~= 1) - mn = mean(mean(mtx)); -end - -if (exist('v') ~= 1) - v = var2(mtx,mn); -end - -if (isreal(mtx)) - res = mean(mean(abs(mtx-mn).^4)) / (v^2); -else - res = mean(mean(real(mtx-mn).^4)) / (real(v)^2) + ... - i*mean(mean(imag(mtx-mn).^4)) / (imag(v)^2); -end diff --git a/evaluation/utils/matlabPyrTools/lplot.m b/evaluation/utils/matlabPyrTools/lplot.m deleted file mode 100755 index f922a56..0000000 --- a/evaluation/utils/matlabPyrTools/lplot.m +++ /dev/null @@ -1,43 +0,0 @@ -% lplot(VEC, XRANGE) -% -% Plot VEC, a vector, in "lollipop" format. -% XRANGE (optional, default = [1,length(VEC)]), should be a 2-vector -% specifying the X positions (for labeling purposes) of the first and -% last sample of VEC. - -% Mark Liberman, Linguistics Dept, UPenn, 1994. - -function lplot(x,xrange) - -if (exist('xrange') ~= 1) - xrange = [1,length(x)]; -end - -msize = size(x); -if ( msize(2) == 1) - x = x'; -elseif (msize(1) ~= 1) - error('First arg must be a vector'); -end - -if (~isreal(x)) - fprintf(1,'Warning: Imaginary part of signal ignored\n'); - x = abs(x); -end - -N = length(x); -index = xrange(1) + (xrange(2)-xrange(1))*[0:(N-1)]/(N-1); -xinc = index(2)-index(1); - -xx = [zeros(1,N);x;zeros(1,N)]; -indexis = [index;index;index]; -xdiscrete = [0 xx(:)' 0]; -idiscrete = [index(1)-xinc indexis(:)' index(N)+xinc]; - -[mn,mx] = range2(xdiscrete); -ypad = (mx-mn)/12; % MAGIC NUMBER: graph padding - -plot(idiscrete, xdiscrete, index, x, 'o'); -axis([index(1)-xinc, index(N)+xinc, mn-ypad, mx+ypad]); - -return diff --git a/evaluation/utils/matlabPyrTools/lpyrHt.m b/evaluation/utils/matlabPyrTools/lpyrHt.m deleted file mode 100755 index d6834d7..0000000 --- a/evaluation/utils/matlabPyrTools/lpyrHt.m +++ /dev/null @@ -1,11 +0,0 @@ -% [HEIGHT] = lpyrHt(INDICES) -% -% Compute height of Laplacian pyramid with given its INDICES matrix. -% See buildLpyr.m - -% Eero Simoncelli, 6/96. - -function [ht] = lpyrHt(pind) - -% Don't count lowpass residual band -ht = size(pind,1)-1; diff --git a/evaluation/utils/matlabPyrTools/make-tar-file b/evaluation/utils/matlabPyrTools/make-tar-file deleted file mode 100755 index 6338b76..0000000 --- a/evaluation/utils/matlabPyrTools/make-tar-file +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/csh -f - -setenv BASENAME "/lcv/matlab/lib/" - -setenv DIRNAME "matlabPyrTools" -setenv TARFILE "matlabPyrTools.tar" - -# For MAC: -# Put Macintosh-MEX.sit.hqx (contains projects, C code, mex files) inside of -# MEX directory. -# Put matlabPyrTools.sit.hqx (entire distribution, filetype corrected, no -# MEX subdirectory) inside of main directory. - -#################################################################### -## Make a compressed tar file of the EPS_matlab directory: - -echo "Before making the tar file:" -echo "1) If C code is modified, re-make the mex files..." -echo "2) Put correct date and version number in Contents.m. Execute 'ver' to test" -echo "3) add a ChangeLog entry stating that new tarfile was generated" -sleep 5 - -pushd ${BASENAME} - -#echo "Removing old tarfile..." -#/bin/rm "${DIRNAME}/${TARFILE}" -#/bin/rm "${DIRNAME}/${TARFILE}.gz" - -#echo "Removing ${DIRNAME}/MEX/*.o files..." -#/bin/rm ${DIRNAME}/MEX/*.o - -echo "Creating ${DIRNAME}/${TARFILE} ..." - -tar -cvf ${DIRNAME}/${TARFILE} \ - ${DIRNAME}/README ${DIRNAME}/ChangeLog ${DIRNAME}/*.m \ - ${DIRNAME}/MEX \ - ${DIRNAME}/TUTORIALS/README ${DIRNAME}/TUTORIALS/*.m \ - ${DIRNAME}/*.pgm - -echo "G'zipping ${DIRNAME}/${TARFILE} ..." - -gzip ${DIRNAME}/$TARFILE -gls -l "${DIRNAME}/$TARFILE.gz" - -popd - -echo "Done. Now:" -echo " cd ${BASENAME}/${DIRNAME}" -echo " scp ${TARFILE}.gz hopf:/Library/WebServer/Documents-www/ftp/eero/" -echo " cp README /users/eero/html_public/matlabPyrTools.README" -echo " cp ChangeLog /users/eero/html_public/matlabPyrTools.ChangeLog" -echo " cp Contents.m /users/eero/html_public/matlabPyrTools-Contents.m" -echo "" -echo " Finally, mark as updated in ~lcv/html_public/software.html" -echo "" diff --git a/evaluation/utils/matlabPyrTools/maxPyrHt.m b/evaluation/utils/matlabPyrTools/maxPyrHt.m deleted file mode 100755 index 84bcf29..0000000 --- a/evaluation/utils/matlabPyrTools/maxPyrHt.m +++ /dev/null @@ -1,25 +0,0 @@ -% HEIGHT = maxPyrHt(IMSIZE, FILTSIZE) -% -% Compute maximum pyramid height for given image and filter sizes. -% Specifically: the number of corrDn operations that can be sequentially -% performed when subsampling by a factor of 2. - -% Eero Simoncelli, 6/96. - -function height = maxPyrHt(imsz, filtsz) - -imsz = imsz(:); -filtsz = filtsz(:); - -if any(imsz == 1) % 1D image - imsz = prod(imsz); - filtsz = prod(filtsz); -elseif any(filtsz == 1) % 2D image, 1D filter - filtsz = [filtsz(1); filtsz(1)]; -end - -if any(imsz < filtsz) - height = 0; -else - height = 1 + maxPyrHt( floor(imsz/2), filtsz ); -end diff --git a/evaluation/utils/matlabPyrTools/mean2.m b/evaluation/utils/matlabPyrTools/mean2.m deleted file mode 100755 index 177f7ac..0000000 --- a/evaluation/utils/matlabPyrTools/mean2.m +++ /dev/null @@ -1,7 +0,0 @@ -% M = MEAN2(MTX) -% -% Sample mean of a matrix. - -function res = mean2(mtx) - -res = mean(mean(mtx)); diff --git a/evaluation/utils/matlabPyrTools/mkAngle.m b/evaluation/utils/matlabPyrTools/mkAngle.m deleted file mode 100755 index bd54f8d..0000000 --- a/evaluation/utils/matlabPyrTools/mkAngle.m +++ /dev/null @@ -1,32 +0,0 @@ -% IM = mkAngle(SIZE, PHASE, ORIGIN) -% -% Compute a matrix of dimension SIZE (a [Y X] 2-vector, or a scalar) -% containing samples of the polar angle (in radians, CW from the -% X-axis, ranging from -pi to pi), relative to angle PHASE (default = -% 0), about ORIGIN pixel (default = (size+1)/2). - -% Eero Simoncelli, 6/96. - -function [res] = mkAngle(sz, phase, origin) - -sz = sz(:); -if (size(sz,1) == 1) - sz = [sz,sz]; -end - -% ----------------------------------------------------------------- -% OPTIONAL args: - -if (exist('origin') ~= 1) - origin = (sz+1)/2; -end - -% ----------------------------------------------------------------- - -[xramp,yramp] = meshgrid( [1:sz(2)]-origin(2), [1:sz(1)]-origin(1) ); - -res = atan2(yramp,xramp); - -if (exist('phase') == 1) - res = mod(res+(pi-phase),2*pi)-pi; -end diff --git a/evaluation/utils/matlabPyrTools/mkAngularSine.m b/evaluation/utils/matlabPyrTools/mkAngularSine.m deleted file mode 100755 index f5238cc..0000000 --- a/evaluation/utils/matlabPyrTools/mkAngularSine.m +++ /dev/null @@ -1,42 +0,0 @@ -% IM = mkAngularSine(SIZE, HARMONIC, AMPL, PHASE, ORIGIN) -% -% Make an angular sinusoidal image: -% AMPL * sin( HARMONIC*theta + PHASE), -% where theta is the angle about the origin. -% SIZE specifies the matrix size, as for zeros(). -% AMPL (default = 1) and PHASE (default = 0) are optional. - -% Eero Simoncelli, 2/97. - -function [res] = mkAngularSine(sz, harmonic, ampl, ph, origin) - -sz = sz(:); -if (size(sz,1) == 1) - sz = [sz,sz]; -end - -mxsz = max(sz(1),sz(2)); - -%------------------------------------------------------------ -%% OPTIONAL ARGS: - -if (exist('harmonic') ~= 1) - harmonic = 1; -end - -if (exist('ampl') ~= 1) - ampl = 1; -end - -if (exist('ph') ~= 1) - ph = 0; -end - -if (exist('origin') ~= 1) - origin = (sz+1)/2; -end - -%------------------------------------------------------------ - -res = ampl * sin(harmonic*mkAngle(sz,ph,origin) + ph); - diff --git a/evaluation/utils/matlabPyrTools/mkDisc.m b/evaluation/utils/matlabPyrTools/mkDisc.m deleted file mode 100755 index 33e7d6d..0000000 --- a/evaluation/utils/matlabPyrTools/mkDisc.m +++ /dev/null @@ -1,61 +0,0 @@ -% IM = mkDisc(SIZE, RADIUS, ORIGIN, TWIDTH, VALS) -% -% Make a "disk" image. SIZE specifies the matrix size, as for -% zeros(). RADIUS (default = min(size)/4) specifies the radius of -% the disk. ORIGIN (default = (size+1)/2) specifies the -% location of the disk center. TWIDTH (in pixels, default = 2) -% specifies the width over which a soft threshold transition is made. -% VALS (default = [0,1]) should be a 2-vector containing the -% intensity value inside and outside the disk. - -% Eero Simoncelli, 6/96. - -function [res] = mkDisc(sz, rad, origin, twidth, vals) - -if (nargin < 1) - error('Must pass at least a size argument'); -end - -sz = sz(:); -if (size(sz,1) == 1) - sz = [sz sz]; -end - -%------------------------------------------------------------ -% OPTIONAL ARGS: - -if (exist('rad') ~= 1) - rad = min(sz(1),sz(2))/4; -end - -if (exist('origin') ~= 1) - origin = (sz+1)./2; -end - -if (exist('twidth') ~= 1) - twidth = 2; -end - -if (exist('vals') ~= 1) - vals = [1,0]; -end - -%------------------------------------------------------------ - -res = mkR(sz,1,origin); - -if (abs(twidth) < realmin) - res = vals(2) + (vals(1) - vals(2)) * (res <= rad); -else - [Xtbl,Ytbl] = rcosFn(twidth, rad, [vals(1), vals(2)]); - res = pointOp(res, Ytbl, Xtbl(1), Xtbl(2)-Xtbl(1), 0); -% -% OLD interp1 VERSION: -% res = res(:); -% Xtbl(1) = min(res); -% Xtbl(size(Xtbl,2)) = max(res); -% res = reshape(interp1(Xtbl,Ytbl,res), sz(1), sz(2)); -% -end - - diff --git a/evaluation/utils/matlabPyrTools/mkFract.m b/evaluation/utils/matlabPyrTools/mkFract.m deleted file mode 100755 index af95cd5..0000000 --- a/evaluation/utils/matlabPyrTools/mkFract.m +++ /dev/null @@ -1,36 +0,0 @@ -% IM = mkFract(SIZE, FRACT_DIM) -% -% Make a matrix of dimensions SIZE (a [Y X] 2-vector, or a scalar) -% containing fractal (pink) noise with power spectral density of the -% form: 1/f^(5-2*FRACT_DIM). Image variance is normalized to 1.0. -% FRACT_DIM defaults to 1.0 - -% Eero Simoncelli, 6/96. - -%% TODO: Verify that this matches Mandelbrot defn of fractal dimension. -%% Make this more efficient! - -function res = mkFract(dims, fract_dim) - -if (exist('fract_dim') ~= 1) - fract_dim = 1.0; -end - -res = randn(dims); -fres = fft2(res); - -sz = size(res); -ctr = ceil((sz+1)./2); - -shape = ifftshift(mkR(sz, -(2.5-fract_dim), ctr)); -shape(1,1) = 1; %%DC term - -fres = shape .* fres; -fres = ifft2(fres); - -if (max(max(abs(imag(fres)))) > 1e-10) - error('Symmetry error in creating fractal'); -else - res = real(fres); - res = res / sqrt(var2(res)); -end diff --git a/evaluation/utils/matlabPyrTools/mkGaussian.m b/evaluation/utils/matlabPyrTools/mkGaussian.m deleted file mode 100755 index a35728f..0000000 --- a/evaluation/utils/matlabPyrTools/mkGaussian.m +++ /dev/null @@ -1,63 +0,0 @@ -% IM = mkGaussian(SIZE, COVARIANCE, MEAN, AMPLITUDE) -% -% Compute a matrix with dimensions SIZE (a [Y X] 2-vector, or a -% scalar) containing a Gaussian function, centered at pixel position -% specified by MEAN (default = (size+1)/2), with given COVARIANCE (can -% be a scalar, 2-vector, or 2x2 matrix. Default = (min(size)/6)^2), -% and AMPLITUDE. AMPLITUDE='norm' (default) will produce a -% probability-normalized function. All but the first argument are -% optional. - -% Eero Simoncelli, 6/96. - -function [res] = mkGaussian(sz, cov, mn, ampl) - -sz = sz(:); -if (size(sz,1) == 1) - sz = [sz,sz]; -end - -%------------------------------------------------------------ -%% OPTIONAL ARGS: - -if (exist('cov') ~= 1) - cov = (min(sz(1),sz(2))/6)^2; -end - -if ( (exist('mn') ~= 1) | isempty(mn) ) - mn = (sz+1)/2; -else - mn = mn(:); - if (size(mn,1) == 1) - mn = [mn, mn]; - end -end - -if (exist('ampl') ~= 1) - ampl = 'norm'; -end - -%------------------------------------------------------------ - -[xramp,yramp] = meshgrid([1:sz(2)]-mn(2),[1:sz(1)]-mn(1)); - -if (sum(size(cov)) == 2) % scalar - if (strcmp(ampl,'norm')) - ampl = 1/(2*pi*cov(1)); - end - e = (xramp.^2 + yramp.^2)/(-2 * cov); -elseif (sum(size(cov)) == 3) % a 2-vector - if (strcmp(ampl,'norm')) - ampl = 1/(2*pi*sqrt(cov(1)*cov(2))); - end - e = xramp.^2/(-2 * cov(2)) + yramp.^2/(-2 * cov(1)); -else - if (strcmp(ampl,'norm')) - ampl = 1/(2*pi*sqrt(det(cov))); - end - cov = -inv(cov)/2; - e = cov(2,2)*xramp.^2 + (cov(1,2)+cov(2,1))*(xramp.*yramp) ... - + cov(1,1)*yramp.^2; -end - -res = ampl .* exp(e); diff --git a/evaluation/utils/matlabPyrTools/mkImpulse.m b/evaluation/utils/matlabPyrTools/mkImpulse.m deleted file mode 100755 index 9844ee8..0000000 --- a/evaluation/utils/matlabPyrTools/mkImpulse.m +++ /dev/null @@ -1,25 +0,0 @@ -% IM = mkImpulse(SIZE, ORIGIN, AMPLITUDE) -% -% Compute a matrix of dimension SIZE (a [Y X] 2-vector, or a scalar) -% containing a single non-zero entry, at position ORIGIN (defaults to -% ceil(size/2)), of value AMPLITUDE (defaults to 1). - -% Eero Simoncelli, 6/96. - -function [res] = mkImpulse(sz, origin, amplitude) - -sz = sz(:)'; -if (size(sz,2) == 1) - sz = [sz sz]; -end - -if (exist('origin') ~= 1) - origin = ceil(sz/2); -end - -if (exist('amplitude') ~= 1) - amplitude = 1; -end - -res = zeros(sz); -res(origin(1),origin(2)) = amplitude; diff --git a/evaluation/utils/matlabPyrTools/mkR.m b/evaluation/utils/matlabPyrTools/mkR.m deleted file mode 100755 index a1e8448..0000000 --- a/evaluation/utils/matlabPyrTools/mkR.m +++ /dev/null @@ -1,32 +0,0 @@ -% IM = mkR(SIZE, EXPT, ORIGIN) -% -% Compute a matrix of dimension SIZE (a [Y X] 2-vector, or a scalar) -% containing samples of a radial ramp function, raised to power EXPT -% (default = 1), with given ORIGIN (default = (size+1)/2, [1 1] = -% upper left). All but the first argument are optional. - -% Eero Simoncelli, 6/96. - -function [res] = mkR(sz, expt, origin) - -sz = sz(:); -if (size(sz,1) == 1) - sz = [sz,sz]; -end - -% ----------------------------------------------------------------- -% OPTIONAL args: - -if (exist('expt') ~= 1) - expt = 1; -end - -if (exist('origin') ~= 1) - origin = (sz+1)/2; -end - -% ----------------------------------------------------------------- - -[xramp,yramp] = meshgrid( [1:sz(2)]-origin(2), [1:sz(1)]-origin(1) ); - -res = (xramp.^2 + yramp.^2).^(expt/2); diff --git a/evaluation/utils/matlabPyrTools/mkRamp.m b/evaluation/utils/matlabPyrTools/mkRamp.m deleted file mode 100755 index dd37164..0000000 --- a/evaluation/utils/matlabPyrTools/mkRamp.m +++ /dev/null @@ -1,47 +0,0 @@ -% IM = mkRamp(SIZE, DIRECTION, SLOPE, INTERCEPT, ORIGIN) -% -% Compute a matrix of dimension SIZE (a [Y X] 2-vector, or a scalar) -% containing samples of a ramp function, with given gradient DIRECTION -% (radians, CW from X-axis, default = 0), SLOPE (per pixel, default = -% 1), and a value of INTERCEPT (default = 0) at the ORIGIN (default = -% (size+1)/2, [1 1] = upper left). All but the first argument are -% optional. - -% Eero Simoncelli, 6/96. 2/97: adjusted coordinate system. - -function [res] = mkRamp(sz, dir, slope, intercept, origin) - -sz = sz(:); -if (size(sz,1) == 1) - sz = [sz,sz]; -end - -% ----------------------------------------------------------------- -% OPTIONAL args: - -if (exist('dir') ~= 1) - dir = 0; -end - -if (exist('slope') ~= 1) - slope = 1; -end - -if (exist('intercept') ~= 1) - intercept = 0; -end - -if (exist('origin') ~= 1) - origin = (sz+1)/2; -end - -% ----------------------------------------------------------------- - -xinc = slope*cos(dir); -yinc = slope*sin(dir); - -[xramp,yramp] = meshgrid( xinc*([1:sz(2)]-origin(2)), ... - yinc*([1:sz(1)]-origin(1)) ); - -res = intercept + xramp + yramp; - diff --git a/evaluation/utils/matlabPyrTools/mkSine.m b/evaluation/utils/matlabPyrTools/mkSine.m deleted file mode 100755 index 147eb01..0000000 --- a/evaluation/utils/matlabPyrTools/mkSine.m +++ /dev/null @@ -1,67 +0,0 @@ -% IM = mkSine(SIZE, PERIOD, DIRECTION, AMPLITUDE, PHASE, ORIGIN) -% or -% IM = mkSine(SIZE, FREQ, AMPLITUDE, PHASE, ORIGIN) -% -% Compute a matrix of dimension SIZE (a [Y X] 2-vector, or a scalar) -% containing samples of a 2D sinusoid, with given PERIOD (in pixels), -% DIRECTION (radians, CW from X-axis, default = 0), AMPLITUDE (default -% = 1), and PHASE (radians, relative to ORIGIN, default = 0). ORIGIN -% defaults to the center of the image. -% -% In the second form, FREQ is a 2-vector of frequencies (radians/pixel). - -% Eero Simoncelli, 6/96. - -function [res] = mkSine(sz, per_freq, dir_amp, amp_phase, phase_orig, orig) - -%------------------------------------------------------------ -%% OPTIONAL ARGS: - -if (prod(size(per_freq)) == 2) - frequency = norm(per_freq); - direction = atan2(per_freq(1),per_freq(2)); - if (exist('dir_amp') == 1) - amplitude = dir_amp; - else - amplitude = 1; - end - if (exist('amp_phase') == 1) - phase = amp_phase; - else - phase = 0; - end - if (exist('phase_orig') == 1) - origin = phase_orig; - end - if (exist('orig') == 1) - error('Too many arguments for (second form) of mkSine'); - end -else - frequency = 2*pi/per_freq; - if (exist('dir_amp') == 1) - direction = dir_amp; - else - direction = 0; - end - if (exist('amp_phase') == 1) - amplitude = amp_phase; - else - amplitude = 1; - end - if (exist('phase_orig') == 1) - phase = phase_orig; - else - phase = 0; - end - if (exist('orig') == 1) - origin = orig; - end -end - -%------------------------------------------------------------ - -if (exist('origin') == 1) - res = amplitude*sin(mkRamp(sz, direction, frequency, phase, origin)); -else - res = amplitude*sin(mkRamp(sz, direction, frequency, phase)); -end diff --git a/evaluation/utils/matlabPyrTools/mkSquare.m b/evaluation/utils/matlabPyrTools/mkSquare.m deleted file mode 100755 index 84ef466..0000000 --- a/evaluation/utils/matlabPyrTools/mkSquare.m +++ /dev/null @@ -1,89 +0,0 @@ -% IM = mkSquare(SIZE, PERIOD, DIRECTION, AMPLITUDE, PHASE, ORIGIN, TWIDTH) -% or -% IM = mkSine(SIZE, FREQ, AMPLITUDE, PHASE, ORIGIN, TWIDTH) -% -% Compute a matrix of dimension SIZE (a [Y X] 2-vector, or a scalar) -% containing samples of a 2D square wave, with given PERIOD (in -% pixels), DIRECTION (radians, CW from X-axis, default = 0), AMPLITUDE -% (default = 1), and PHASE (radians, relative to ORIGIN, default = 0). -% ORIGIN defaults to the center of the image. TWIDTH specifies width -% of raised-cosine edges on the bars of the grating (default = -% min(2,period/3)). -% -% In the second form, FREQ is a 2-vector of frequencies (radians/pixel). - -% Eero Simoncelli, 6/96. - -% TODO: Add duty cycle. - -function [res] = mkSquare(sz, per_freq, dir_amp, amp_phase, phase_orig, orig_twidth, twidth) - -%------------------------------------------------------------ -%% OPTIONAL ARGS: - -if (prod(size(per_freq)) == 2) - frequency = norm(per_freq); - direction = atan2(per_freq(1),per_freq(2)); - if (exist('dir_amp') == 1) - amplitude = dir_amp; - else - amplitude = 1; - end - if (exist('amp_phase') == 1) - phase = amp_phase; - else - phase = 0; - end - if (exist('phase_orig') == 1) - origin = phase_orig; - end - if (exist('orig_twidth') == 1) - transition = orig_twidth; - else - transition = min(2,2*pi/(3*frequency)); - end - if (exist('twidth') == 1) - error('Too many arguments for (second form) of mkSine'); - end -else - frequency = 2*pi/per_freq; - if (exist('dir_amp') == 1) - direction = dir_amp; - else - direction = 0; - end - if (exist('amp_phase') == 1) - amplitude = amp_phase; - else - amplitude = 1; - end - if (exist('phase_orig') == 1) - phase = phase_orig; - else - phase = 0; - end - if (exist('orig_twidth') == 1) - origin = orig_twidth; - end - if (exist('twidth') == 1) - transition = twidth; - else - transition = min(2,2*pi/(3*frequency)); - end - -end - -%------------------------------------------------------------ - -if (exist('origin') == 1) - res = mkRamp(sz, direction, frequency, phase, origin) - pi/2; -else - res = mkRamp(sz, direction, frequency, phase) - pi/2; -end - -[Xtbl,Ytbl] = rcosFn(transition*frequency,pi/2,[-amplitude amplitude]); - -res = pointOp(abs(mod(res+pi, 2*pi)-pi),Ytbl,Xtbl(1),Xtbl(2)-Xtbl(1),0); - -% OLD threshold version: -%res = amplitude * (mod(res,2*pi) < pi); diff --git a/evaluation/utils/matlabPyrTools/mkZonePlate.m b/evaluation/utils/matlabPyrTools/mkZonePlate.m deleted file mode 100755 index 2b6a4a5..0000000 --- a/evaluation/utils/matlabPyrTools/mkZonePlate.m +++ /dev/null @@ -1,33 +0,0 @@ -% IM = mkZonePlate(SIZE, AMPL, PHASE) -% -% Make a "zone plate" image: -% AMPL * cos( r^2 + PHASE) -% SIZE specifies the matrix size, as for zeros(). -% AMPL (default = 1) and PHASE (default = 0) are optional. - -% Eero Simoncelli, 6/96. - -function [res] = mkZonePlate(sz, ampl, ph) - -sz = sz(:); -if (size(sz,1) == 1) - sz = [sz,sz]; -end - -mxsz = max(sz(1),sz(2)); - -%------------------------------------------------------------ -%% OPTIONAL ARGS: - -if (exist('ampl') ~= 1) - ampl = 1; -end - -if (exist('ph') ~= 1) - ph = 0; -end - -%------------------------------------------------------------ - -res = ampl * cos( (pi/mxsz) * mkR(sz,2) + ph ); - diff --git a/evaluation/utils/matlabPyrTools/modulateFlip.m b/evaluation/utils/matlabPyrTools/modulateFlip.m deleted file mode 100755 index eb27303..0000000 --- a/evaluation/utils/matlabPyrTools/modulateFlip.m +++ /dev/null @@ -1,19 +0,0 @@ -% [HFILT] = modulateFlipShift(LFILT) -% -% QMF/Wavelet highpass filter construction: modulate by (-1)^n, -% reverse order (and shift by one, which is handled by the convolution -% routines). This is an extension of the original definition of QMF's -% (e.g., see Simoncelli90). - -% Eero Simoncelli, 7/96. - -function [hfilt] = modulateFlipShift(lfilt) - -lfilt = lfilt(:); - -sz = size(lfilt,1); -sz2 = ceil(sz/2); - -ind = [sz:-1:1]'; - -hfilt = lfilt(ind) .* (-1).^(ind-sz2); diff --git a/evaluation/utils/matlabPyrTools/namedFilter.m b/evaluation/utils/matlabPyrTools/namedFilter.m deleted file mode 100755 index 0689dbc..0000000 --- a/evaluation/utils/matlabPyrTools/namedFilter.m +++ /dev/null @@ -1,71 +0,0 @@ -% KERNEL = NAMED_FILTER(NAME) -% -% Some standard 1D filter kernels. These are scaled such that -% their L2-norm is 1.0. -% -% binomN - binomial coefficient filter of order N-1 -% haar: - Haar wavelet. -% qmf8, qmf12, qmf16 - Symmetric Quadrature Mirror Filters [Johnston80] -% daub2,daub3,daub4 - Daubechies wavelet [Daubechies88]. -% qmf5, qmf9, qmf13: - Symmetric Quadrature Mirror Filters [Simoncelli88,Simoncelli90] -% -% See bottom of file for full citations. - -% Eero Simoncelli, 6/96. - -function [kernel] = named_filter(name) - -if strcmp(name(1:min(5,size(name,2))), 'binom') - kernel = sqrt(2) * binomialFilter(str2num(name(6:size(name,2)))); -elseif strcmp(name,'qmf5') - kernel = [-0.076103 0.3535534 0.8593118 0.3535534 -0.076103]'; -elseif strcmp(name,'qmf9') - kernel = [0.02807382 -0.060944743 -0.073386624 0.41472545 0.7973934 ... - 0.41472545 -0.073386624 -0.060944743 0.02807382]'; -elseif strcmp(name,'qmf13') - kernel = [-0.014556438 0.021651438 0.039045125 -0.09800052 ... - -0.057827797 0.42995453 0.7737113 0.42995453 -0.057827797 ... - -0.09800052 0.039045125 0.021651438 -0.014556438]'; -elseif strcmp(name,'qmf8') - kernel = sqrt(2) * [0.00938715 -0.07065183 0.06942827 0.4899808 ... - 0.4899808 0.06942827 -0.07065183 0.00938715 ]'; -elseif strcmp(name,'qmf12') - kernel = sqrt(2) * [-0.003809699 0.01885659 -0.002710326 -0.08469594 ... - 0.08846992 0.4843894 0.4843894 0.08846992 -0.08469594 -0.002710326 ... - 0.01885659 -0.003809699 ]'; -elseif strcmp(name,'qmf16') - kernel = sqrt(2) * [0.001050167 -0.005054526 -0.002589756 0.0276414 -0.009666376 ... - -0.09039223 0.09779817 0.4810284 0.4810284 0.09779817 -0.09039223 -0.009666376 ... - 0.0276414 -0.002589756 -0.005054526 0.001050167 ]'; -elseif strcmp(name,'haar') - kernel = [1 1]' / sqrt(2); -elseif strcmp(name,'daub2') - kernel = [0.482962913145 0.836516303738 0.224143868042 -0.129409522551]'; -elseif strcmp(name,'daub3') - kernel = [0.332670552950 0.806891509311 0.459877502118 -0.135011020010 ... - -0.085441273882 0.035226291882]'; -elseif strcmp(name,'daub4') - kernel = [0.230377813309 0.714846570553 0.630880767930 -0.027983769417 ... - -0.187034811719 0.030841381836 0.032883011667 -0.010597401785]'; -elseif strcmp(name,'gauss5') % for backward-compatibility - kernel = sqrt(2) * [0.0625 0.25 0.375 0.25 0.0625]'; -elseif strcmp(name,'gauss3') % for backward-compatibility - kernel = sqrt(2) * [0.25 0.5 0.25]'; -else - error(sprintf('Bad filter name: %s\n',name)); -end - -% [Johnston80] - J D Johnston, "A filter family designed for use in quadrature -% mirror filter banks", Proc. ICASSP, pp 291-294, 1980. -% -% [Daubechies88] - I Daubechies, "Orthonormal bases of compactly supported wavelets", -% Commun. Pure Appl. Math, vol. 42, pp 909-996, 1988. -% -% [Simoncelli88] - E P Simoncelli, "Orthogonal sub-band image transforms", -% PhD Thesis, MIT Dept. of Elec. Eng. and Comp. Sci. May 1988. -% Also available as: MIT Media Laboratory Vision and Modeling Technical -% Report #100. -% -% [Simoncelli90] - E P Simoncelli and E H Adelson, "Subband image coding", -% Subband Transforms, chapter 4, ed. John W Woods, Kluwer Academic -% Publishers, Norwell, MA, 1990, pp 143--192. diff --git a/evaluation/utils/matlabPyrTools/nextFig.m b/evaluation/utils/matlabPyrTools/nextFig.m deleted file mode 100755 index e0ac73f..0000000 --- a/evaluation/utils/matlabPyrTools/nextFig.m +++ /dev/null @@ -1,19 +0,0 @@ -% nextFig (MAXFIGS, SKIP) -% -% Make figure number mod((GCF+SKIP), MAXFIGS) the current figure. -% MAXFIGS is optional, and defaults to 2. -% SKIP is optional, and defaults to 1. - -% Eero Simoncelli, 2/97. - -function nextFig(maxfigs, skip) - -if (exist('maxfigs') ~= 1) - maxfigs = 2; -end - -if (exist('skip') ~= 1) - skip = 1; -end - -figure(1+mod(gcf-1+skip,maxfigs)); diff --git a/evaluation/utils/matlabPyrTools/pgmRead.m b/evaluation/utils/matlabPyrTools/pgmRead.m deleted file mode 100755 index 86c3b62..0000000 --- a/evaluation/utils/matlabPyrTools/pgmRead.m +++ /dev/null @@ -1,59 +0,0 @@ -% IM = pgmRead( FILENAME ) -% -% Load a pgm image into a MatLab matrix. -% This format is accessible from the XV image browsing utility. -% Only works for 8bit gray images (raw or ascii) - -% Hany Farid, Spring '96. Modified by Eero Simoncelli, 6/96. - -function im = pgmRead( fname ); - -[fid,msg] = fopen( fname, 'r' ); - -if (fid == -1) - error(msg); -end - -%%% First line contains ID string: -%%% "P1" = ascii bitmap, "P2" = ascii greymap, -%%% "P3" = ascii pixmap, "P4" = raw bitmap, -%%% "P5" = raw greymap, "P6" = raw pixmap -TheLine = fgetl(fid); -format = TheLine; - -if ~((format(1:2) == 'P2') | (format(1:2) == 'P5')) - error('PGM file must be of type P2 or P5'); -end - -%%% Any number of comment lines -TheLine = fgetl(fid); -while TheLine(1) == '#' - TheLine = fgetl(fid); -end - -%%% dimensions -sz = sscanf(TheLine,'%d',2); -xdim = sz(1); -ydim = sz(2); -sz = xdim * ydim; - -%%% Maximum pixel value -TheLine = fgetl(fid); -maxval = sscanf(TheLine, '%d',1); - -%%im = zeros(dim,1); -if (format(2) == '2') - [im,count] = fscanf(fid,'%d',sz); -else - [im,count] = fread(fid,sz,'uchar'); -end - -fclose(fid); - -if (count == sz) - im = reshape( im, xdim, ydim )'; -else - fprintf(1,'Warning: File ended early!'); - im = reshape( [im ; zeros(sz-count,1)], xdim, ydim)'; -end - diff --git a/evaluation/utils/matlabPyrTools/pgmWrite.m b/evaluation/utils/matlabPyrTools/pgmWrite.m deleted file mode 100755 index 09c14c9..0000000 --- a/evaluation/utils/matlabPyrTools/pgmWrite.m +++ /dev/null @@ -1,120 +0,0 @@ -% RANGE = pgmWrite(MTX, FILENAME, RANGE, TYPE, COMMENT) -% -% Write a MatLab matrix to a pgm (graylevel image) file. -% This format is accessible from the XV image browsing utility. -% -% RANGE (optional) is a 2-vector specifying the values that map to -% black and white, respectively. Passing a value of 'auto' (default) -% sets RANGE=[min,max] (as in MatLab's imagesc). 'auto2' sets -% RANGE=[mean-2*stdev, mean+2*stdev]. 'auto3' sets -% RANGE=[p1-(p2-p1)/8, p2+(p2-p1)/8], where p1 is the 10th percentile -% value of the sorted MATRIX samples, and p2 is the 90th percentile -% value. -% -% TYPE (optional) should be 'raw' or 'ascii'. Defaults to 'raw'. - -% Hany Farid, Spring '96. Modified by Eero Simoncelli, 6/96. - -function range = pgmWrite(mtx, fname, range, type, comment ); - -[fid,msg] = fopen( fname, 'w' ); - -if (fid == -1) - error(msg); -end - -%------------------------------------------------------------ -%% optional ARGS: - -if (exist('range') ~= 1) - range = 'auto'; -end - -if (exist('type') ~= 1) - type = 'raw'; -end -%------------------------------------------------------------ - -%% Automatic range calculation: -if (strcmp(range,'auto1') | strcmp(range,'auto')) - [mn,mx] = range2(mtx); - range = [mn,mx]; - -elseif strcmp(range,'auto2') - stdev = sqrt(var2(mtx)); - av = mean2(mtx); - range = [av-2*stdev,av+2*stdev]; % MAGIC NUMBER: 2 stdevs - -elseif strcmp(range, 'auto3') - percentile = 0.1; % MAGIC NUMBER: 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 diff --git a/evaluation/utils/matlabPyrTools/pointOp.mexglx b/evaluation/utils/matlabPyrTools/pointOp.mexglx deleted file mode 100755 index 3b0ebc377b0f88e4992468101538e53887ac1190..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10039 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 L(8YETk%#{P@t!tX diff --git a/evaluation/utils/matlabPyrTools/pointOp.mexw32 b/evaluation/utils/matlabPyrTools/pointOp.mexw32 deleted file mode 100755 index 8b664c6cea83a30f5c7470abdcc795942215b967..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7168 zcmeHMe{2)i9e)l695}#(tV>ba9bMR>ZS`U&fDNHbn%qLxBxLzPD6JcebBP`7JMVm# zWGdHYa;Me12H4mHo772w#MFtgsZ@wDiqa)&nr`7w z$$e|hX%Z1$DnqC6cgJ?^c;k2dNbiq)EGQ*GEi_{BnZdh z08$&(PK25aJi zAe@(*9(oOMxl4CLQ+Ps(kzO15n%?CI4YZoW^Hk zuxVQ>K+cA)+0Y_5dhOae%)dRk7FWWLF*)TQ%z#5; z%7J|pKcz5^o8^R~6iqT|g>fdCOh1!OR%Vnqr9ADx40iQX-HAQ>>`2_Wt)+jrQ)}L5 z_df;ExdUQRuN%CY)Ng2-mKd@_>$WEKL1H){OtJ4%Dk%tXfETt)_e~ym4@};V`{~k} z)c0p`9M!c{{S1(V9!#Ek9toMUNek77aDFm{K>Z1*ngnT4klA54nNIBjq&D(P3X#mH zR!IGZ`qE;AAR*BIs=i3{4CpiJw~0Oz+K2;?geEsy<6v9Li?g1fUaxT{@`l0H$ptgNI4mfVj9prJ?2V!+129Ik26? zCLIzRVS5mfM22QY<=GB}neF>E)d7n#8qHkt&x}TA6=r6{@R`bkWgKQ^U?8L(fSr~c zO!}uM*YuS=fT7Le0*#qTUU3in?f#L!oVYpKUoo2;uI?|`WH=z{cZxhy-Cy=9c2CMv znlz<;6Z&}^rtYW{cqZgDlI*Zx-3oNvd`DkNIdglkVol1ZH8@(4(n&kn(YXUs&g8}> zMNVs_oADs(c5p}xITB3TuC!$O3s&9caztrK58FSEy>KB139sxRo)2RA%|)&vc~9V@ zmXMuxd0FV98#&bo90b@xikzpEkHR!zFV-1F;ZG@)7plSMBY5o~5 zFFY9rMrclEVLHu|24>KF7>{vY$1s(c8G;SoFkVllZ@!mgh7@@ypict1jfNv! zQ*t_GCkveNUm&C@gS6>mCG9as(^sF6UY~{Oq-Wu;AInNRFzMBE!~eo)9>%247=}T5 zK#>P@(j;m^Z^e!;8jjhd-@v5enXH)>0M7xqmI#b`0GE5f>5t|jxtMA(kIhg9m{ z5dsnTK^hR@YXTdWA|f3Ph(fp*wN^CN*VI=x(E*{8j!JRz!65)nfe0NB1|k8$g?;{! zOHF-cBU8uJH_zA4*2bFZn)>-XYAyL%+3-CyFVI0gB1Jj6n+=LQ(5h{@>u4O$Jsgh( zgg9&D=t4Dh71hk$#=VQLzAA^&A%5A<~i=Vn>Jhr3YYhUrFDKet6R+f>u?X9XRufC_1EEdCs+Xdy5DubxVl|QNgpdzK*f)Wv`14aMwi|>nCw8C+VtT`3gTM#bcpUu+!RQRv9Ts>l%5q{895${q4m16ptx=4$ za6MtJ9o<509qoLK<}#&L`NDHC*$+7t3x|;MhosNAI8r z5L2S@?w}y*cp2dHiMc2KA8Oi2lGON{A^v^`dk~d@+$;avGXU!i=M1@vUnu6>KXSj~ z{<-^g_pjWS-0!+?xL0}}@_0ONdU{H(ltfE^R+_i&%j-tgY3rU}e{Ox=hS3cRynDSr z@E-HN>^h($ diff --git a/evaluation/utils/matlabPyrTools/pwd2path.m b/evaluation/utils/matlabPyrTools/pwd2path.m deleted file mode 100755 index 15aecf0..0000000 --- a/evaluation/utils/matlabPyrTools/pwd2path.m +++ /dev/null @@ -1,6 +0,0 @@ -% PWD2PATH() -% -% add current working directory (pwd) to path. - -P = path; -path(pwd,P); diff --git a/evaluation/utils/matlabPyrTools/pyrBand.m b/evaluation/utils/matlabPyrTools/pyrBand.m deleted file mode 100755 index 1fb6461..0000000 --- a/evaluation/utils/matlabPyrTools/pyrBand.m +++ /dev/null @@ -1,11 +0,0 @@ -% RES = pyrBand(PYR, INDICES, BAND_NUM) -% -% Access a subband from a pyramid (gaussian, laplacian, QMF/wavelet, -% or steerable). Subbands are numbered consecutively, from finest -% (highest spatial frequency) to coarsest (lowest spatial frequency). - -% Eero Simoncelli, 6/96. - -function res = pyrBand(pyr, pind, band) - -res = reshape( pyr(pyrBandIndices(pind,band)), pind(band,1), pind(band,2) ); diff --git a/evaluation/utils/matlabPyrTools/pyrBandIndices.m b/evaluation/utils/matlabPyrTools/pyrBandIndices.m deleted file mode 100755 index f94c217..0000000 --- a/evaluation/utils/matlabPyrTools/pyrBandIndices.m +++ /dev/null @@ -1,24 +0,0 @@ -% RES = pyrBandIndices(INDICES, BAND_NUM) -% -% Return indices for accessing a subband from a pyramid -% (gaussian, laplacian, QMF/wavelet, steerable). - -% Eero Simoncelli, 6/96. - -function indices = pyrBandIndices(pind,band) - -if ((band > size(pind,1)) | (band < 1)) - error(sprintf('BAND_NUM must be between 1 and number of pyramid bands (%d).', ... - size(pind,1))); -end - -if (size(pind,2) ~= 2) - error('INDICES must be an Nx2 matrix indicating the size of the pyramid subbands'); -end - -ind = 1; -for l=1:band-1 - ind = ind + prod(pind(l,:)); -end - -indices = ind:ind+prod(pind(band,:))-1; diff --git a/evaluation/utils/matlabPyrTools/pyrLow.m b/evaluation/utils/matlabPyrTools/pyrLow.m deleted file mode 100755 index 290e806..0000000 --- a/evaluation/utils/matlabPyrTools/pyrLow.m +++ /dev/null @@ -1,12 +0,0 @@ -% RES = pyrLow(PYR, INDICES) -% -% Access the lowpass subband from a pyramid -% (gaussian, laplacian, QMF/wavelet, steerable). - -% Eero Simoncelli, 6/96. - -function res = pyrLow(pyr,pind) - -band = size(pind,1); - -res = reshape( pyr(pyrBandIndices(pind,band)), pind(band,1), pind(band,2) ); diff --git a/evaluation/utils/matlabPyrTools/pyrTools.pdf b/evaluation/utils/matlabPyrTools/pyrTools.pdf deleted file mode 100755 index 71c42bac07d1db8ab54fe35613478bd54fd0af53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132913 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

fZDNh}19lw){0>nvBNCGG(#gAX5R=&FAP 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 size(b,1) ) & ( size(a,2) >= size(b,2) )) - large = a; small = b; -elseif (( size(a,1) <= size(b,1) ) & ( size(a,2) <= size(b,2) )) - large = b; small = a; -else - error('one arg must be larger than the other in both dimensions!'); -end - -ly = size(large,1); -lx = size(large,2); -sy = size(small,1); -sx = size(small,2); - -%% These values are one less than the index of the small mtx that falls on -%% the border pixel of the large matrix when computing the first -%% convolution response sample: -sy2 = floor((sy+ctr-1)/2); -sx2 = floor((sx+ctr-1)/2); - -% pad with reflected copies -clarge = [ - large(sy-sy2:-1:2,sx-sx2:-1:2), large(sy-sy2:-1:2,:), ... - large(sy-sy2:-1:2,lx-1:-1:lx-sx2); ... - large(:,sx-sx2:-1:2), large, large(:,lx-1:-1:lx-sx2); ... - large(ly-1:-1:ly-sy2,sx-sx2:-1:2), ... - large(ly-1:-1:ly-sy2,:), ... - large(ly-1:-1:ly-sy2,lx-1:-1:lx-sx2) ]; - -c = conv2(clarge,small,'valid'); - diff --git a/evaluation/utils/matlabPyrTools/rcosFn.m b/evaluation/utils/matlabPyrTools/rcosFn.m deleted file mode 100755 index 5dac344..0000000 --- a/evaluation/utils/matlabPyrTools/rcosFn.m +++ /dev/null @@ -1,45 +0,0 @@ -% [X, Y] = rcosFn(WIDTH, POSITION, VALUES) -% -% Return a lookup table (suitable for use by INTERP1) -% containing a "raised cosine" soft threshold function: -% -% Y = VALUES(1) + (VALUES(2)-VALUES(1)) * -% cos^2( PI/2 * (X - POSITION + WIDTH)/WIDTH ) -% -% WIDTH is the width of the region over which the transition occurs -% (default = 1). POSITION is the location of the center of the -% threshold (default = 0). VALUES (default = [0,1]) specifies the -% values to the left and right of the transition. - -% Eero Simoncelli, 7/96. - -function [X, Y] = rcosFn(width,position,values) - -%------------------------------------------------------------ -% OPTIONAL ARGS: - -if (exist('width') ~= 1) - width = 1; -end - -if (exist('position') ~= 1) - position = 0; -end - -if (exist('values') ~= 1) - values = [0,1]; -end - -%------------------------------------------------------------ - -sz = 256; %% arbitrary! - -X = pi * [-sz-1:1] / (2*sz); - -Y = values(1) + (values(2)-values(1)) * cos(X).^2; - -% Make sure end values are repeated, for extrapolation... -Y(1) = Y(2); -Y(sz+3) = Y(sz+2); - -X = position + (2*width/pi) * (X + pi/4); diff --git a/evaluation/utils/matlabPyrTools/reconLpyr.m b/evaluation/utils/matlabPyrTools/reconLpyr.m deleted file mode 100755 index cddcc12..0000000 --- a/evaluation/utils/matlabPyrTools/reconLpyr.m +++ /dev/null @@ -1,83 +0,0 @@ -% RES = reconLpyr(PYR, INDICES, LEVS, FILT2, EDGES) -% -% Reconstruct image from Laplacian pyramid, as created by buildLpyr. -% -% PYR is a vector containing the N pyramid subbands, ordered from fine -% to coarse. INDICES is an Nx2 matrix containing the sizes of -% each subband. This is compatible with the MatLab Wavelet toolbox. -% -% LEVS (optional) should be a list of levels to include, or the string -% 'all' (default). The finest scale is number 1. The lowpass band -% corresponds to lpyrHt(INDICES)+1. -% -% FILT2 (optional) can be a string naming a standard filter (see -% namedFilter), or a vector which will be used for (separable) -% convolution. Default = 'binom5'. EDGES specifies edge-handling, -% and defaults to 'reflect1' (see corrDn). - -% Eero Simoncelli, 6/96 - -function res = reconLpyr(pyr, ind, levs, filt2, edges) - -if (nargin < 2) - error('First two arguments (PYR, INDICES) are required'); -end - -%%------------------------------------------------------------ -%% DEFAULTS: - -if (exist('levs') ~= 1) - levs = 'all'; -end - -if (exist('filt2') ~= 1) - filt2 = 'binom5'; -end - -if (exist('edges') ~= 1) - edges= 'reflect1'; -end -%%------------------------------------------------------------ - -maxLev = 1+lpyrHt(ind); -if strcmp(levs,'all') - levs = [1:maxLev]'; -else - if (any(levs > maxLev)) - error(sprintf('Level numbers must be in the range [1, %d].', maxLev)); - end - levs = levs(:); -end - -if isstr(filt2) - filt2 = namedFilter(filt2); -end - -filt2 = filt2(:); -res_sz = ind(1,:); - -if any(levs > 1) - - int_sz = [ind(1,1), ind(2,2)]; - - nres = reconLpyr( pyr(prod(res_sz)+1:size(pyr,1)), ... - ind(2:size(ind,1),:), levs-1, filt2, edges); - - if (res_sz(1) == 1) - res = upConv(nres, filt2', edges, [1 2], [1 1], res_sz); - elseif (res_sz(2) == 1) - res = upConv(nres, filt2, edges, [2 1], [1 1], res_sz); - else - hi = upConv(nres, filt2, edges, [2 1], [1 1], int_sz); - res = upConv(hi, filt2', edges, [1 2], [1 1], res_sz); - end - -else - - res = zeros(res_sz); - -end - -if any(levs == 1) - res = res + pyrBand(pyr,ind,1); -end diff --git a/evaluation/utils/matlabPyrTools/reconSCFpyr.m b/evaluation/utils/matlabPyrTools/reconSCFpyr.m deleted file mode 100755 index a86f03d..0000000 --- a/evaluation/utils/matlabPyrTools/reconSCFpyr.m +++ /dev/null @@ -1,87 +0,0 @@ -% RES = reconSCFpyr(PYR, INDICES, LEVS, BANDS, TWIDTH) -% -% The inverse of buildSCFpyr: Reconstruct image from its complex steerable pyramid representation, -% in the Fourier domain. -% -% The image is reconstructed by forcing the complex subbands to be analytic -% (zero on half of the 2D Fourier plane, as they are supossed to be unless -% they have being modified), and reconstructing from the real part of those -% analytic subbands. That is equivalent to compute the Hilbert transforms of -% the imaginary parts of the subbands, average them with their real -% counterparts, and then reconstructing from the resulting real subbands. -% -% PYR is a vector containing the N pyramid subbands, ordered from fine -% to coarse. INDICES is an Nx2 matrix containing the sizes of -% each subband. This is compatible with the MatLab Wavelet toolbox. -% -% LEVS (optional) should be a list of levels to include, or the string -% 'all' (default). 0 corresonds to the residual highpass subband. -% 1 corresponds to the finest oriented scale. The lowpass band -% corresponds to number spyrHt(INDICES)+1. -% -% BANDS (optional) should be a list of bands to include, or the string -% 'all' (default). 1 = vertical, rest proceeding anti-clockwise. -% -% TWIDTH is the width of the transition region of the radial lowpass -% function, in octaves (default = 1, which gives a raised cosine for -% the bandpass filters). - -% Javier Portilla, 7/04, basing on Eero Simoncelli's Matlab Pyrtools code -% and our common code on texture synthesis (textureSynthesis.m). - -function res = reconSCFpyr(pyr, indices, levs, bands, twidth) - -%%------------------------------------------------------------ -%% DEFAULTS: - -if ~exist('levs'), - levs = 'all'; -end - -if ~exist('bands') - bands = 'all'; -end - -if ~exist('twidth'), - twidth = 1; -elseif (twidth <= 0) - fprintf(1,'Warning: TWIDTH must be positive. Setting to 1.\n'); - twidth = 1; -end - -%%------------------------------------------------------------ - - -pind = indices; -Nsc = log2(pind(1,1)/pind(end,1)); -Nor = (size(pind,1)-2)/Nsc; - -for nsc = 1:Nsc, - firstBnum = (nsc-1)*Nor+2; - -%% Re-create analytic subbands - dims = pind(firstBnum,:); - ctr = ceil((dims+0.5)/2); - ang = mkAngle(dims, 0, ctr); - ang(ctr(1),ctr(2)) = -pi/2; - for nor = 1:Nor, - nband = (nsc-1)*Nor+nor+1; - ind = pyrBandIndices(pind,nband); - ch = pyrBand(pyr, pind, nband); - ang0 = pi*(nor-1)/Nor; - xang = mod(ang-ang0+pi, 2*pi) - pi; - amask = 2*(abs(xang) < pi/2) + (abs(xang) == pi/2); - amask(ctr(1),ctr(2)) = 1; - amask(:,1) = 1; - amask(1,:) = 1; - amask = fftshift(amask); - ch = ifft2(amask.*fft2(ch)); % "Analytic" version - %f = 1.000008; % With this factor the reconstruction SNR goes up around 6 dB! - f = 1; - ch = f*0.5*real(ch); % real part - pyr(ind) = ch; - end % nor -end % nsc - -res = reconSFpyr(pyr, indices, levs, bands, twidth); - diff --git a/evaluation/utils/matlabPyrTools/reconSFpyr.m b/evaluation/utils/matlabPyrTools/reconSFpyr.m deleted file mode 100755 index 0e3109e..0000000 --- a/evaluation/utils/matlabPyrTools/reconSFpyr.m +++ /dev/null @@ -1,108 +0,0 @@ -% RES = reconSFpyr(PYR, INDICES, LEVS, BANDS, TWIDTH) -% -% Reconstruct image from its steerable pyramid representation, in the Fourier -% domain, as created by buildSFpyr. -% -% PYR is a vector containing the N pyramid subbands, ordered from fine -% to coarse. INDICES is an Nx2 matrix containing the sizes of -% each subband. This is compatible with the MatLab Wavelet toolbox. -% -% LEVS (optional) should be a list of levels to include, or the string -% 'all' (default). 0 corresonds to the residual highpass subband. -% 1 corresponds to the finest oriented scale. The lowpass band -% corresponds to number spyrHt(INDICES)+1. -% -% BANDS (optional) should be a list of bands to include, or the string -% 'all' (default). 1 = vertical, rest proceeding anti-clockwise. -% -% TWIDTH is the width of the transition region of the radial lowpass -% function, in octaves (default = 1, which gives a raised cosine for -% the bandpass filters). - -%%% MODIFIED VERSION, 7/04, uses different lookup table for radial frequency! - -% Eero Simoncelli, 5/97. - -function res = reconSFpyr(pyr, pind, levs, bands, twidth) - -%%------------------------------------------------------------ -%% DEFAULTS: - -if (exist('levs') ~= 1) - levs = 'all'; -end - -if (exist('bands') ~= 1) - bands = 'all'; -end - -if (exist('twidth') ~= 1) - twidth = 1; -elseif (twidth <= 0) - fprintf(1,'Warning: TWIDTH must be positive. Setting to 1.\n'); - twidth = 1; -end - -%%------------------------------------------------------------ - -nbands = spyrNumBands(pind); - -maxLev = 1+spyrHt(pind); -if strcmp(levs,'all') - levs = [0:maxLev]'; -else - if (any(levs > maxLev) | any(levs < 0)) - error(sprintf('Level numbers must be in the range [0, %d].', maxLev)); - end - levs = levs(:); -end - -if strcmp(bands,'all') - bands = [1:nbands]'; -else - if (any(bands < 1) | any(bands > nbands)) - error(sprintf('Band numbers must be in the range [1,3].', nbands)); - end - bands = bands(:); -end - -%---------------------------------------------------------------------- - -dims = pind(1,:); -ctr = ceil((dims+0.5)/2); - -[xramp,yramp] = meshgrid( ([1:dims(2)]-ctr(2))./(dims(2)/2), ... - ([1:dims(1)]-ctr(1))./(dims(1)/2) ); -angle = atan2(yramp,xramp); -log_rad = sqrt(xramp.^2 + yramp.^2); -log_rad(ctr(1),ctr(2)) = log_rad(ctr(1),ctr(2)-1); -log_rad = log2(log_rad); - -%% Radial transition function (a raised cosine in log-frequency): -[Xrcos,Yrcos] = rcosFn(twidth,(-twidth/2),[0 1]); -Yrcos = sqrt(Yrcos); -YIrcos = sqrt(abs(1.0 - Yrcos.^2)); - -if (size(pind,1) == 2) - if (any(levs==1)) - resdft = fftshift(fft2(pyrBand(pyr,pind,2))); - else - resdft = zeros(pind(2,:)); - end -else - resdft = reconSFpyrLevs(pyr(1+prod(pind(1,:)):size(pyr,1)), ... - pind(2:size(pind,1),:), ... - log_rad, Xrcos, Yrcos, angle, nbands, levs, bands); -end - -lo0mask = pointOp(log_rad, YIrcos, Xrcos(1), Xrcos(2)-Xrcos(1), 0); -resdft = resdft .* lo0mask; - -%% residual highpass subband -if any(levs == 0) - hi0mask = pointOp(log_rad, Yrcos, Xrcos(1), Xrcos(2)-Xrcos(1), 0); - hidft = fftshift(fft2(subMtx(pyr, pind(1,:)))); - resdft = resdft + hidft .* hi0mask; -end - -res = real(ifft2(ifftshift(resdft))); diff --git a/evaluation/utils/matlabPyrTools/reconSFpyrLevs.m b/evaluation/utils/matlabPyrTools/reconSFpyrLevs.m deleted file mode 100755 index 420f278..0000000 --- a/evaluation/utils/matlabPyrTools/reconSFpyrLevs.m +++ /dev/null @@ -1,69 +0,0 @@ -% RESDFT = reconSFpyrLevs(PYR,INDICES,LOGRAD,XRCOS,YRCOS,ANGLE,NBANDS,LEVS,BANDS) -% -% Recursive function for reconstructing levels of a steerable pyramid -% representation. This is called by reconSFpyr, and is not usually -% called directly. - -% Eero Simoncelli, 5/97. - -function resdft = reconSFpyrLevs(pyr,pind,log_rad,Xrcos,Yrcos,angle,nbands,levs,bands); - -lo_ind = nbands+1; -dims = pind(1,:); -ctr = ceil((dims+0.5)/2); - -% log_rad = log_rad + 1; -Xrcos = Xrcos - log2(2); % shift origin of lut by 1 octave. - -if any(levs > 1) - - lodims = ceil((dims-0.5)/2); - loctr = ceil((lodims+0.5)/2); - lostart = ctr-loctr+1; - loend = lostart+lodims-1; - nlog_rad = log_rad(lostart(1):loend(1),lostart(2):loend(2)); - nangle = angle(lostart(1):loend(1),lostart(2):loend(2)); - - if (size(pind,1) > lo_ind) - nresdft = reconSFpyrLevs( pyr(1+sum(prod(pind(1:lo_ind-1,:)')):size(pyr,1)),... - pind(lo_ind:size(pind,1),:), ... - nlog_rad, Xrcos, Yrcos, nangle, nbands,levs-1, bands); - else - nresdft = fftshift(fft2(pyrBand(pyr,pind,lo_ind))); - end - - YIrcos = sqrt(abs(1.0 - Yrcos.^2)); - lomask = pointOp(nlog_rad, YIrcos, Xrcos(1), Xrcos(2)-Xrcos(1), 0); - - resdft = zeros(dims); - resdft(lostart(1):loend(1),lostart(2):loend(2)) = nresdft .* lomask; - -else - - resdft = zeros(dims); - -end - - -if any(levs == 1) - - lutsize = 1024; - Xcosn = pi*[-(2*lutsize+1):(lutsize+1)]/lutsize; % [-2*pi:pi] - order = nbands-1; - %% divide by sqrt(sum_(n=0)^(N-1) cos(pi*n/N)^(2(N-1)) ) - const = (2^(2*order))*(factorial(order)^2)/(nbands*factorial(2*order)); - Ycosn = sqrt(const) * (cos(Xcosn)).^order; - himask = pointOp(log_rad, Yrcos, Xrcos(1), Xrcos(2)-Xrcos(1),0); - - ind = 1; - for b = 1:nbands - if any(bands == b) - anglemask = pointOp(angle,Ycosn,Xcosn(1)+pi*(b-1)/nbands,Xcosn(2)-Xcosn(1)); - band = reshape(pyr(ind:ind+prod(dims)-1), dims(1), dims(2)); - banddft = fftshift(fft2(band)); - resdft = resdft + (sqrt(-1))^(nbands-1) * banddft.*anglemask.*himask; - end - ind = ind + prod(dims); - end -end - diff --git a/evaluation/utils/matlabPyrTools/reconSpyr.m b/evaluation/utils/matlabPyrTools/reconSpyr.m deleted file mode 100755 index fc9317f..0000000 --- a/evaluation/utils/matlabPyrTools/reconSpyr.m +++ /dev/null @@ -1,96 +0,0 @@ -% RES = reconSpyr(PYR, INDICES, FILTFILE, EDGES, LEVS, BANDS) -% -% Reconstruct image from its steerable pyramid representation, as created -% by buildSpyr. -% -% PYR is a vector containing the N pyramid subbands, ordered from fine -% to coarse. INDICES is an Nx2 matrix containing the sizes of -% each subband. This is compatible with the MatLab Wavelet toolbox. -% -% FILTFILE (optional) should be a string referring to an m-file that returns -% the rfilters. examples: sp0Filters, sp1Filters, sp3Filters -% (default = 'sp1Filters'). -% EDGES specifies edge-handling, and defaults to 'reflect1' (see -% corrDn). -% -% LEVS (optional) should be a list of levels to include, or the string -% 'all' (default). 0 corresonds to the residual highpass subband. -% 1 corresponds to the finest oriented scale. The lowpass band -% corresponds to number spyrHt(INDICES)+1. -% -% BANDS (optional) should be a list of bands to include, or the string -% 'all' (default). 1 = vertical, rest proceeding anti-clockwise. - -% Eero Simoncelli, 6/96. - -function res = reconSpyr(pyr, pind, filtfile, edges, levs, bands) - -%%------------------------------------------------------------ -%% DEFAULTS: - -if (exist('filtfile') ~= 1) - filtfile = 'sp1Filters'; -end - -if (exist('edges') ~= 1) - edges= 'reflect1'; -end - -if (exist('levs') ~= 1) - levs = 'all'; -end - -if (exist('bands') ~= 1) - bands = 'all'; -end - -%%------------------------------------------------------------ - -if (isstr(filtfile) & (exist(filtfile) == 2)) - [lo0filt,hi0filt,lofilt,bfilts,steermtx,harmonics] = eval(filtfile); - nbands = spyrNumBands(pind); - if ((nbands > 0) & (size(bfilts,2) ~= nbands)) - error('Number of pyramid bands is inconsistent with filter file'); - end -else - error('filtfile argument must be the name of an M-file containing SPYR filters.'); -end - -maxLev = 1+spyrHt(pind); -if strcmp(levs,'all') - levs = [0:maxLev]'; -else - if (any(levs > maxLev) | any(levs < 0)) - error(sprintf('Level numbers must be in the range [0, %d].', maxLev)); - end - levs = levs(:); -end - -if strcmp(bands,'all') - bands = [1:nbands]'; -else - if (any(bands < 1) | any(bands > nbands)) - error(sprintf('Band numbers must be in the range [1,3].', nbands)); - end - bands = bands(:); -end - -if (spyrHt(pind) == 0) - if (any(levs==1)) - res1 = pyrBand(pyr,pind,2); - else - res1 = zeros(pind(2,:)); - end -else - res1 = reconSpyrLevs(pyr(1+prod(pind(1,:)):size(pyr,1)), ... - pind(2:size(pind,1),:), ... - lofilt, bfilts, edges, levs, bands); -end - -res = upConv(res1, lo0filt, edges); - -%% residual highpass subband -if any(levs == 0) - res = upConv( subMtx(pyr, pind(1,:)), hi0filt, edges, [1 1], [1 1], size(res), res); -end - diff --git a/evaluation/utils/matlabPyrTools/reconSpyrLevs.m b/evaluation/utils/matlabPyrTools/reconSpyrLevs.m deleted file mode 100755 index e8db963..0000000 --- a/evaluation/utils/matlabPyrTools/reconSpyrLevs.m +++ /dev/null @@ -1,46 +0,0 @@ -% RES = reconSpyrLevs(PYR,INDICES,LOFILT,BFILTS,EDGES,LEVS,BANDS) -% -% Recursive function for reconstructing levels of a steerable pyramid -% representation. This is called by reconSpyr, and is not usually -% called directly. - -% Eero Simoncelli, 6/96. - -function res = reconSpyrLevs(pyr,pind,lofilt,bfilts,edges,levs,bands); - -nbands = size(bfilts,2); -lo_ind = nbands+1; -res_sz = pind(1,:); - -% Assume square filters: -bfiltsz = round(sqrt(size(bfilts,1))); - -if any(levs > 1) - - if (size(pind,1) > lo_ind) - nres = reconSpyrLevs( pyr(1+sum(prod(pind(1:lo_ind-1,:)')):size(pyr,1)), ... - pind(lo_ind:size(pind,1),:), ... - lofilt, bfilts, edges, levs-1, bands); - else - nres = pyrBand(pyr,pind,lo_ind); % lowpass subband - end - - res = upConv(nres, lofilt, edges, [2 2], [1 1], res_sz); - -else - - res = zeros(res_sz); - -end - -if any(levs == 1) - ind = 1; - for b = 1:nbands - if any(bands == b) - bfilt = reshape(bfilts(:,b), bfiltsz, bfiltsz); - res = upConv(reshape(pyr(ind:ind+prod(res_sz)-1), res_sz(1), res_sz(2)), ... - bfilt, edges, [1 1], [1 1], res_sz, res); - end - ind = ind + prod(res_sz); - end -end diff --git a/evaluation/utils/matlabPyrTools/reconWpyr.m b/evaluation/utils/matlabPyrTools/reconWpyr.m deleted file mode 100755 index fc31226..0000000 --- a/evaluation/utils/matlabPyrTools/reconWpyr.m +++ /dev/null @@ -1,148 +0,0 @@ -% RES = reconWpyr(PYR, INDICES, FILT, EDGES, LEVS, BANDS) -% -% Reconstruct image from its separable orthonormal QMF/wavelet pyramid -% representation, as created by buildWpyr. -% -% PYR is a vector containing the N pyramid subbands, ordered from fine -% to coarse. INDICES is an Nx2 matrix containing the sizes of -% each subband. This is compatible with the MatLab Wavelet toolbox. -% -% FILT (optional) can be a string naming a standard filter (see -% namedFilter), or a vector which will be used for (separable) -% convolution. Default = 'qmf9'. EDGES specifies edge-handling, -% and defaults to 'reflect1' (see corrDn). -% -% LEVS (optional) should be a vector of levels to include, or the string -% 'all' (default). 1 corresponds to the finest scale. The lowpass band -% corresponds to wpyrHt(INDICES)+1. -% -% BANDS (optional) should be a vector of bands to include, or the string -% 'all' (default). 1=horizontal, 2=vertical, 3=diagonal. This is only used -% for pyramids of 2D images. - -% Eero Simoncelli, 6/96. - -function res = reconWpyr(pyr, ind, filt, edges, levs, bands) - -if (nargin < 2) - error('First two arguments (PYR INDICES) are required'); -end - -%%------------------------------------------------------------ -%% OPTIONAL ARGS: - -if (exist('filt') ~= 1) - filt = 'qmf9'; -end - -if (exist('edges') ~= 1) - edges= 'reflect1'; -end - -if (exist('levs') ~= 1) - levs = 'all'; -end - -if (exist('bands') ~= 1) - bands = 'all'; -end - -%%------------------------------------------------------------ - -maxLev = 1+wpyrHt(ind); -if strcmp(levs,'all') - levs = [1:maxLev]'; -else - if (any(levs > maxLev)) - error(sprintf('Level numbers must be in the range [1, %d].', maxLev)); - end - levs = levs(:); -end - -if strcmp(bands,'all') - bands = [1:3]'; -else - if (any(bands < 1) | any(bands > 3)) - error('Band numbers must be in the range [1,3].'); - end - bands = bands(:); -end - -if isstr(filt) - filt = namedFilter(filt); -end - -filt = filt(:); -hfilt = modulateFlip(filt); - -%% For odd-length filters, stagger the sampling lattices: -if (mod(size(filt,1),2) == 0) - stag = 2; -else - stag = 1; -end - -%% Compute size of result image: assumes critical sampling (boundaries correct) -res_sz = ind(1,:); -if (res_sz(1) == 1) - loind = 2; - res_sz(2) = sum(ind(:,2)); -elseif (res_sz(2) == 1) - loind = 2; - res_sz(1) = sum(ind(:,1)); -else - loind = 4; - res_sz = ind(1,:) + ind(2,:); %%horizontal + vertical bands. - hres_sz = [ind(1,1), res_sz(2)]; - lres_sz = [ind(2,1), res_sz(2)]; -end - - -%% First, recursively collapse coarser scales: -if any(levs > 1) - - if (size(ind,1) > loind) - nres = reconWpyr( pyr(1+sum(prod(ind(1:loind-1,:)')):size(pyr,1)), ... - ind(loind:size(ind,1),:), filt, edges, levs-1, bands); - else - nres = pyrBand(pyr, ind, loind); % lowpass subband - end - - if (res_sz(1) == 1) - res = upConv(nres, filt', edges, [1 2], [1 stag], res_sz); - elseif (res_sz(2) == 1) - res = upConv(nres, filt, edges, [2 1], [stag 1], res_sz); - else - ires = upConv(nres, filt', edges, [1 2], [1 stag], lres_sz); - res = upConv(ires, filt, edges, [2 1], [stag 1], res_sz); - end - -else - - res = zeros(res_sz); - -end - - -%% Add in reconstructed bands from this level: -if any(levs == 1) - if (res_sz(1) == 1) - upConv(pyrBand(pyr,ind,1), hfilt', edges, [1 2], [1 2], res_sz, res); - elseif (res_sz(2) == 1) - upConv(pyrBand(pyr,ind,1), hfilt, edges, [2 1], [2 1], res_sz, res); - else - if any(bands == 1) % horizontal - ires = upConv(pyrBand(pyr,ind,1),filt',edges,[1 2],[1 stag],hres_sz); - upConv(ires,hfilt,edges,[2 1],[2 1],res_sz,res); %destructively modify res - end - if any(bands == 2) % vertical - ires = upConv(pyrBand(pyr,ind,2),hfilt',edges,[1 2],[1 2],lres_sz); - upConv(ires,filt,edges,[2 1],[stag 1],res_sz,res); %destructively modify res - end - if any(bands == 3) % diagonal - ires = upConv(pyrBand(pyr,ind,3),hfilt',edges,[1 2],[1 2],hres_sz); - upConv(ires,hfilt,edges,[2 1],[2 1],res_sz,res); %destructively modify res - end - end -end - diff --git a/evaluation/utils/matlabPyrTools/setPyrBand.m b/evaluation/utils/matlabPyrTools/setPyrBand.m deleted file mode 100755 index 099022d..0000000 --- a/evaluation/utils/matlabPyrTools/setPyrBand.m +++ /dev/null @@ -1,32 +0,0 @@ -% NEWPYR = setPyrBand(PYR, INDICES, NEWBAND, BAND_NUM) -% -% Insert an image (BAND) into a pyramid (gaussian, laplacian, QMF/wavelet, -% or steerable). Subbands are numbered consecutively, from finest -% (highest spatial frequency) to coarsest (lowest spatial frequency). - -% Eero Simoncelli, 1/03. - -function pyr = setPyrBand(pyr, pind, band, bandNum) - -%% Check: PIND a valid index matrix? -if ( ~(ndims(pind) == 2) | ~(size(pind,2) == 2) | ~all(pind==round(pind)) ) - pind - error('pyrTools:badArg',... - 'PIND argument is not an Nbands X 2 matrix of integers'); -end - -%% Check: PIND consistent with size of PYR? -if ( length(pyr) ~= sum(prod(pind,2)) ) - error('pyrTools:badPyr',... - 'Pyramid data vector length is inconsistent with index matrix PIND'); -end - -%% Check: size of BAND consistent with desired BANDNUM? -if (~all(size(band) == pind(bandNum,:))) - size(band) - pind(bandNum,:) - error('pyrTools:badArg',... - 'size of BAND to be inserted is inconsistent with BAND_NUM'); -end - -pyr(pyrBandIndices(pind,bandNum)) = vectify(band); diff --git a/evaluation/utils/matlabPyrTools/shift.m b/evaluation/utils/matlabPyrTools/shift.m deleted file mode 100755 index 497297e..0000000 --- a/evaluation/utils/matlabPyrTools/shift.m +++ /dev/null @@ -1,15 +0,0 @@ -% [RES] = shift(MTX, OFFSET) -% -% Circular shift 2D matrix samples by OFFSET (a [Y,X] 2-vector), -% such that RES(POS) = MTX(POS-OFFSET). - -function res = shift(mtx, offset) - -dims = size(mtx); - -offset = mod(-offset,dims); - -res = [ mtx(offset(1)+1:dims(1), offset(2)+1:dims(2)), ... - mtx(offset(1)+1:dims(1), 1:offset(2)); ... - mtx(1:offset(1), offset(2)+1:dims(2)), ... - mtx(1:offset(1), 1:offset(2)) ]; diff --git a/evaluation/utils/matlabPyrTools/showIm.m b/evaluation/utils/matlabPyrTools/showIm.m deleted file mode 100755 index a9e2bd1..0000000 --- a/evaluation/utils/matlabPyrTools/showIm.m +++ /dev/null @@ -1,221 +0,0 @@ -% RANGE = showIm (MATRIX, RANGE, ZOOM, LABEL, NSHADES ) -% -% Display a MatLab MATRIX as a grayscale image in the current figure, -% inside the current axes. If MATRIX is complex, the real and imaginary -% parts are shown side-by-side, with the same grayscale mapping. -% -% If MATRIX is a string, it should be the name of a variable bound to a -% MATRIX in the base (global) environment. This matrix is displayed as an -% image, with the title set to the string. -% -% RANGE (optional) is a 2-vector specifying the values that map to -% black and white, respectively. Passing a value of 'auto' (default) -% sets RANGE=[min,max] (as in MatLab's imagesc). 'auto2' sets -% RANGE=[mean-2*stdev, mean+2*stdev]. 'auto3' sets -% RANGE=[p1-(p2-p1)/8, p2+(p2-p1)/8], where p1 is the 10th percentile -% value of the sorted MATRIX samples, and p2 is the 90th percentile -% value. -% -% ZOOM specifies the number of matrix samples per screen pixel. It -% will be rounded to an integer, or 1 divided by an integer. A value -% of 'same' or 'auto' (default) causes the zoom value to be chosen -% automatically to fit the image into the current axes. A value of -% 'full' fills the axis region (leaving no room for labels). See -% pixelAxes.m. -% -% If LABEL (optional, default = 1, unless zoom='full') is non-zero, the range -% of values that are mapped into the gray colormap and the dimensions -% (size) of the matrix and zoom factor are printed below the image. If label -% is a string, it is used as a title. -% -% NSHADES (optional) specifies the number of gray shades, and defaults -% to the size of the current colormap. - -% Eero Simoncelli, 6/96. - -%%TODO: should use "newplot" - -function range = showIm( im, range, zoom, label, nshades ); - -%------------------------------------------------------------ -%% OPTIONAL ARGS: - -if (nargin < 1) - error('Requires at least one input argument.'); -end - -MLv = version; - -if isstr(im) - if (strcmp(MLv(1),'4')) - error('Cannot pass string arg for MATRIX in MatLab version 4.x'); - end - label = im; - im = evalin('base',im); -end - -if (exist('range') ~= 1) - range = 'auto1'; -end - -if (exist('nshades') ~= 1) - nshades = size(colormap,1); -end -nshades = max( nshades, 2 ); - -if (exist('zoom') ~= 1) - zoom = 'auto'; -end - -if (exist('label') ~= 1) - if strcmp(zoom,'full') - label = 0; % no labeling - else - label = 1; % just print grayrange & dims - end -end - -%------------------------------------------------------------ - -%% Automatic range calculation: -if (strcmp(range,'auto1') | strcmp(range,'auto')) - if isreal(im) - [mn,mx] = range2(im); - else - [mn1,mx1] = range2(real(im)); - [mn2,mx2] = range2(imag(im)); - mn = min(mn1,mn2); - mx = max(mx1,mx2); - end - if any(size(im)==1) - pad = (mx-mn)/12; % MAGIC NUMBER: graph padding - range = [mn-pad, mx+pad]; - else - range = [mn,mx]; - end - -elseif strcmp(range,'auto2') - if isreal(im) - stdev = sqrt(var2(im)); - av = mean2(im); - else - stdev = sqrt((var2(real(im)) + var2(imag(im)))/2); - av = (mean2(real(im)) + mean2(imag(im)))/2; - end - range = [av-2*stdev,av+2*stdev]; % MAGIC NUMBER: 2 stdevs - -elseif strcmp(range, 'auto3') - percentile = 0.1; % MAGIC NUMBER: 0 1) - zformat = sprintf('* %d',round(zoom)); - else - zformat = sprintf('/ %d',round(1/zoom)); - end - if isreal(im) - format=[' Range: [%.3g, %.3g] \n Dims: [%d, %d] ', zformat]; - else - format=['Range: [%.3g, %.3g] ---- Dims: [%d, %d]', zformat]; - end - xlabel(sprintf(format, range(1), range(2), size(im,1), size(im,2))); - h = get(gca,'Xlabel'); - set(h,'FontSize', 9); % MAGIC NUMBER: font size!!! - - orig_units = get(h,'Units'); - set(h,'Units','points'); - pos = get(h,'Position'); - pos(1:2) = pos(1:2) + [xlbl_offset, 10]; % MAGIC NUMBER: y offset in points - set(h,'Position',pos); - set(h,'Units',orig_units); - - set(h,'Visible','on'); % axis('image') turned the xlabel off... - end -end - -return; diff --git a/evaluation/utils/matlabPyrTools/showLpyr.m b/evaluation/utils/matlabPyrTools/showLpyr.m deleted file mode 100755 index 0d85f9d..0000000 --- a/evaluation/utils/matlabPyrTools/showLpyr.m +++ /dev/null @@ -1,202 +0,0 @@ -% RANGE = showLpyr (PYR, INDICES, RANGE, GAP, LEVEL_SCALE_FACTOR) -% -% Display a Laplacian (or Gaussian) pyramid, specified by PYR and -% INDICES (see buildLpyr), in the current figure. -% -% RANGE is a 2-vector specifying the values that map to black and -% white, respectively. These values are scaled by -% LEVEL_SCALE_FACTOR^(lev-1) for bands at each level. Passing a value -% of 'auto1' sets RANGE to the min and max values of MATRIX. 'auto2' -% sets RANGE to 3 standard deviations below and above 0.0. In both of -% these cases, the lowpass band is independently scaled. A value of -% 'indep1' sets the range of each subband independently, as in a call -% to showIm(subband,'auto1'). Similarly, 'indep2' causes each subband -% to be scaled independently as if by showIm(subband,'indep2'). -% The default value for RANGE is 'auto1' for 1D images, and 'auto2' for -% 2D images. -% -% GAP (optional, default=1) specifies the gap in pixels to leave -% between subbands (2D images only). -% -% LEVEL_SCALE_FACTOR indicates the relative scaling between pyramid -% levels. This should be set to the sum of the kernel taps of the -% lowpass filter used to construct the pyramid (default assumes -% L2-normalalized filters, using a value of 2 for 2D images, sqrt(2) for -% 1D images). - -% Eero Simoncelli, 2/97. - -function [range] = showLpyr(pyr, pind, range, gap, scale); - -% Determine 1D or 2D pyramid: -if ((pind(1,1) == 1) | (pind(1,2) ==1)) - oned = 1; -else - oned = 0; -end - -%------------------------------------------------------------ -%% OPTIONAL ARGS: - -if (exist('range') ~= 1) - if (oned==1) - range = 'auto1'; - else - range = 'auto2'; - end -end - -if (exist('gap') ~= 1) - gap = 1; -end - -if (exist('scale') ~= 1) - if (oned == 1) - scale = sqrt(2); - else - scale = 2; - end -end - -%------------------------------------------------------------ - -nind = size(pind,1); - -%% Auto range calculations: -if strcmp(range,'auto1') - range = zeros(nind,1); - mn = 0.0; mx = 0.0; - for bnum = 1:(nind-1) - band = pyrBand(pyr,pind,bnum)/(scale^(bnum-1)); - range(bnum) = scale^(bnum-1); - [bmn,bmx] = range2(band); - mn = min(mn, bmn); mx = max(mx, bmx); - end - if (oned == 1) - pad = (mx-mn)/12; % *** MAGIC NUMBER!! - mn = mn-pad; mx = mx+pad; - end - range = range * [mn mx]; % outer product - band = pyrLow(pyr,pind); - [mn,mx] = range2(band); - if (oned == 1) - pad = (mx-mn)/12; % *** MAGIC NUMBER!! - mn = mn-pad; mx = mx+pad; - end - range(nind,:) = [mn, mx]; - -elseif strcmp(range,'indep1') - range = zeros(nind,2); - for bnum = 1:nind - band = pyrBand(pyr,pind,bnum); - [mn,mx] = range2(band); - if (oned == 1) - pad = (mx-mn)/12; % *** MAGIC NUMBER!! - mn = mn-pad; mx = mx+pad; - end - range(bnum,:) = [mn mx]; - end - -elseif strcmp(range,'auto2') - range = zeros(nind,1); - sqsum = 0; numpixels = 0; - for bnum = 1:(nind-1) - band = pyrBand(pyr,pind,bnum)/(scale^(bnum-1)); - sqsum = sqsum + sum(sum(band.^2)); - numpixels = numpixels + prod(size(band)); - range(bnum) = scale^(bnum-1); - end - stdev = sqrt(sqsum/(numpixels-1)); - range = range * [ -3*stdev 3*stdev ]; % outer product - band = pyrLow(pyr,pind); - av = mean2(band); stdev = sqrt(var2(band)); - range(nind,:) = [av-2*stdev,av+2*stdev]; - -elseif strcmp(range,'indep2') - range = zeros(nind,2); - for bnum = 1:(nind-1) - band = pyrBand(pyr,pind,bnum); - stdev = sqrt(var2(band)); - range(bnum,:) = [ -3*stdev 3*stdev ]; - end - band = pyrLow(pyr,pind); - av = mean2(band); stdev = sqrt(var2(band)); - range(nind,:) = [av-2*stdev,av+2*stdev]; - -elseif isstr(range) - error(sprintf('Bad RANGE argument: %s',range)) - -elseif ((size(range,1) == 1) & (size(range,2) == 2)) - scales = scale.^[0:nind-1]; - range = scales(:) * range; % outer product - band = pyrLow(pyr,pind); - range(nind,:) = range(nind,:) + mean2(band) - mean(range(nind,:)); - -end - -%% Clear Figure -clf; - -if (oned == 1) - - %%%%% 1D signal: - for bnum=1:nind - band = pyrBand(pyr,pind,bnum); - subplot(nind,1,nind-bnum+1); - plot(band); - axis([1, prod(size(band)), range(bnum,:)]); - end - -else - - %%%%% 2D signal: - colormap(gray); - cmap = get(gcf,'Colormap'); - nshades = size(cmap,1); - - % Find background color index: - clr = get(gcf,'Color'); - bg = 1; - dist = norm(cmap(bg,:)-clr); - for n = 1:nshades - ndist = norm(cmap(n,:)-clr); - if (ndist < dist) - dist = ndist; - bg = n; - end - end - - %% Compute positions of subbands: - llpos = ones(nind,2); - dir = [-1 -1]; - ctr = [pind(1,1)+1+gap 1]; - sz = [0 0]; - for bnum = 1:nind - prevsz = sz; - sz = pind(bnum,:); - - % Determine center position of new band: - ctr = ctr + gap*dir/2 + dir.* floor((prevsz+(dir>0))/2); - dir = dir * [0 -1; 1 0]; % ccw rotation - ctr = ctr + gap*dir/2 + dir.* floor((sz+(dir<0))/2); - llpos(bnum,:) = ctr - floor(sz./2); - end - - %% Make position list positive, and allocate appropriate image: - llpos = llpos - ones(nind,1)*min(llpos) + 1; - urpos = llpos + pind - 1; - d_im = bg + zeros(max(urpos)); - - %% Paste bands into image, (im-r1)*(nshades-1)/(r2-r1) + 1.5 - for bnum=1:nind - mult = (nshades-1) / (range(bnum,2)-range(bnum,1)); - d_im(llpos(bnum,1):urpos(bnum,1), llpos(bnum,2):urpos(bnum,2)) = ... - mult*pyrBand(pyr,pind,bnum) + (1.5-mult*range(bnum,1)); - end - - hh = image(d_im); - axis('off'); - pixelAxes(size(d_im),'full'); - set(hh,'UserData',range); - -end diff --git a/evaluation/utils/matlabPyrTools/showSpyr.m b/evaluation/utils/matlabPyrTools/showSpyr.m deleted file mode 100755 index da85715..0000000 --- a/evaluation/utils/matlabPyrTools/showSpyr.m +++ /dev/null @@ -1,188 +0,0 @@ -% RANGE = showSpyr (PYR, INDICES, RANGE, GAP, LEVEL_SCALE_FACTOR) -% -% Display a steerable pyramid, specified by PYR and INDICES -% (see buildSpyr), in the current figure. The highpass band is not shown. -% -% RANGE is a 2-vector specifying the values that map to black and -% white, respectively. These values are scaled by -% LEVEL_SCALE_FACTOR^(lev-1) for bands at each level. Passing a value -% of 'auto1' sets RANGE to the min and max values of MATRIX. 'auto2' -% sets RANGE to 3 standard deviations below and above 0.0. In both of -% these cases, the lowpass band is independently scaled. A value of -% 'indep1' sets the range of each subband independently, as in a call -% to showIm(subband,'auto1'). Similarly, 'indep2' causes each subband -% to be scaled independently as if by showIm(subband,'indep2'). -% The default value for RANGE is 'auto2'. -% -% GAP (optional, default=1) specifies the gap in pixels to leave -% between subbands. -% -% LEVEL_SCALE_FACTOR indicates the relative scaling between pyramid -% levels. This should be set to the sum of the kernel taps of the -% lowpass filter used to construct the pyramid (default is 2, which is -% correct for L2-normalized filters. - -% Eero Simoncelli, 2/97. - -function [range] = showSpyr(pyr, pind, range, gap, scale); - -nbands = spyrNumBands(pind); - -%------------------------------------------------------------ -%% OPTIONAL ARGS: - -if (exist('range') ~= 1) - range = 'auto2'; -end - -if (exist('gap') ~= 1) - gap = 1; -end - -if (exist('scale') ~= 1) - scale = 2; -end - -%------------------------------------------------------------ - -ht = spyrHt(pind); -nind = size(pind,1); - -%% Auto range calculations: -if strcmp(range,'auto1') - range = ones(nind,1); - band = spyrHigh(pyr,pind); - [mn,mx] = range2(band); - for lnum = 1:ht - for bnum = 1:nbands - band = spyrBand(pyr,pind,lnum,bnum)/(scale^(lnum-1)); - range((lnum-1)*nbands+bnum+1) = scale^(lnum-1); - [bmn,bmx] = range2(band); - mn = min(mn, bmn); - mx = max(mx, bmx); - end - end - range = range * [mn mx]; % outer product - band = pyrLow(pyr,pind); - [mn,mx] = range2(band); - range(nind,:) = [mn, mx]; - -elseif strcmp(range,'indep1') - range = zeros(nind,2); - for bnum = 1:nind - band = pyrBand(pyr,pind,bnum); - [mn,mx] = range2(band); - range(bnum,:) = [mn mx]; - end - -elseif strcmp(range,'auto2') - range = ones(nind,1); - band = spyrHigh(pyr,pind); - sqsum = sum(sum(band.^2)); numpixels = prod(size(band)); - for lnum = 1:ht - for bnum = 1:nbands - band = spyrBand(pyr,pind,lnum,bnum)/(scale^(lnum-1)); - sqsum = sqsum + sum(sum(band.^2)); - numpixels = numpixels + prod(size(band)); - range((lnum-1)*nbands+bnum+1) = scale^(lnum-1); - end - end - stdev = sqrt(sqsum/(numpixels-1)); - range = range * [ -3*stdev 3*stdev ]; % outer product - band = pyrLow(pyr,pind); - av = mean2(band); stdev = sqrt(var2(band)); - range(nind,:) = [av-2*stdev,av+2*stdev]; - -elseif strcmp(range,'indep2') - range = zeros(nind,2); - for bnum = 1:(nind-1) - band = pyrBand(pyr,pind,bnum); - stdev = sqrt(var2(band)); - range(bnum,:) = [ -3*stdev 3*stdev ]; - end - band = pyrLow(pyr,pind); - av = mean2(band); stdev = sqrt(var2(band)); - range(nind,:) = [av-2*stdev,av+2*stdev]; - -elseif isstr(range) - error(sprintf('Bad RANGE argument: %s',range)) - -elseif ((size(range,1) == 1) & (size(range,2) == 2)) - scales = scale.^[0:(ht-1)]; - scales = ones(nbands,1) * scales; %outer product - scales = [1; scales(:); scale^ht]; %tack on highpass and lowpass - range = scales * range; % outer product - band = pyrLow(pyr,pind); - range(nind,:) = range(nind,:) + mean2(band) - mean(range(nind,:)); - -end - -% CLEAR FIGURE: -clf; - -colormap(gray); -cmap = get(gcf,'Colormap'); -nshades = size(cmap,1); - -% Find background color index: -clr = get(gcf,'Color'); -bg = 1; -dist = norm(cmap(bg,:)-clr); -for n = 1:nshades - ndist = norm(cmap(n,:)-clr); - if (ndist < dist) - dist = ndist; - bg = n; - end -end - -%% Compute positions of subbands: -llpos = ones(nind,2); - -if (nbands == 2) - ncols = 1; nrows = 2; -else - ncols = ceil((nbands+1)/2); nrows = ceil(nbands/2); -end -relpos = [ (1-nrows):0, zeros(1,(ncols-1)); ... - zeros(1,nrows), -1:-1:(1-ncols) ]'; -if (nbands > 1) - mvpos = [-1 -1]; -else - mvpos = [0 -1]; -end -basepos = [0 0]; - -for lnum = 1:ht - ind1 = (lnum-1)*nbands + 2; - sz = pind(ind1,:)+gap; - basepos = basepos + mvpos .* sz; - if (nbands < 5) % to align edges... - sz = sz + gap*(ht-lnum+1); - end - llpos(ind1:ind1+nbands-1,:) = relpos * diag(sz) + ones(nbands,1)*basepos; -end - -% lowpass band -sz = pind(nind-1,:)+gap; -basepos = basepos + mvpos .* sz; -llpos(nind,:) = basepos; - -%% Make position list positive, and allocate appropriate image: -llpos = llpos - ones(nind,1)*min(llpos) + 1; -llpos(1,:) = [1 1]; -urpos = llpos + pind - 1; -d_im = bg + zeros(max(urpos)); - -%% Paste bands into image, (im-r1)*(nshades-1)/(r2-r1) + 1.5 -for bnum=2:nind - mult = (nshades-1) / (range(bnum,2)-range(bnum,1)); - d_im(llpos(bnum,1):urpos(bnum,1), llpos(bnum,2):urpos(bnum,2)) = ... - mult*pyrBand(pyr,pind,bnum) + (1.5-mult*range(bnum,1)); -end - -hh = image(d_im); -axis('off'); -pixelAxes(size(d_im),'full'); -set(hh,'UserData',range); - diff --git a/evaluation/utils/matlabPyrTools/showWpyr.m b/evaluation/utils/matlabPyrTools/showWpyr.m deleted file mode 100755 index 510e395..0000000 --- a/evaluation/utils/matlabPyrTools/showWpyr.m +++ /dev/null @@ -1,204 +0,0 @@ -% RANGE = showWpyr (PYR, INDICES, RANGE, GAP, LEVEL_SCALE_FACTOR) -% -% Display a separable QMF/wavelet pyramid, specified by PYR and INDICES -% (see buildWpyr), in the current figure. -% -% RANGE is a 2-vector specifying the values that map to black and -% white, respectively. These values are scaled by -% LEVEL_SCALE_FACTOR^(lev-1) for bands at each level. Passing a value -% of 'auto1' sets RANGE to the min and max values of MATRIX. 'auto2' -% sets RANGE to 3 standard deviations below and above 0.0. In both of -% these cases, the lowpass band is independently scaled. A value of -% 'indep1' sets the range of each subband independently, as in a call -% to showIm(subband,'auto1'). Similarly, 'indep2' causes each subband -% to be scaled independently as if by showIm(subband,'indep2'). -% The default value for RANGE is 'auto1' for 1D images, and 'auto2' for -% 2D images. -% -% GAP (optional, default=1) specifies the gap in pixels to leave -% between subbands (2D images only). -% -% LEVEL_SCALE_FACTOR indicates the relative scaling between pyramid -% levels. This should be set to the sum of the kernel taps of the -% lowpass filter used to construct the pyramid (default assumes -% L2-normalized filters, using a value of 2 for 2D images, sqrt(2) for -% 1D images). - -% Eero Simoncelli, 2/97. - -function [range] = showWpyr(pyr, pind, range, gap, scale); - -% Determine 1D or 2D pyramid: -if ((pind(1,1) == 1) | (pind(1,2) ==1)) - nbands = 1; -else - nbands = 3; -end - -%------------------------------------------------------------ -%% OPTIONAL ARGS: - -if (exist('range') ~= 1) - if (nbands==1) - range = 'auto1'; - else - range = 'auto2'; - end -end - -if (exist('gap') ~= 1) - gap = 1; -end - -if (exist('scale') ~= 1) - if (nbands == 1) - scale = sqrt(2); - else - scale = 2; - end -end - -%------------------------------------------------------------ - -ht = wpyrHt(pind); -nind = size(pind,1); - -%% Auto range calculations: -if strcmp(range,'auto1') - range = zeros(nind,1); - mn = 0.0; mx = 0.0; - for lnum = 1:ht - for bnum = 1:nbands - band = wpyrBand(pyr,pind,lnum,bnum)/(scale^(lnum-1)); - range((lnum-1)*nbands+bnum) = scale^(lnum-1); - [bmn,bmx] = range2(band); - mn = min(mn, bmn); mx = max(mx, bmx); - end - end - if (nbands == 1) - pad = (mx-mn)/12; % *** MAGIC NUMBER!! - mn = mn-pad; mx = mx+pad; - end - range = range * [mn mx]; % outer product - band = pyrLow(pyr,pind); - [mn,mx] = range2(band); - if (nbands == 1) - pad = (mx-mn)/12; % *** MAGIC NUMBER!! - mn = mn-pad; mx = mx+pad; - end - range(nind,:) = [mn, mx]; - -elseif strcmp(range,'indep1') - range = zeros(nind,2); - for bnum = 1:nind - band = pyrBand(pyr,pind,bnum); - [mn,mx] = range2(band); - if (nbands == 1) - pad = (mx-mn)/12; % *** MAGIC NUMBER!! - mn = mn-pad; mx = mx+pad; - end - range(bnum,:) = [mn mx]; - end - -elseif strcmp(range,'auto2') - range = zeros(nind,1); - sqsum = 0; numpixels = 0; - for lnum = 1:ht - for bnum = 1:nbands - band = wpyrBand(pyr,pind,lnum,bnum)/(scale^(lnum-1)); - sqsum = sqsum + sum(sum(band.^2)); - numpixels = numpixels + prod(size(band)); - range((lnum-1)*nbands+bnum) = scale^(lnum-1); - end - end - stdev = sqrt(sqsum/(numpixels-1)); - range = range * [ -3*stdev 3*stdev ]; % outer product - band = pyrLow(pyr,pind); - av = mean2(band); stdev = sqrt(var2(band)); - range(nind,:) = [av-2*stdev,av+2*stdev]; - -elseif strcmp(range,'indep2') - range = zeros(nind,2); - for bnum = 1:(nind-1) - band = pyrBand(pyr,pind,bnum); - stdev = sqrt(var2(band)); - range(bnum,:) = [ -3*stdev 3*stdev ]; - end - band = pyrLow(pyr,pind); - av = mean2(band); stdev = sqrt(var2(band)); - range(nind,:) = [av-2*stdev,av+2*stdev]; - -elseif isstr(range) - error(sprintf('Bad RANGE argument: %s',range)) - -elseif ((size(range,1) == 1) & (size(range,2) == 2)) - scales = scale.^[0:ht]; - if (nbands ~= 1) - scales = [scales; scales; scales]; - end - range = scales(:) * range; % outer product - band = pyrLow(pyr,pind); - range(nind,:) = range(nind,:) + mean2(band) - mean(range(nind,:)); - -end - -% CLEAR FIGURE: -clf; - -if (nbands == 1) - - %%%%% 1D signal: - for bnum=1:nind - band = pyrBand(pyr,pind,bnum); - subplot(nind,1,nind-bnum+1); - plot(band); - axis([1, prod(size(band)), range(bnum,:)]); - end - -else - - %%%%% 2D signal: - colormap(gray); - cmap = get(gcf,'Colormap'); - nshades = size(cmap,1); - - % Find background color index: - clr = get(gcf,'Color'); - bg = 1; - dist = norm(cmap(bg,:)-clr); - for n = 1:nshades - ndist = norm(cmap(n,:)-clr); - if (ndist < dist) - dist = ndist; - bg = n; - end - end - - %% Compute positions of subbands: - llpos = ones(nind,2); - for lnum = 1:ht - ind1 = nbands*(lnum-1) + 1; - xpos = pind(ind1,2) + 1 + gap*(ht-lnum+1); - ypos = pind(ind1+1,1) + 1 + gap*(ht-lnum+1); - llpos(ind1:ind1+2,:) = [ypos 1; 1 xpos; ypos xpos]; - end - llpos(nind,:) = [1 1]; %lowpass - - %% Make position list positive, and allocate appropriate image: - llpos = llpos - ones(nind,1)*min(llpos) + 1; - urpos = llpos + pind - 1; - d_im = bg + zeros(max(urpos)); - - %% Paste bands into image, (im-r1)*(nshades-1)/(r2-r1) + 1.5 - for bnum=1:nind - mult = (nshades-1) / (range(bnum,2)-range(bnum,1)); - d_im(llpos(bnum,1):urpos(bnum,1), llpos(bnum,2):urpos(bnum,2)) = ... - mult*pyrBand(pyr,pind,bnum) + (1.5-mult*range(bnum,1)); - end - - hh = image(d_im); - axis('off'); - pixelAxes(size(d_im),'full'); - set(hh,'UserData',range); - -end diff --git a/evaluation/utils/matlabPyrTools/skew2.m b/evaluation/utils/matlabPyrTools/skew2.m deleted file mode 100755 index 623d6ca..0000000 --- a/evaluation/utils/matlabPyrTools/skew2.m +++ /dev/null @@ -1,21 +0,0 @@ -% S = SKEW2(MTX,MEAN,VAR) -% -% Sample skew (third moment divided by variance^3/2) of a matrix. -% MEAN (optional) and VAR (optional) make the computation faster. - -function res = skew2(mtx, mn, v) - -if (exist('mn') ~= 1) - mn = mean2(mtx); -end - -if (exist('v') ~= 1) - v = var2(mtx,mn); -end - -if (isreal(mtx)) - res = mean(mean((mtx-mn).^3)) / (v^(3/2)); -else - res = mean(mean(real(mtx-mn).^3)) / (real(v)^(3/2)) + ... - i * mean(mean(imag(mtx-mn).^3)) / (imag(v)^(3/2)); -end diff --git a/evaluation/utils/matlabPyrTools/sp0Filters.m b/evaluation/utils/matlabPyrTools/sp0Filters.m deleted file mode 100755 index 6b25e36..0000000 --- a/evaluation/utils/matlabPyrTools/sp0Filters.m +++ /dev/null @@ -1,72 +0,0 @@ -% Steerable pyramid filters. Transform described in: -% -% @INPROCEEDINGS{Simoncelli95b, -% TITLE = "The Steerable Pyramid: A Flexible Architecture for -% Multi-Scale Derivative Computation", -% AUTHOR = "E P Simoncelli and W T Freeman", -% BOOKTITLE = "Second Int'l Conf on Image Processing", -% ADDRESS = "Washington, DC", MONTH = "October", YEAR = 1995 } -% -% Filter kernel design described in: -% -%@INPROCEEDINGS{Karasaridis96, -% TITLE = "A Filter Design Technique for -% Steerable Pyramid Image Transforms", -% AUTHOR = "A Karasaridis and E P Simoncelli", -% BOOKTITLE = "ICASSP", ADDRESS = "Atlanta, GA", -% MONTH = "May", YEAR = 1996 } - -% Eero Simoncelli, 6/96. - -function [lo0filt,hi0filt,lofilt,bfilts,mtx,harmonics] = sp0Filters(); - -harmonics = [ 0 ]; - -lo0filt = [ ... --4.514000e-04 -1.137100e-04 -3.725800e-04 -3.743860e-03 -3.725800e-04 -1.137100e-04 -4.514000e-04 --1.137100e-04 -6.119520e-03 -1.344160e-02 -7.563200e-03 -1.344160e-02 -6.119520e-03 -1.137100e-04 --3.725800e-04 -1.344160e-02 6.441488e-02 1.524935e-01 6.441488e-02 -1.344160e-02 -3.725800e-04 --3.743860e-03 -7.563200e-03 1.524935e-01 3.153017e-01 1.524935e-01 -7.563200e-03 -3.743860e-03 --3.725800e-04 -1.344160e-02 6.441488e-02 1.524935e-01 6.441488e-02 -1.344160e-02 -3.725800e-04 --1.137100e-04 -6.119520e-03 -1.344160e-02 -7.563200e-03 -1.344160e-02 -6.119520e-03 -1.137100e-04 --4.514000e-04 -1.137100e-04 -3.725800e-04 -3.743860e-03 -3.725800e-04 -1.137100e-04 -4.514000e-04]; - -lofilt = [ ... --2.257000e-04 -8.064400e-04 -5.686000e-05 8.741400e-04 -1.862800e-04 -1.031640e-03 -1.871920e-03 -1.031640e-03 -1.862800e-04 8.741400e-04 -5.686000e-05 -8.064400e-04 -2.257000e-04 --8.064400e-04 1.417620e-03 -1.903800e-04 -2.449060e-03 -4.596420e-03 -7.006740e-03 -6.948900e-03 -7.006740e-03 -4.596420e-03 -2.449060e-03 -1.903800e-04 1.417620e-03 -8.064400e-04 --5.686000e-05 -1.903800e-04 -3.059760e-03 -6.401000e-03 -6.720800e-03 -5.236180e-03 -3.781600e-03 -5.236180e-03 -6.720800e-03 -6.401000e-03 -3.059760e-03 -1.903800e-04 -5.686000e-05 -8.741400e-04 -2.449060e-03 -6.401000e-03 -5.260020e-03 3.938620e-03 1.722078e-02 2.449600e-02 1.722078e-02 3.938620e-03 -5.260020e-03 -6.401000e-03 -2.449060e-03 8.741400e-04 --1.862800e-04 -4.596420e-03 -6.720800e-03 3.938620e-03 3.220744e-02 6.306262e-02 7.624674e-02 6.306262e-02 3.220744e-02 3.938620e-03 -6.720800e-03 -4.596420e-03 -1.862800e-04 --1.031640e-03 -7.006740e-03 -5.236180e-03 1.722078e-02 6.306262e-02 1.116388e-01 1.348999e-01 1.116388e-01 6.306262e-02 1.722078e-02 -5.236180e-03 -7.006740e-03 -1.031640e-03 --1.871920e-03 -6.948900e-03 -3.781600e-03 2.449600e-02 7.624674e-02 1.348999e-01 1.576508e-01 1.348999e-01 7.624674e-02 2.449600e-02 -3.781600e-03 -6.948900e-03 -1.871920e-03 --1.031640e-03 -7.006740e-03 -5.236180e-03 1.722078e-02 6.306262e-02 1.116388e-01 1.348999e-01 1.116388e-01 6.306262e-02 1.722078e-02 -5.236180e-03 -7.006740e-03 -1.031640e-03 --1.862800e-04 -4.596420e-03 -6.720800e-03 3.938620e-03 3.220744e-02 6.306262e-02 7.624674e-02 6.306262e-02 3.220744e-02 3.938620e-03 -6.720800e-03 -4.596420e-03 -1.862800e-04 -8.741400e-04 -2.449060e-03 -6.401000e-03 -5.260020e-03 3.938620e-03 1.722078e-02 2.449600e-02 1.722078e-02 3.938620e-03 -5.260020e-03 -6.401000e-03 -2.449060e-03 8.741400e-04 --5.686000e-05 -1.903800e-04 -3.059760e-03 -6.401000e-03 -6.720800e-03 -5.236180e-03 -3.781600e-03 -5.236180e-03 -6.720800e-03 -6.401000e-03 -3.059760e-03 -1.903800e-04 -5.686000e-05 --8.064400e-04 1.417620e-03 -1.903800e-04 -2.449060e-03 -4.596420e-03 -7.006740e-03 -6.948900e-03 -7.006740e-03 -4.596420e-03 -2.449060e-03 -1.903800e-04 1.417620e-03 -8.064400e-04 --2.257000e-04 -8.064400e-04 -5.686000e-05 8.741400e-04 -1.862800e-04 -1.031640e-03 -1.871920e-03 -1.031640e-03 -1.862800e-04 8.741400e-04 -5.686000e-05 -8.064400e-04 -2.257000e-04]; - -mtx = [ 1.000000 ]; - -hi0filt = [... -5.997200e-04 -6.068000e-05 -3.324900e-04 -3.325600e-04 -2.406600e-04 -3.325600e-04 -3.324900e-04 -6.068000e-05 5.997200e-04 --6.068000e-05 1.263100e-04 4.927100e-04 1.459700e-04 -3.732100e-04 1.459700e-04 4.927100e-04 1.263100e-04 -6.068000e-05 --3.324900e-04 4.927100e-04 -1.616650e-03 -1.437358e-02 -2.420138e-02 -1.437358e-02 -1.616650e-03 4.927100e-04 -3.324900e-04 --3.325600e-04 1.459700e-04 -1.437358e-02 -6.300923e-02 -9.623594e-02 -6.300923e-02 -1.437358e-02 1.459700e-04 -3.325600e-04 --2.406600e-04 -3.732100e-04 -2.420138e-02 -9.623594e-02 8.554893e-01 -9.623594e-02 -2.420138e-02 -3.732100e-04 -2.406600e-04 --3.325600e-04 1.459700e-04 -1.437358e-02 -6.300923e-02 -9.623594e-02 -6.300923e-02 -1.437358e-02 1.459700e-04 -3.325600e-04 --3.324900e-04 4.927100e-04 -1.616650e-03 -1.437358e-02 -2.420138e-02 -1.437358e-02 -1.616650e-03 4.927100e-04 -3.324900e-04 --6.068000e-05 1.263100e-04 4.927100e-04 1.459700e-04 -3.732100e-04 1.459700e-04 4.927100e-04 1.263100e-04 -6.068000e-05 -5.997200e-04 -6.068000e-05 -3.324900e-04 -3.325600e-04 -2.406600e-04 -3.325600e-04 -3.324900e-04 -6.068000e-05 5.997200e-04 ]; - -bfilts = [ ... --9.066000e-05 -1.738640e-03 -4.942500e-03 -7.889390e-03 -1.009473e-02 -7.889390e-03 -4.942500e-03 -1.738640e-03 -9.066000e-05 ... --1.738640e-03 -4.625150e-03 -7.272540e-03 -7.623410e-03 -9.091950e-03 -7.623410e-03 -7.272540e-03 -4.625150e-03 -1.738640e-03 ... --4.942500e-03 -7.272540e-03 -2.129540e-02 -2.435662e-02 -3.487008e-02 -2.435662e-02 -2.129540e-02 -7.272540e-03 -4.942500e-03 ... --7.889390e-03 -7.623410e-03 -2.435662e-02 -1.730466e-02 -3.158605e-02 -1.730466e-02 -2.435662e-02 -7.623410e-03 -7.889390e-03 ... --1.009473e-02 -9.091950e-03 -3.487008e-02 -3.158605e-02 9.464195e-01 -3.158605e-02 -3.487008e-02 -9.091950e-03 -1.009473e-02 ... --7.889390e-03 -7.623410e-03 -2.435662e-02 -1.730466e-02 -3.158605e-02 -1.730466e-02 -2.435662e-02 -7.623410e-03 -7.889390e-03 ... --4.942500e-03 -7.272540e-03 -2.129540e-02 -2.435662e-02 -3.487008e-02 -2.435662e-02 -2.129540e-02 -7.272540e-03 -4.942500e-03 ... --1.738640e-03 -4.625150e-03 -7.272540e-03 -7.623410e-03 -9.091950e-03 -7.623410e-03 -7.272540e-03 -4.625150e-03 -1.738640e-03 ... --9.066000e-05 -1.738640e-03 -4.942500e-03 -7.889390e-03 -1.009473e-02 -7.889390e-03 -4.942500e-03 -1.738640e-03 -9.066000e-05 ]'; - diff --git a/evaluation/utils/matlabPyrTools/sp1Filters.m b/evaluation/utils/matlabPyrTools/sp1Filters.m deleted file mode 100755 index 215e651..0000000 --- a/evaluation/utils/matlabPyrTools/sp1Filters.m +++ /dev/null @@ -1,91 +0,0 @@ -% Steerable pyramid filters. Transform described in: -% -% @INPROCEEDINGS{Simoncelli95b, -% TITLE = "The Steerable Pyramid: A Flexible Architecture for -% Multi-Scale Derivative Computation", -% AUTHOR = "E P Simoncelli and W T Freeman", -% BOOKTITLE = "Second Int'l Conf on Image Processing", -% ADDRESS = "Washington, DC", MONTH = "October", YEAR = 1995 } -% -% Filter kernel design described in: -% -%@INPROCEEDINGS{Karasaridis96, -% TITLE = "A Filter Design Technique for -% Steerable Pyramid Image Transforms", -% AUTHOR = "A Karasaridis and E P Simoncelli", -% BOOKTITLE = "ICASSP", ADDRESS = "Atlanta, GA", -% MONTH = "May", YEAR = 1996 } - -% Eero Simoncelli, 6/96. - -function [lo0filt,hi0filt,lofilt,bfilts,mtx,harmonics] = sp1Filters(); - -harmonics = [ 1 ]; - -%% filters only contain first harmonic. -mtx = eye(2); - -lo0filt = [ ... --8.701000e-05 -1.354280e-03 -1.601260e-03 -5.033700e-04 2.524010e-03 -5.033700e-04 -1.601260e-03 -1.354280e-03 -8.701000e-05 --1.354280e-03 2.921580e-03 7.522720e-03 8.224420e-03 1.107620e-03 8.224420e-03 7.522720e-03 2.921580e-03 -1.354280e-03 --1.601260e-03 7.522720e-03 -7.061290e-03 -3.769487e-02 -3.297137e-02 -3.769487e-02 -7.061290e-03 7.522720e-03 -1.601260e-03 --5.033700e-04 8.224420e-03 -3.769487e-02 4.381320e-02 1.811603e-01 4.381320e-02 -3.769487e-02 8.224420e-03 -5.033700e-04 -2.524010e-03 1.107620e-03 -3.297137e-02 1.811603e-01 4.376250e-01 1.811603e-01 -3.297137e-02 1.107620e-03 2.524010e-03 --5.033700e-04 8.224420e-03 -3.769487e-02 4.381320e-02 1.811603e-01 4.381320e-02 -3.769487e-02 8.224420e-03 -5.033700e-04 --1.601260e-03 7.522720e-03 -7.061290e-03 -3.769487e-02 -3.297137e-02 -3.769487e-02 -7.061290e-03 7.522720e-03 -1.601260e-03 --1.354280e-03 2.921580e-03 7.522720e-03 8.224420e-03 1.107620e-03 8.224420e-03 7.522720e-03 2.921580e-03 -1.354280e-03 --8.701000e-05 -1.354280e-03 -1.601260e-03 -5.033700e-04 2.524010e-03 -5.033700e-04 -1.601260e-03 -1.354280e-03 -8.701000e-05 -]; - -lofilt = [ ... --4.350000e-05 1.207800e-04 -6.771400e-04 -1.243400e-04 -8.006400e-04 -1.597040e-03 -2.516800e-04 -4.202000e-04 1.262000e-03 -4.202000e-04 -2.516800e-04 -1.597040e-03 -8.006400e-04 -1.243400e-04 -6.771400e-04 1.207800e-04 -4.350000e-05 ; ... -1.207800e-04 4.460600e-04 -5.814600e-04 5.621600e-04 -1.368800e-04 2.325540e-03 2.889860e-03 4.287280e-03 5.589400e-03 4.287280e-03 2.889860e-03 2.325540e-03 -1.368800e-04 5.621600e-04 -5.814600e-04 4.460600e-04 1.207800e-04 ; ... --6.771400e-04 -5.814600e-04 1.460780e-03 2.160540e-03 3.761360e-03 3.080980e-03 4.112200e-03 2.221220e-03 5.538200e-04 2.221220e-03 4.112200e-03 3.080980e-03 3.761360e-03 2.160540e-03 1.460780e-03 -5.814600e-04 -6.771400e-04 ; ... --1.243400e-04 5.621600e-04 2.160540e-03 3.175780e-03 3.184680e-03 -1.777480e-03 -7.431700e-03 -9.056920e-03 -9.637220e-03 -9.056920e-03 -7.431700e-03 -1.777480e-03 3.184680e-03 3.175780e-03 2.160540e-03 5.621600e-04 -1.243400e-04 ; ... --8.006400e-04 -1.368800e-04 3.761360e-03 3.184680e-03 -3.530640e-03 -1.260420e-02 -1.884744e-02 -1.750818e-02 -1.648568e-02 -1.750818e-02 -1.884744e-02 -1.260420e-02 -3.530640e-03 3.184680e-03 3.761360e-03 -1.368800e-04 -8.006400e-04 ; ... --1.597040e-03 2.325540e-03 3.080980e-03 -1.777480e-03 -1.260420e-02 -2.022938e-02 -1.109170e-02 3.955660e-03 1.438512e-02 3.955660e-03 -1.109170e-02 -2.022938e-02 -1.260420e-02 -1.777480e-03 3.080980e-03 2.325540e-03 -1.597040e-03 ; ... --2.516800e-04 2.889860e-03 4.112200e-03 -7.431700e-03 -1.884744e-02 -1.109170e-02 2.190660e-02 6.806584e-02 9.058014e-02 6.806584e-02 2.190660e-02 -1.109170e-02 -1.884744e-02 -7.431700e-03 4.112200e-03 2.889860e-03 -2.516800e-04 ; ... --4.202000e-04 4.287280e-03 2.221220e-03 -9.056920e-03 -1.750818e-02 3.955660e-03 6.806584e-02 1.445500e-01 1.773651e-01 1.445500e-01 6.806584e-02 3.955660e-03 -1.750818e-02 -9.056920e-03 2.221220e-03 4.287280e-03 -4.202000e-04 ; ... -1.262000e-03 5.589400e-03 5.538200e-04 -9.637220e-03 -1.648568e-02 1.438512e-02 9.058014e-02 1.773651e-01 2.120374e-01 1.773651e-01 9.058014e-02 1.438512e-02 -1.648568e-02 -9.637220e-03 5.538200e-04 5.589400e-03 1.262000e-03 ; ... --4.202000e-04 4.287280e-03 2.221220e-03 -9.056920e-03 -1.750818e-02 3.955660e-03 6.806584e-02 1.445500e-01 1.773651e-01 1.445500e-01 6.806584e-02 3.955660e-03 -1.750818e-02 -9.056920e-03 2.221220e-03 4.287280e-03 -4.202000e-04 ; ... --2.516800e-04 2.889860e-03 4.112200e-03 -7.431700e-03 -1.884744e-02 -1.109170e-02 2.190660e-02 6.806584e-02 9.058014e-02 6.806584e-02 2.190660e-02 -1.109170e-02 -1.884744e-02 -7.431700e-03 4.112200e-03 2.889860e-03 -2.516800e-04 ; ... --1.597040e-03 2.325540e-03 3.080980e-03 -1.777480e-03 -1.260420e-02 -2.022938e-02 -1.109170e-02 3.955660e-03 1.438512e-02 3.955660e-03 -1.109170e-02 -2.022938e-02 -1.260420e-02 -1.777480e-03 3.080980e-03 2.325540e-03 -1.597040e-03 ; ... --8.006400e-04 -1.368800e-04 3.761360e-03 3.184680e-03 -3.530640e-03 -1.260420e-02 -1.884744e-02 -1.750818e-02 -1.648568e-02 -1.750818e-02 -1.884744e-02 -1.260420e-02 -3.530640e-03 3.184680e-03 3.761360e-03 -1.368800e-04 -8.006400e-04 ; ... --1.243400e-04 5.621600e-04 2.160540e-03 3.175780e-03 3.184680e-03 -1.777480e-03 -7.431700e-03 -9.056920e-03 -9.637220e-03 -9.056920e-03 -7.431700e-03 -1.777480e-03 3.184680e-03 3.175780e-03 2.160540e-03 5.621600e-04 -1.243400e-04 ; ... --6.771400e-04 -5.814600e-04 1.460780e-03 2.160540e-03 3.761360e-03 3.080980e-03 4.112200e-03 2.221220e-03 5.538200e-04 2.221220e-03 4.112200e-03 3.080980e-03 3.761360e-03 2.160540e-03 1.460780e-03 -5.814600e-04 -6.771400e-04 ; ... -1.207800e-04 4.460600e-04 -5.814600e-04 5.621600e-04 -1.368800e-04 2.325540e-03 2.889860e-03 4.287280e-03 5.589400e-03 4.287280e-03 2.889860e-03 2.325540e-03 -1.368800e-04 5.621600e-04 -5.814600e-04 4.460600e-04 1.207800e-04 ; ... --4.350000e-05 1.207800e-04 -6.771400e-04 -1.243400e-04 -8.006400e-04 -1.597040e-03 -2.516800e-04 -4.202000e-04 1.262000e-03 -4.202000e-04 -2.516800e-04 -1.597040e-03 -8.006400e-04 -1.243400e-04 -6.771400e-04 1.207800e-04 -4.350000e-05 ]; - -hi0filt = [... --9.570000e-04 -2.424100e-04 -1.424720e-03 -8.742600e-04 -1.166810e-03 -8.742600e-04 -1.424720e-03 -2.424100e-04 -9.570000e-04 ; ... --2.424100e-04 -4.317530e-03 8.998600e-04 9.156420e-03 1.098012e-02 9.156420e-03 8.998600e-04 -4.317530e-03 -2.424100e-04 ; ... --1.424720e-03 8.998600e-04 1.706347e-02 1.094866e-02 -5.897780e-03 1.094866e-02 1.706347e-02 8.998600e-04 -1.424720e-03 ; ... --8.742600e-04 9.156420e-03 1.094866e-02 -7.841370e-02 -1.562827e-01 -7.841370e-02 1.094866e-02 9.156420e-03 -8.742600e-04 ; ... --1.166810e-03 1.098012e-02 -5.897780e-03 -1.562827e-01 7.282593e-01 -1.562827e-01 -5.897780e-03 1.098012e-02 -1.166810e-03 ; ... --8.742600e-04 9.156420e-03 1.094866e-02 -7.841370e-02 -1.562827e-01 -7.841370e-02 1.094866e-02 9.156420e-03 -8.742600e-04 ; ... --1.424720e-03 8.998600e-04 1.706347e-02 1.094866e-02 -5.897780e-03 1.094866e-02 1.706347e-02 8.998600e-04 -1.424720e-03 ; ... --2.424100e-04 -4.317530e-03 8.998600e-04 9.156420e-03 1.098012e-02 9.156420e-03 8.998600e-04 -4.317530e-03 -2.424100e-04 ; ... --9.570000e-04 -2.424100e-04 -1.424720e-03 -8.742600e-04 -1.166810e-03 -8.742600e-04 -1.424720e-03 -2.424100e-04 -9.570000e-04 ]; - -bfilts = -[ ... -6.125880e-03 -8.052600e-03 -2.103714e-02 -1.536890e-02 -1.851466e-02 -1.536890e-02 -2.103714e-02 -8.052600e-03 6.125880e-03 ... --1.287416e-02 -9.611520e-03 1.023569e-02 6.009450e-03 1.872620e-03 6.009450e-03 1.023569e-02 -9.611520e-03 -1.287416e-02 ... --5.641530e-03 4.168400e-03 -2.382180e-02 -5.375324e-02 -2.076086e-02 -5.375324e-02 -2.382180e-02 4.168400e-03 -5.641530e-03 ... --8.957260e-03 -1.751170e-03 -1.836909e-02 1.265655e-01 2.996168e-01 1.265655e-01 -1.836909e-02 -1.751170e-03 -8.957260e-03 ... -0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 0.000000e+00 ... -8.957260e-03 1.751170e-03 1.836909e-02 -1.265655e-01 -2.996168e-01 -1.265655e-01 1.836909e-02 1.751170e-03 8.957260e-03 ... -5.641530e-03 -4.168400e-03 2.382180e-02 5.375324e-02 2.076086e-02 5.375324e-02 2.382180e-02 -4.168400e-03 5.641530e-03 ... -1.287416e-02 9.611520e-03 -1.023569e-02 -6.009450e-03 -1.872620e-03 -6.009450e-03 -1.023569e-02 9.611520e-03 1.287416e-02 ... --6.125880e-03 8.052600e-03 2.103714e-02 1.536890e-02 1.851466e-02 1.536890e-02 2.103714e-02 8.052600e-03 -6.125880e-03; ... -... --6.125880e-03 1.287416e-02 5.641530e-03 8.957260e-03 0.000000e+00 -8.957260e-03 -5.641530e-03 -1.287416e-02 6.125880e-03 ... -8.052600e-03 9.611520e-03 -4.168400e-03 1.751170e-03 0.000000e+00 -1.751170e-03 4.168400e-03 -9.611520e-03 -8.052600e-03 ... -2.103714e-02 -1.023569e-02 2.382180e-02 1.836909e-02 0.000000e+00 -1.836909e-02 -2.382180e-02 1.023569e-02 -2.103714e-02 ... -1.536890e-02 -6.009450e-03 5.375324e-02 -1.265655e-01 0.000000e+00 1.265655e-01 -5.375324e-02 6.009450e-03 -1.536890e-02 ... -1.851466e-02 -1.872620e-03 2.076086e-02 -2.996168e-01 0.000000e+00 2.996168e-01 -2.076086e-02 1.872620e-03 -1.851466e-02 ... -1.536890e-02 -6.009450e-03 5.375324e-02 -1.265655e-01 0.000000e+00 1.265655e-01 -5.375324e-02 6.009450e-03 -1.536890e-02 ... -2.103714e-02 -1.023569e-02 2.382180e-02 1.836909e-02 0.000000e+00 -1.836909e-02 -2.382180e-02 1.023569e-02 -2.103714e-02 ... -8.052600e-03 9.611520e-03 -4.168400e-03 1.751170e-03 0.000000e+00 -1.751170e-03 4.168400e-03 -9.611520e-03 -8.052600e-03 ... --6.125880e-03 1.287416e-02 5.641530e-03 8.957260e-03 0.000000e+00 -8.957260e-03 -5.641530e-03 -1.287416e-02 6.125880e-03 ... -]'; - diff --git a/evaluation/utils/matlabPyrTools/sp3Filters.m b/evaluation/utils/matlabPyrTools/sp3Filters.m deleted file mode 100755 index c9cfaaf..0000000 --- a/evaluation/utils/matlabPyrTools/sp3Filters.m +++ /dev/null @@ -1,121 +0,0 @@ -% Steerable pyramid filters. Transform described in: -% -% @INPROCEEDINGS{Simoncelli95b, -% TITLE = "The Steerable Pyramid: A Flexible Architecture for -% Multi-Scale Derivative Computation", -% AUTHOR = "E P Simoncelli and W T Freeman", -% BOOKTITLE = "Second Int'l Conf on Image Processing", -% ADDRESS = "Washington, DC", MONTH = "October", YEAR = 1995 } -% -% Filter kernel design described in: -% -%@INPROCEEDINGS{Karasaridis96, -% TITLE = "A Filter Design Technique for -% Steerable Pyramid Image Transforms", -% AUTHOR = "A Karasaridis and E P Simoncelli", -% BOOKTITLE = "ICASSP", ADDRESS = "Atlanta, GA", -% MONTH = "May", YEAR = 1996 } - -% Eero Simoncelli, 6/96. - -function [lo0filt,hi0filt,lofilt,bfilts,mtx,harmonics] = sp3Filters(); - -harmonics = [1 3]; - -mtx = [ ... - 0.5000 0.3536 0 -0.3536 - -0.0000 0.3536 0.5000 0.3536 - 0.5000 -0.3536 0 0.3536 - -0.0000 0.3536 -0.5000 0.3536]; - -hi0filt = [ --4.0483998600E-4 -6.2596000498E-4 -3.7829999201E-5 8.8387000142E-4 1.5450799838E-3 1.9235999789E-3 2.0687500946E-3 2.0898699295E-3 2.0687500946E-3 1.9235999789E-3 1.5450799838E-3 8.8387000142E-4 -3.7829999201E-5 -6.2596000498E-4 -4.0483998600E-4 --6.2596000498E-4 -3.2734998967E-4 7.7435001731E-4 1.5874400269E-3 2.1750701126E-3 2.5626500137E-3 2.2892199922E-3 1.9755100366E-3 2.2892199922E-3 2.5626500137E-3 2.1750701126E-3 1.5874400269E-3 7.7435001731E-4 -3.2734998967E-4 -6.2596000498E-4 --3.7829999201E-5 7.7435001731E-4 1.1793200392E-3 1.4050999889E-3 2.2253401112E-3 2.1145299543E-3 3.3578000148E-4 -8.3368999185E-4 3.3578000148E-4 2.1145299543E-3 2.2253401112E-3 1.4050999889E-3 1.1793200392E-3 7.7435001731E-4 -3.7829999201E-5 -8.8387000142E-4 1.5874400269E-3 1.4050999889E-3 1.2960999738E-3 -4.9274001503E-4 -3.1295299996E-3 -4.5751798898E-3 -5.1014497876E-3 -4.5751798898E-3 -3.1295299996E-3 -4.9274001503E-4 1.2960999738E-3 1.4050999889E-3 1.5874400269E-3 8.8387000142E-4 -1.5450799838E-3 2.1750701126E-3 2.2253401112E-3 -4.9274001503E-4 -6.3222697936E-3 -2.7556000277E-3 5.3632198833E-3 7.3032598011E-3 5.3632198833E-3 -2.7556000277E-3 -6.3222697936E-3 -4.9274001503E-4 2.2253401112E-3 2.1750701126E-3 1.5450799838E-3 -1.9235999789E-3 2.5626500137E-3 2.1145299543E-3 -3.1295299996E-3 -2.7556000277E-3 1.3962360099E-2 7.8046298586E-3 -9.3812197447E-3 7.8046298586E-3 1.3962360099E-2 -2.7556000277E-3 -3.1295299996E-3 2.1145299543E-3 2.5626500137E-3 1.9235999789E-3 -2.0687500946E-3 2.2892199922E-3 3.3578000148E-4 -4.5751798898E-3 5.3632198833E-3 7.8046298586E-3 -7.9501636326E-2 -0.1554141641 -7.9501636326E-2 7.8046298586E-3 5.3632198833E-3 -4.5751798898E-3 3.3578000148E-4 2.2892199922E-3 2.0687500946E-3 -2.0898699295E-3 1.9755100366E-3 -8.3368999185E-4 -5.1014497876E-3 7.3032598011E-3 -9.3812197447E-3 -0.1554141641 0.7303866148 -0.1554141641 -9.3812197447E-3 7.3032598011E-3 -5.1014497876E-3 -8.3368999185E-4 1.9755100366E-3 2.0898699295E-3 -2.0687500946E-3 2.2892199922E-3 3.3578000148E-4 -4.5751798898E-3 5.3632198833E-3 7.8046298586E-3 -7.9501636326E-2 -0.1554141641 -7.9501636326E-2 7.8046298586E-3 5.3632198833E-3 -4.5751798898E-3 3.3578000148E-4 2.2892199922E-3 2.0687500946E-3 -1.9235999789E-3 2.5626500137E-3 2.1145299543E-3 -3.1295299996E-3 -2.7556000277E-3 1.3962360099E-2 7.8046298586E-3 -9.3812197447E-3 7.8046298586E-3 1.3962360099E-2 -2.7556000277E-3 -3.1295299996E-3 2.1145299543E-3 2.5626500137E-3 1.9235999789E-3 -1.5450799838E-3 2.1750701126E-3 2.2253401112E-3 -4.9274001503E-4 -6.3222697936E-3 -2.7556000277E-3 5.3632198833E-3 7.3032598011E-3 5.3632198833E-3 -2.7556000277E-3 -6.3222697936E-3 -4.9274001503E-4 2.2253401112E-3 2.1750701126E-3 1.5450799838E-3 -8.8387000142E-4 1.5874400269E-3 1.4050999889E-3 1.2960999738E-3 -4.9274001503E-4 -3.1295299996E-3 -4.5751798898E-3 -5.1014497876E-3 -4.5751798898E-3 -3.1295299996E-3 -4.9274001503E-4 1.2960999738E-3 1.4050999889E-3 1.5874400269E-3 8.8387000142E-4 --3.7829999201E-5 7.7435001731E-4 1.1793200392E-3 1.4050999889E-3 2.2253401112E-3 2.1145299543E-3 3.3578000148E-4 -8.3368999185E-4 3.3578000148E-4 2.1145299543E-3 2.2253401112E-3 1.4050999889E-3 1.1793200392E-3 7.7435001731E-4 -3.7829999201E-5 --6.2596000498E-4 -3.2734998967E-4 7.7435001731E-4 1.5874400269E-3 2.1750701126E-3 2.5626500137E-3 2.2892199922E-3 1.9755100366E-3 2.2892199922E-3 2.5626500137E-3 2.1750701126E-3 1.5874400269E-3 7.7435001731E-4 -3.2734998967E-4 -6.2596000498E-4 --4.0483998600E-4 -6.2596000498E-4 -3.7829999201E-5 8.8387000142E-4 1.5450799838E-3 1.9235999789E-3 2.0687500946E-3 2.0898699295E-3 2.0687500946E-3 1.9235999789E-3 1.5450799838E-3 8.8387000142E-4 -3.7829999201E-5 -6.2596000498E-4 -4.0483998600E-4 -]; - -lo0filt = [ --8.7009997515E-5 -1.3542800443E-3 -1.6012600390E-3 -5.0337001448E-4 2.5240099058E-3 -5.0337001448E-4 -1.6012600390E-3 -1.3542800443E-3 -8.7009997515E-5 --1.3542800443E-3 2.9215801042E-3 7.5227199122E-3 8.2244202495E-3 1.1076199589E-3 8.2244202495E-3 7.5227199122E-3 2.9215801042E-3 -1.3542800443E-3 --1.6012600390E-3 7.5227199122E-3 -7.0612900890E-3 -3.7694871426E-2 -3.2971370965E-2 -3.7694871426E-2 -7.0612900890E-3 7.5227199122E-3 -1.6012600390E-3 --5.0337001448E-4 8.2244202495E-3 -3.7694871426E-2 4.3813198805E-2 0.1811603010 4.3813198805E-2 -3.7694871426E-2 8.2244202495E-3 -5.0337001448E-4 -2.5240099058E-3 1.1076199589E-3 -3.2971370965E-2 0.1811603010 0.4376249909 0.1811603010 -3.2971370965E-2 1.1076199589E-3 2.5240099058E-3 --5.0337001448E-4 8.2244202495E-3 -3.7694871426E-2 4.3813198805E-2 0.1811603010 4.3813198805E-2 -3.7694871426E-2 8.2244202495E-3 -5.0337001448E-4 --1.6012600390E-3 7.5227199122E-3 -7.0612900890E-3 -3.7694871426E-2 -3.2971370965E-2 -3.7694871426E-2 -7.0612900890E-3 7.5227199122E-3 -1.6012600390E-3 --1.3542800443E-3 2.9215801042E-3 7.5227199122E-3 8.2244202495E-3 1.1076199589E-3 8.2244202495E-3 7.5227199122E-3 2.9215801042E-3 -1.3542800443E-3 --8.7009997515E-5 -1.3542800443E-3 -1.6012600390E-3 -5.0337001448E-4 2.5240099058E-3 -5.0337001448E-4 -1.6012600390E-3 -1.3542800443E-3 -8.7009997515E-5 -]; - -lofilt = [ --4.3500000174E-5 1.2078000145E-4 -6.7714002216E-4 -1.2434000382E-4 -8.0063997302E-4 -1.5970399836E-3 -2.5168000138E-4 -4.2019999819E-4 1.2619999470E-3 -4.2019999819E-4 -2.5168000138E-4 -1.5970399836E-3 -8.0063997302E-4 -1.2434000382E-4 -6.7714002216E-4 1.2078000145E-4 -4.3500000174E-5 -1.2078000145E-4 4.4606000301E-4 -5.8146001538E-4 5.6215998484E-4 -1.3688000035E-4 2.3255399428E-3 2.8898599558E-3 4.2872801423E-3 5.5893999524E-3 4.2872801423E-3 2.8898599558E-3 2.3255399428E-3 -1.3688000035E-4 5.6215998484E-4 -5.8146001538E-4 4.4606000301E-4 1.2078000145E-4 --6.7714002216E-4 -5.8146001538E-4 1.4607800404E-3 2.1605400834E-3 3.7613599561E-3 3.0809799209E-3 4.1121998802E-3 2.2212199401E-3 5.5381999118E-4 2.2212199401E-3 4.1121998802E-3 3.0809799209E-3 3.7613599561E-3 2.1605400834E-3 1.4607800404E-3 -5.8146001538E-4 -6.7714002216E-4 --1.2434000382E-4 5.6215998484E-4 2.1605400834E-3 3.1757799443E-3 3.1846798956E-3 -1.7774800071E-3 -7.4316998944E-3 -9.0569201857E-3 -9.6372198313E-3 -9.0569201857E-3 -7.4316998944E-3 -1.7774800071E-3 3.1846798956E-3 3.1757799443E-3 2.1605400834E-3 5.6215998484E-4 -1.2434000382E-4 --8.0063997302E-4 -1.3688000035E-4 3.7613599561E-3 3.1846798956E-3 -3.5306399222E-3 -1.2604200281E-2 -1.8847439438E-2 -1.7508180812E-2 -1.6485679895E-2 -1.7508180812E-2 -1.8847439438E-2 -1.2604200281E-2 -3.5306399222E-3 3.1846798956E-3 3.7613599561E-3 -1.3688000035E-4 -8.0063997302E-4 --1.5970399836E-3 2.3255399428E-3 3.0809799209E-3 -1.7774800071E-3 -1.2604200281E-2 -2.0229380578E-2 -1.1091699824E-2 3.9556599222E-3 1.4385120012E-2 3.9556599222E-3 -1.1091699824E-2 -2.0229380578E-2 -1.2604200281E-2 -1.7774800071E-3 3.0809799209E-3 2.3255399428E-3 -1.5970399836E-3 --2.5168000138E-4 2.8898599558E-3 4.1121998802E-3 -7.4316998944E-3 -1.8847439438E-2 -1.1091699824E-2 2.1906599402E-2 6.8065837026E-2 9.0580143034E-2 6.8065837026E-2 2.1906599402E-2 -1.1091699824E-2 -1.8847439438E-2 -7.4316998944E-3 4.1121998802E-3 2.8898599558E-3 -2.5168000138E-4 --4.2019999819E-4 4.2872801423E-3 2.2212199401E-3 -9.0569201857E-3 -1.7508180812E-2 3.9556599222E-3 6.8065837026E-2 0.1445499808 0.1773651242 0.1445499808 6.8065837026E-2 3.9556599222E-3 -1.7508180812E-2 -9.0569201857E-3 2.2212199401E-3 4.2872801423E-3 -4.2019999819E-4 -1.2619999470E-3 5.5893999524E-3 5.5381999118E-4 -9.6372198313E-3 -1.6485679895E-2 1.4385120012E-2 9.0580143034E-2 0.1773651242 0.2120374441 0.1773651242 9.0580143034E-2 1.4385120012E-2 -1.6485679895E-2 -9.6372198313E-3 5.5381999118E-4 5.5893999524E-3 1.2619999470E-3 --4.2019999819E-4 4.2872801423E-3 2.2212199401E-3 -9.0569201857E-3 -1.7508180812E-2 3.9556599222E-3 6.8065837026E-2 0.1445499808 0.1773651242 0.1445499808 6.8065837026E-2 3.9556599222E-3 -1.7508180812E-2 -9.0569201857E-3 2.2212199401E-3 4.2872801423E-3 -4.2019999819E-4 --2.5168000138E-4 2.8898599558E-3 4.1121998802E-3 -7.4316998944E-3 -1.8847439438E-2 -1.1091699824E-2 2.1906599402E-2 6.8065837026E-2 9.0580143034E-2 6.8065837026E-2 2.1906599402E-2 -1.1091699824E-2 -1.8847439438E-2 -7.4316998944E-3 4.1121998802E-3 2.8898599558E-3 -2.5168000138E-4 --1.5970399836E-3 2.3255399428E-3 3.0809799209E-3 -1.7774800071E-3 -1.2604200281E-2 -2.0229380578E-2 -1.1091699824E-2 3.9556599222E-3 1.4385120012E-2 3.9556599222E-3 -1.1091699824E-2 -2.0229380578E-2 -1.2604200281E-2 -1.7774800071E-3 3.0809799209E-3 2.3255399428E-3 -1.5970399836E-3 --8.0063997302E-4 -1.3688000035E-4 3.7613599561E-3 3.1846798956E-3 -3.5306399222E-3 -1.2604200281E-2 -1.8847439438E-2 -1.7508180812E-2 -1.6485679895E-2 -1.7508180812E-2 -1.8847439438E-2 -1.2604200281E-2 -3.5306399222E-3 3.1846798956E-3 3.7613599561E-3 -1.3688000035E-4 -8.0063997302E-4 --1.2434000382E-4 5.6215998484E-4 2.1605400834E-3 3.1757799443E-3 3.1846798956E-3 -1.7774800071E-3 -7.4316998944E-3 -9.0569201857E-3 -9.6372198313E-3 -9.0569201857E-3 -7.4316998944E-3 -1.7774800071E-3 3.1846798956E-3 3.1757799443E-3 2.1605400834E-3 5.6215998484E-4 -1.2434000382E-4 --6.7714002216E-4 -5.8146001538E-4 1.4607800404E-3 2.1605400834E-3 3.7613599561E-3 3.0809799209E-3 4.1121998802E-3 2.2212199401E-3 5.5381999118E-4 2.2212199401E-3 4.1121998802E-3 3.0809799209E-3 3.7613599561E-3 2.1605400834E-3 1.4607800404E-3 -5.8146001538E-4 -6.7714002216E-4 -1.2078000145E-4 4.4606000301E-4 -5.8146001538E-4 5.6215998484E-4 -1.3688000035E-4 2.3255399428E-3 2.8898599558E-3 4.2872801423E-3 5.5893999524E-3 4.2872801423E-3 2.8898599558E-3 2.3255399428E-3 -1.3688000035E-4 5.6215998484E-4 -5.8146001538E-4 4.4606000301E-4 1.2078000145E-4 --4.3500000174E-5 1.2078000145E-4 -6.7714002216E-4 -1.2434000382E-4 -8.0063997302E-4 -1.5970399836E-3 -2.5168000138E-4 -4.2019999819E-4 1.2619999470E-3 -4.2019999819E-4 -2.5168000138E-4 -1.5970399836E-3 -8.0063997302E-4 -1.2434000382E-4 -6.7714002216E-4 1.2078000145E-4 -4.3500000174E-5 -]; - -bfilts = [... --8.1125000725E-4 4.4451598078E-3 1.2316980399E-2 1.3955879956E-2 1.4179450460E-2 1.3955879956E-2 1.2316980399E-2 4.4451598078E-3 -8.1125000725E-4 ... -3.9103501476E-3 4.4565401040E-3 -5.8724298142E-3 -2.8760801069E-3 8.5267601535E-3 -2.8760801069E-3 -5.8724298142E-3 4.4565401040E-3 3.9103501476E-3 ... -1.3462699717E-3 -3.7740699481E-3 8.2581602037E-3 3.9442278445E-2 5.3605638444E-2 3.9442278445E-2 8.2581602037E-3 -3.7740699481E-3 1.3462699717E-3 ... -7.4700999539E-4 -3.6522001028E-4 -2.2522680461E-2 -0.1105690673 -0.1768419296 -0.1105690673 -2.2522680461E-2 -3.6522001028E-4 7.4700999539E-4 ... -0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 0.0000000000 ... --7.4700999539E-4 3.6522001028E-4 2.2522680461E-2 0.1105690673 0.1768419296 0.1105690673 2.2522680461E-2 3.6522001028E-4 -7.4700999539E-4 ... --1.3462699717E-3 3.7740699481E-3 -8.2581602037E-3 -3.9442278445E-2 -5.3605638444E-2 -3.9442278445E-2 -8.2581602037E-3 3.7740699481E-3 -1.3462699717E-3 ... --3.9103501476E-3 -4.4565401040E-3 5.8724298142E-3 2.8760801069E-3 -8.5267601535E-3 2.8760801069E-3 5.8724298142E-3 -4.4565401040E-3 -3.9103501476E-3 ... -8.1125000725E-4 -4.4451598078E-3 -1.2316980399E-2 -1.3955879956E-2 -1.4179450460E-2 -1.3955879956E-2 -1.2316980399E-2 -4.4451598078E-3 8.1125000725E-4; ... -... -0.0000000000 -8.2846998703E-4 -5.7109999034E-5 4.0110000555E-5 4.6670897864E-3 8.0871898681E-3 1.4807609841E-2 8.6204400286E-3 -3.1221499667E-3 ... -8.2846998703E-4 0.0000000000 -9.7479997203E-4 -6.9718998857E-3 -2.0865600090E-3 2.3298799060E-3 -4.4814897701E-3 1.4917500317E-2 8.6204400286E-3 ... -5.7109999034E-5 9.7479997203E-4 0.0000000000 -1.2145539746E-2 -2.4427289143E-2 5.0797060132E-2 3.2785870135E-2 -4.4814897701E-3 1.4807609841E-2 ... --4.0110000555E-5 6.9718998857E-3 1.2145539746E-2 0.0000000000 -0.1510555595 -8.2495503128E-2 5.0797060132E-2 2.3298799060E-3 8.0871898681E-3 ... --4.6670897864E-3 2.0865600090E-3 2.4427289143E-2 0.1510555595 0.0000000000 -0.1510555595 -2.4427289143E-2 -2.0865600090E-3 4.6670897864E-3 ... --8.0871898681E-3 -2.3298799060E-3 -5.0797060132E-2 8.2495503128E-2 0.1510555595 0.0000000000 -1.2145539746E-2 -6.9718998857E-3 4.0110000555E-5 ... --1.4807609841E-2 4.4814897701E-3 -3.2785870135E-2 -5.0797060132E-2 2.4427289143E-2 1.2145539746E-2 0.0000000000 -9.7479997203E-4 -5.7109999034E-5 ... --8.6204400286E-3 -1.4917500317E-2 4.4814897701E-3 -2.3298799060E-3 2.0865600090E-3 6.9718998857E-3 9.7479997203E-4 0.0000000000 -8.2846998703E-4 ... -3.1221499667E-3 -8.6204400286E-3 -1.4807609841E-2 -8.0871898681E-3 -4.6670897864E-3 -4.0110000555E-5 5.7109999034E-5 8.2846998703E-4 0.0000000000; ... -... -8.1125000725E-4 -3.9103501476E-3 -1.3462699717E-3 -7.4700999539E-4 0.0000000000 7.4700999539E-4 1.3462699717E-3 3.9103501476E-3 -8.1125000725E-4 ... --4.4451598078E-3 -4.4565401040E-3 3.7740699481E-3 3.6522001028E-4 0.0000000000 -3.6522001028E-4 -3.7740699481E-3 4.4565401040E-3 4.4451598078E-3 ... --1.2316980399E-2 5.8724298142E-3 -8.2581602037E-3 2.2522680461E-2 0.0000000000 -2.2522680461E-2 8.2581602037E-3 -5.8724298142E-3 1.2316980399E-2 ... --1.3955879956E-2 2.8760801069E-3 -3.9442278445E-2 0.1105690673 0.0000000000 -0.1105690673 3.9442278445E-2 -2.8760801069E-3 1.3955879956E-2 ... --1.4179450460E-2 -8.5267601535E-3 -5.3605638444E-2 0.1768419296 0.0000000000 -0.1768419296 5.3605638444E-2 8.5267601535E-3 1.4179450460E-2 ... --1.3955879956E-2 2.8760801069E-3 -3.9442278445E-2 0.1105690673 0.0000000000 -0.1105690673 3.9442278445E-2 -2.8760801069E-3 1.3955879956E-2 ... --1.2316980399E-2 5.8724298142E-3 -8.2581602037E-3 2.2522680461E-2 0.0000000000 -2.2522680461E-2 8.2581602037E-3 -5.8724298142E-3 1.2316980399E-2 ... --4.4451598078E-3 -4.4565401040E-3 3.7740699481E-3 3.6522001028E-4 0.0000000000 -3.6522001028E-4 -3.7740699481E-3 4.4565401040E-3 4.4451598078E-3 ... -8.1125000725E-4 -3.9103501476E-3 -1.3462699717E-3 -7.4700999539E-4 0.0000000000 7.4700999539E-4 1.3462699717E-3 3.9103501476E-3 -8.1125000725E-4; ... -... -3.1221499667E-3 -8.6204400286E-3 -1.4807609841E-2 -8.0871898681E-3 -4.6670897864E-3 -4.0110000555E-5 5.7109999034E-5 8.2846998703E-4 0.0000000000 ... --8.6204400286E-3 -1.4917500317E-2 4.4814897701E-3 -2.3298799060E-3 2.0865600090E-3 6.9718998857E-3 9.7479997203E-4 -0.0000000000 -8.2846998703E-4 ... --1.4807609841E-2 4.4814897701E-3 -3.2785870135E-2 -5.0797060132E-2 2.4427289143E-2 1.2145539746E-2 0.0000000000 -9.7479997203E-4 -5.7109999034E-5 ... --8.0871898681E-3 -2.3298799060E-3 -5.0797060132E-2 8.2495503128E-2 0.1510555595 -0.0000000000 -1.2145539746E-2 -6.9718998857E-3 4.0110000555E-5 ... --4.6670897864E-3 2.0865600090E-3 2.4427289143E-2 0.1510555595 0.0000000000 -0.1510555595 -2.4427289143E-2 -2.0865600090E-3 4.6670897864E-3 ... --4.0110000555E-5 6.9718998857E-3 1.2145539746E-2 0.0000000000 -0.1510555595 -8.2495503128E-2 5.0797060132E-2 2.3298799060E-3 8.0871898681E-3 ... -5.7109999034E-5 9.7479997203E-4 -0.0000000000 -1.2145539746E-2 -2.4427289143E-2 5.0797060132E-2 3.2785870135E-2 -4.4814897701E-3 1.4807609841E-2 ... -8.2846998703E-4 -0.0000000000 -9.7479997203E-4 -6.9718998857E-3 -2.0865600090E-3 2.3298799060E-3 -4.4814897701E-3 1.4917500317E-2 8.6204400286E-3 ... -0.0000000000 -8.2846998703E-4 -5.7109999034E-5 4.0110000555E-5 4.6670897864E-3 8.0871898681E-3 1.4807609841E-2 8.6204400286E-3 -3.1221499667E-3 ... -]'; diff --git a/evaluation/utils/matlabPyrTools/sp5Filters.m b/evaluation/utils/matlabPyrTools/sp5Filters.m deleted file mode 100755 index 4cddcfd..0000000 --- a/evaluation/utils/matlabPyrTools/sp5Filters.m +++ /dev/null @@ -1,110 +0,0 @@ -% Steerable pyramid filters. Transform described in: -% -% @INPROCEEDINGS{Simoncelli95b, -% TITLE = "The Steerable Pyramid: A Flexible Architecture for -% Multi-Scale Derivative Computation", -% AUTHOR = "E P Simoncelli and W T Freeman", -% BOOKTITLE = "Second Int'l Conf on Image Processing", -% ADDRESS = "Washington, DC", MONTH = "October", YEAR = 1995 } -% -% Filter kernel design described in: -% -%@INPROCEEDINGS{Karasaridis96, -% TITLE = "A Filter Design Technique for -% Steerable Pyramid Image Transforms", -% AUTHOR = "A Karasaridis and E P Simoncelli", -% BOOKTITLE = "ICASSP", ADDRESS = "Atlanta, GA", -% MONTH = "May", YEAR = 1996 } - -% Eero Simoncelli, 6/96. - -function [lo0filt,hi0filt,lofilt,bfilts,mtx,harmonics] = sp5Filters(); - -harmonics = [1 3 5]; - -mtx = [ ... - 0.3333 0.2887 0.1667 0.0000 -0.1667 -0.2887 - 0.0000 0.1667 0.2887 0.3333 0.2887 0.1667 - 0.3333 -0.0000 -0.3333 -0.0000 0.3333 -0.0000 - 0.0000 0.3333 0.0000 -0.3333 0.0000 0.3333 - 0.3333 -0.2887 0.1667 -0.0000 -0.1667 0.2887 - -0.0000 0.1667 -0.2887 0.3333 -0.2887 0.1667]; - -hi0filt = [ --0.00033429 -0.00113093 -0.00171484 -0.00133542 -0.00080639 -0.00133542 -0.00171484 -0.00113093 -0.00033429 --0.00113093 -0.00350017 -0.00243812 0.00631653 0.01261227 0.00631653 -0.00243812 -0.00350017 -0.00113093 --0.00171484 -0.00243812 -0.00290081 -0.00673482 -0.00981051 -0.00673482 -0.00290081 -0.00243812 -0.00171484 --0.00133542 0.00631653 -0.00673482 -0.07027679 -0.11435863 -0.07027679 -0.00673482 0.00631653 -0.00133542 --0.00080639 0.01261227 -0.00981051 -0.11435863 0.81380200 -0.11435863 -0.00981051 0.01261227 -0.00080639 --0.00133542 0.00631653 -0.00673482 -0.07027679 -0.11435863 -0.07027679 -0.00673482 0.00631653 -0.00133542 --0.00171484 -0.00243812 -0.00290081 -0.00673482 -0.00981051 -0.00673482 -0.00290081 -0.00243812 -0.00171484 --0.00113093 -0.00350017 -0.00243812 0.00631653 0.01261227 0.00631653 -0.00243812 -0.00350017 -0.00113093 --0.00033429 -0.00113093 -0.00171484 -0.00133542 -0.00080639 -0.00133542 -0.00171484 -0.00113093 -0.00033429]; - - -lo0filt = [ -0.00341614 -0.01551246 -0.03848215 -0.01551246 0.00341614 --0.01551246 0.05586982 0.15925570 0.05586982 -0.01551246 --0.03848215 0.15925570 0.40304148 0.15925570 -0.03848215 --0.01551246 0.05586982 0.15925570 0.05586982 -0.01551246 -0.00341614 -0.01551246 -0.03848215 -0.01551246 0.00341614]; - -lofilt = 2*[ -0.00085404 -0.00244917 -0.00387812 -0.00944432 -0.00962054 -0.00944432 -0.00387812 -0.00244917 0.00085404 --0.00244917 -0.00523281 -0.00661117 0.00410600 0.01002988 0.00410600 -0.00661117 -0.00523281 -0.00244917 --0.00387812 -0.00661117 0.01396746 0.03277038 0.03981393 0.03277038 0.01396746 -0.00661117 -0.00387812 --0.00944432 0.00410600 0.03277038 0.06426333 0.08169618 0.06426333 0.03277038 0.00410600 -0.00944432 --0.00962054 0.01002988 0.03981393 0.08169618 0.10096540 0.08169618 0.03981393 0.01002988 -0.00962054 --0.00944432 0.00410600 0.03277038 0.06426333 0.08169618 0.06426333 0.03277038 0.00410600 -0.00944432 --0.00387812 -0.00661117 0.01396746 0.03277038 0.03981393 0.03277038 0.01396746 -0.00661117 -0.00387812 --0.00244917 -0.00523281 -0.00661117 0.00410600 0.01002988 0.00410600 -0.00661117 -0.00523281 -0.00244917 -0.00085404 -0.00244917 -0.00387812 -0.00944432 -0.00962054 -0.00944432 -0.00387812 -0.00244917 0.00085404]; - -bfilts = [... - 0.00277643 0.00496194 0.01026699 0.01455399 0.01026699 0.00496194 0.00277643 ... --0.00986904 -0.00893064 0.01189859 0.02755155 0.01189859 -0.00893064 -0.00986904 ... --0.01021852 -0.03075356 -0.08226445 -0.11732297 -0.08226445 -0.03075356 -0.01021852 ... - 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 0.00000000 ... - 0.01021852 0.03075356 0.08226445 0.11732297 0.08226445 0.03075356 0.01021852 ... - 0.00986904 0.00893064 -0.01189859 -0.02755155 -0.01189859 0.00893064 0.00986904 ... --0.00277643 -0.00496194 -0.01026699 -0.01455399 -0.01026699 -0.00496194 -0.00277643; -... --0.00343249 -0.00640815 -0.00073141 0.01124321 0.00182078 0.00285723 0.01166982 ... --0.00358461 -0.01977507 -0.04084211 -0.00228219 0.03930573 0.01161195 0.00128000 ... - 0.01047717 0.01486305 -0.04819057 -0.12227230 -0.05394139 0.00853965 -0.00459034 ... - 0.00790407 0.04435647 0.09454202 -0.00000000 -0.09454202 -0.04435647 -0.00790407 ... - 0.00459034 -0.00853965 0.05394139 0.12227230 0.04819057 -0.01486305 -0.01047717 ... --0.00128000 -0.01161195 -0.03930573 0.00228219 0.04084211 0.01977507 0.00358461 ... --0.01166982 -0.00285723 -0.00182078 -0.01124321 0.00073141 0.00640815 0.00343249; -... - 0.00343249 0.00358461 -0.01047717 -0.00790407 -0.00459034 0.00128000 0.01166982 ... - 0.00640815 0.01977507 -0.01486305 -0.04435647 0.00853965 0.01161195 0.00285723 ... - 0.00073141 0.04084211 0.04819057 -0.09454202 -0.05394139 0.03930573 0.00182078 ... --0.01124321 0.00228219 0.12227230 -0.00000000 -0.12227230 -0.00228219 0.01124321 ... --0.00182078 -0.03930573 0.05394139 0.09454202 -0.04819057 -0.04084211 -0.00073141 ... --0.00285723 -0.01161195 -0.00853965 0.04435647 0.01486305 -0.01977507 -0.00640815 ... --0.01166982 -0.00128000 0.00459034 0.00790407 0.01047717 -0.00358461 -0.00343249; -... --0.00277643 0.00986904 0.01021852 -0.00000000 -0.01021852 -0.00986904 0.00277643 ... --0.00496194 0.00893064 0.03075356 -0.00000000 -0.03075356 -0.00893064 0.00496194 ... --0.01026699 -0.01189859 0.08226445 -0.00000000 -0.08226445 0.01189859 0.01026699 ... --0.01455399 -0.02755155 0.11732297 -0.00000000 -0.11732297 0.02755155 0.01455399 ... --0.01026699 -0.01189859 0.08226445 -0.00000000 -0.08226445 0.01189859 0.01026699 ... --0.00496194 0.00893064 0.03075356 -0.00000000 -0.03075356 -0.00893064 0.00496194 ... --0.00277643 0.00986904 0.01021852 -0.00000000 -0.01021852 -0.00986904 0.00277643; -... --0.01166982 -0.00128000 0.00459034 0.00790407 0.01047717 -0.00358461 -0.00343249 ... --0.00285723 -0.01161195 -0.00853965 0.04435647 0.01486305 -0.01977507 -0.00640815 ... --0.00182078 -0.03930573 0.05394139 0.09454202 -0.04819057 -0.04084211 -0.00073141 ... --0.01124321 0.00228219 0.12227230 -0.00000000 -0.12227230 -0.00228219 0.01124321 ... - 0.00073141 0.04084211 0.04819057 -0.09454202 -0.05394139 0.03930573 0.00182078 ... - 0.00640815 0.01977507 -0.01486305 -0.04435647 0.00853965 0.01161195 0.00285723 ... - 0.00343249 0.00358461 -0.01047717 -0.00790407 -0.00459034 0.00128000 0.01166982; -... --0.01166982 -0.00285723 -0.00182078 -0.01124321 0.00073141 0.00640815 0.00343249 ... --0.00128000 -0.01161195 -0.03930573 0.00228219 0.04084211 0.01977507 0.00358461 ... - 0.00459034 -0.00853965 0.05394139 0.12227230 0.04819057 -0.01486305 -0.01047717 ... - 0.00790407 0.04435647 0.09454202 -0.00000000 -0.09454202 -0.04435647 -0.00790407 ... - 0.01047717 0.01486305 -0.04819057 -0.12227230 -0.05394139 0.00853965 -0.00459034 ... --0.00358461 -0.01977507 -0.04084211 -0.00228219 0.03930573 0.01161195 0.00128000 ... --0.00343249 -0.00640815 -0.00073141 0.01124321 0.00182078 0.00285723 0.01166982]'; diff --git a/evaluation/utils/matlabPyrTools/spyrBand.m b/evaluation/utils/matlabPyrTools/spyrBand.m deleted file mode 100755 index 474a8dc..0000000 --- a/evaluation/utils/matlabPyrTools/spyrBand.m +++ /dev/null @@ -1,34 +0,0 @@ -% [LEV,IND] = spyrBand(PYR,INDICES,LEVEL,BAND) -% -% Access a band from a steerable pyramid. -% -% LEVEL indicates the scale (finest = 1, coarsest = spyrHt(INDICES)). -% -% BAND (optional, default=1) indicates which subband -% (1 = vertical, rest proceeding anti-clockwise). - -% Eero Simoncelli, 6/96. - -function res = spyrBand(pyr,pind,level,band) - -if (exist('level') ~= 1) - level = 1; -end - -if (exist('band') ~= 1) - band = 1; -end - -nbands = spyrNumBands(pind); -if ((band > nbands) | (band < 1)) - error(sprintf('Bad band number (%d) should be in range [1,%d].', band, nbands)); -end - -maxLev = spyrHt(pind); -if ((level > maxLev) | (level < 1)) - error(sprintf('Bad level number (%d), should be in range [1,%d].', level, maxLev)); -end - -firstband = 1 + band + nbands*(level-1); -res = pyrBand(pyr, pind, firstband); - diff --git a/evaluation/utils/matlabPyrTools/spyrHigh.m b/evaluation/utils/matlabPyrTools/spyrHigh.m deleted file mode 100755 index f91b466..0000000 --- a/evaluation/utils/matlabPyrTools/spyrHigh.m +++ /dev/null @@ -1,10 +0,0 @@ -% RES = spyrHigh(PYR, INDICES) -% -% Access the highpass residual band from a steerable pyramid. - -% Eero Simoncelli, 6/96. - -function res = spyrHigh(pyr,pind) - -res = pyrBand(pyr, pind, 1); - diff --git a/evaluation/utils/matlabPyrTools/spyrHt.m b/evaluation/utils/matlabPyrTools/spyrHt.m deleted file mode 100755 index 8706b9e..0000000 --- a/evaluation/utils/matlabPyrTools/spyrHt.m +++ /dev/null @@ -1,16 +0,0 @@ -% [HEIGHT] = spyrHt(INDICES) -% -% Compute height of steerable pyramid with given index matrix. - -% Eero Simoncelli, 6/96. - -function [ht] = spyrHt(pind) - -nbands = spyrNumBands(pind); - -% Don't count lowpass, or highpass residual bands -if (size(pind,1) > 2) - ht = (size(pind,1)-2)/nbands; -else - ht = 0; -end diff --git a/evaluation/utils/matlabPyrTools/spyrLev.m b/evaluation/utils/matlabPyrTools/spyrLev.m deleted file mode 100755 index 5cb4a85..0000000 --- a/evaluation/utils/matlabPyrTools/spyrLev.m +++ /dev/null @@ -1,24 +0,0 @@ -% [LEV,IND] = spyrLev(PYR,INDICES,LEVEL) -% -% Access a level from a steerable pyramid. -% Return as an SxB matrix, B = number of bands, S = total size of a band. -% Also returns an Bx2 matrix containing dimensions of the subbands. - -% Eero Simoncelli, 6/96. - -function [lev,ind] = spyrLev(pyr,pind,level) - -nbands = spyrNumBands(pind); - -if ((level > spyrHt(pind)) | (level < 1)) - error(sprintf('Level number must be in the range [1, %d].', spyrHt(pind))); -end - -firstband = 2 + nbands*(level-1); -firstind = 1; -for l=1:firstband-1 - firstind = firstind + prod(pind(l,:)); -end - -ind = pind(firstband:firstband+nbands-1,:); -lev = pyr(firstind:firstind+sum(prod(ind'))-1); diff --git a/evaluation/utils/matlabPyrTools/spyrNumBands.m b/evaluation/utils/matlabPyrTools/spyrNumBands.m deleted file mode 100755 index 68aec3f..0000000 --- a/evaluation/utils/matlabPyrTools/spyrNumBands.m +++ /dev/null @@ -1,20 +0,0 @@ -% [NBANDS] = spyrNumBands(INDICES) -% -% Compute number of orientation bands in a steerable pyramid with -% given index matrix. If the pyramid contains only the highpass and -% lowpass bands (i.e., zero levels), returns 0. - -% Eero Simoncelli, 2/97. - -function [nbands] = spyrNumBands(pind) - -if (size(pind,1) == 2) - nbands = 0; -else - % Count number of orientation bands: - b = 3; - while ((b <= size(pind,1)) & all( pind(b,:) == pind(2,:)) ) - b = b+1; - end - nbands = b-2; -end diff --git a/evaluation/utils/matlabPyrTools/steer.m b/evaluation/utils/matlabPyrTools/steer.m deleted file mode 100755 index 8f9c2ac..0000000 --- a/evaluation/utils/matlabPyrTools/steer.m +++ /dev/null @@ -1,68 +0,0 @@ -% RES = STEER(BASIS, ANGLE, HARMONICS, STEERMTX) -% -% Steer BASIS to the specfied ANGLE. -% -% BASIS should be a matrix whose columns are vectorized rotated copies of a -% steerable function, or the responses of a set of steerable filters. -% -% ANGLE can be a scalar, or a column vector the size of the basis. -% -% HARMONICS (optional, default is N even or odd low frequencies, as for -% derivative filters) should be a list of harmonic numbers indicating -% the angular harmonic content of the basis. -% -% STEERMTX (optional, default assumes cosine phase harmonic components, -% and filter positions at 2pi*n/N) should be a matrix which maps -% the filters onto Fourier series components (ordered [cos0 cos1 sin1 -% cos2 sin2 ... sinN]). See steer2HarmMtx.m - -% Eero Simoncelli, 7/96. - -function res = steer(basis,angle,harmonics,steermtx) - -num = size(basis,2); - -if ( any(size(angle) ~= [size(basis,1) 1]) & any(size(angle) ~= [1 1]) ) - error('ANGLE must be a scalar, or a column vector the size of the basis elements'); -end - -%% If HARMONICS are not passed, assume derivatives. -if (exist('harmonics') ~= 1) - if (mod(num,2) == 0) - harmonics = [0:(num/2)-1]'*2 + 1; - else - harmonics = [0:(num-1)/2]'*2; - end -else - harmonics = harmonics(:); - if ((2*size(harmonics,1)-any(harmonics == 0)) ~= num) - error('harmonics list is incompatible with basis size'); - end -end - -%% If STEERMTX not passed, assume evenly distributed cosine-phase filters: -if (exist('steermtx') ~= 1) - steermtx = steer2HarmMtx(harmonics, pi*[0:num-1]/num, 'even'); -end - -steervect = zeros(size(angle,1),num); -arg = angle * harmonics(find(harmonics~=0))'; -if (all(harmonics)) - steervect(:, 1:2:num) = cos(arg); - steervect(:, 2:2:num) = sin(arg); -else - steervect(:, 1) = ones(size(arg,1),1); - steervect(:, 2:2:num) = cos(arg); - steervect(:, 3:2:num) = sin(arg); -end - -steervect = steervect * steermtx; - -if (size(steervect,1) > 1) - tmp = basis' .* steervect'; - res = sum(tmp)'; -else - res = basis * steervect'; -end - - diff --git a/evaluation/utils/matlabPyrTools/steer2HarmMtx.m b/evaluation/utils/matlabPyrTools/steer2HarmMtx.m deleted file mode 100755 index 1f3e80e..0000000 --- a/evaluation/utils/matlabPyrTools/steer2HarmMtx.m +++ /dev/null @@ -1,71 +0,0 @@ -% MTX = steer2HarmMtx(HARMONICS, ANGLES, REL_PHASES) -% -% Compute a steering matrix (maps a directional basis set onto the -% angular Fourier harmonics). HARMONICS is a vector specifying the -% angular harmonics contained in the steerable basis/filters. ANGLES -% (optional) is a vector specifying the angular position of each filter. -% REL_PHASES (optional, default = 'even') specifies whether the harmonics -% are cosine or sine phase aligned about those positions. -% The result matrix is suitable for passing to the function STEER. - -% Eero Simoncelli, 7/96. - -function mtx = steer2HarmMtx(harmonics, angles, evenorodd) - -%%================================================================= -%%% Optional Parameters: - -if (exist('evenorodd') ~= 1) - evenorodd = 'even'; -end - -% Make HARMONICS a row vector -harmonics = harmonics(:)'; - -numh = 2*size(harmonics,2) - any(harmonics == 0); - -if (exist('angles') ~= 1) - angles = pi * [0:numh-1]'/numh; -else - angles = angles(:); -end - -%%================================================================= - -if isstr(evenorodd) - if strcmp(evenorodd,'even') - evenorodd = 0; - elseif strcmp(evenorodd,'odd') - evenorodd = 1; - else - error('EVEN_OR_ODD should be the string EVEN or ODD'); - end -end - -%% Compute inverse matrix, which maps Fourier components onto -%% steerable basis. -imtx = zeros(size(angles,1),numh); -col = 1; -for h=harmonics - args = h*angles; - if (h == 0) - imtx(:,col) = ones(size(angles)); - col = col+1; - elseif evenorodd - imtx(:,col) = sin(args); - imtx(:,col+1) = -cos(args); - col = col+2; - else - imtx(:,col) = cos(args); - imtx(:,col+1) = sin(args); - col = col+2; - end -end - -r = rank(imtx); -if (( r ~= numh ) & ( r ~= size(angles,1) )) - fprintf(2,'WARNING: matrix is not full rank'); -end - -mtx = pinv(imtx); - diff --git a/evaluation/utils/matlabPyrTools/subMtx.m b/evaluation/utils/matlabPyrTools/subMtx.m deleted file mode 100755 index ea3c2ea..0000000 --- a/evaluation/utils/matlabPyrTools/subMtx.m +++ /dev/null @@ -1,21 +0,0 @@ -% MTX = subMtx(VEC, DIMENSIONS, START_INDEX) -% -% Reshape a portion of VEC starting from START_INDEX (optional, -% default=1) to the given dimensions. - -% Eero Simoncelli, 6/96. - -function mtx = subMtx(vec, sz, offset) - -if (exist('offset') ~= 1) - offset = 1; -end - -vec = vec(:); -sz = sz(:); - -if (size(sz,1) ~= 2) - error('DIMENSIONS must be a 2-vector.'); -end - -mtx = reshape( vec(offset:offset+prod(sz)-1), sz(1), sz(2) ); diff --git a/evaluation/utils/matlabPyrTools/upBlur.m b/evaluation/utils/matlabPyrTools/upBlur.m deleted file mode 100755 index 948c2e1..0000000 --- a/evaluation/utils/matlabPyrTools/upBlur.m +++ /dev/null @@ -1,52 +0,0 @@ -% RES = upBlur(IM, LEVELS, FILT) -% -% Upsample and blur an image. The blurring is done with filter -% kernel specified by FILT (default = 'binom5'), which can be a string -% (to be passed to namedFilter), a vector (applied separably as a 1D -% convolution kernel in X and Y), or a matrix (applied as a 2D -% convolution kernel). The downsampling is always by 2 in each -% direction. -% -% The procedure is applied recursively LEVELS times (default=1). - -% Eero Simoncelli, 4/97. - -function res = upBlur(im, nlevs, filt) - -%------------------------------------------------------------ -%% OPTIONAL ARGS: - -if (exist('nlevs') ~= 1) - nlevs = 1; -end - -if (exist('filt') ~= 1) - filt = 'binom5'; -end - -%------------------------------------------------------------ - -if isstr(filt) - filt = namedFilter(filt); -end - -if nlevs > 1 - im = upBlur(im,nlevs-1,filt); -end - -if (nlevs >= 1) - if (any(size(im)==1)) - if (size(im,1)==1) - filt = filt'; - end - res = upConv(im,filt,'reflect1',(size(im)~=1)+1); - elseif (any(size(filt)==1)) - filt = filt(:); - res = upConv(im,filt,'reflect1',[2 1]); - res = upConv(res,filt','reflect1',[1 2]); - else - res = upConv(im,filt,'reflect1',[2 2]); - end -else - res = im; -end diff --git a/evaluation/utils/matlabPyrTools/upConv.m b/evaluation/utils/matlabPyrTools/upConv.m deleted file mode 100755 index 4d1ffd9..0000000 --- a/evaluation/utils/matlabPyrTools/upConv.m +++ /dev/null @@ -1,80 +0,0 @@ -% RES = upConv(IM, FILT, EDGES, STEP, START, STOP, RES) -% -% Upsample matrix IM, followed by convolution with matrix FILT. These -% arguments should be 1D or 2D matrices, and IM must be larger (in -% both dimensions) than FILT. The origin of filt -% is assumed to be floor(size(filt)/2)+1. -% -% EDGES is a string determining boundary handling: -% 'circular' - Circular convolution -% 'reflect1' - Reflect about the edge pixels -% 'reflect2' - Reflect, doubling the edge pixels -% 'repeat' - Repeat the edge pixels -% 'zero' - Assume values of zero outside image boundary -% 'extend' - Reflect and invert -% 'dont-compute' - Zero output when filter overhangs OUTPUT boundaries -% -% Upsampling factors are determined by STEP (optional, default=[1 1]), -% a 2-vector [y,x]. -% -% The window over which the convolution occurs is specfied by START -% (optional, default=[1,1], and STOP (optional, default = -% step .* (size(IM) + floor((start-1)./step))). -% -% RES is an optional result matrix. The convolution result will be -% destructively added into this matrix. If this argument is passed, the -% result matrix will not be returned. DO NOT USE THIS ARGUMENT IF -% YOU DO NOT UNDERSTAND WHAT THIS MEANS!! -% -% NOTE: this operation corresponds to multiplication of a signal -% vector by a matrix whose columns contain copies of the time-reversed -% (or space-reversed) FILT shifted by multiples of STEP. See corrDn.m -% for the operation corresponding to the transpose of this matrix. - -% Eero Simoncelli, 6/96. revised 2/97. - -function result = upConv(im,filt,edges,step,start,stop,res) - -%% THIS CODE IS NOT ACTUALLY USED! (MEX FILE IS CALLED INSTEAD) - -fprintf(1,'WARNING: You should compile the MEX version of "upConv.c",\n found in the MEX subdirectory of matlabPyrTools, and put it in your matlab path. It is MUCH faster, and provides more boundary-handling options.\n'); - -%------------------------------------------------------------ -%% OPTIONAL ARGS: - -if (exist('edges') == 1) - if (strcmp(edges,'reflect1') ~= 1) - warning('Using REFLECT1 edge-handling (use MEX code for other options).'); - end -end - -if (exist('step') ~= 1) - step = [1,1]; -end - -if (exist('start') ~= 1) - start = [1,1]; -end - -% A multiple of step -if (exist('stop') ~= 1) - stop = step .* (floor((start-ones(size(start)))./step)+size(im)) -end - -if ( ceil((stop(1)+1-start(1)) / step(1)) ~= size(im,1) ) - error('Bad Y result dimension'); -end -if ( ceil((stop(2)+1-start(2)) / step(2)) ~= size(im,2) ) - error('Bad X result dimension'); -end - -if (exist('res') ~= 1) - res = zeros(stop-start+1); -end - -%------------------------------------------------------------ - -tmp = zeros(size(res)); -tmp(start(1):step(1):stop(1),start(2):step(2):stop(2)) = im; - -result = rconv2(tmp,filt) + res; diff --git a/evaluation/utils/matlabPyrTools/upConv.mexa64 b/evaluation/utils/matlabPyrTools/upConv.mexa64 deleted file mode 100755 index e38c5943ccf9c01e177e383cc1ca2f51a94fd8b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35078 zcmeHw4}4VBmH&H8(4fc!i;9)XwAGerGz*HA5$tBJBFUCU+1XR=1bjA{W=p{98lKz&?7v2~n8=n)YacDO{cPll@AIDo0%Nm=it zEU!Y13eZo6`68t)em$}>5Al^>6@c7uqb#RFDoejFpdOD?BtP)4>W{j=7XQ^e3yP6w z^x%(x|Fdh;<+pw9FaM1JWBhSx6Ey9z?95k@ywU;sj*LH=16S3o9QYDhp2p>oac3}n z4ETG1JNvza8o=)*{CC2SNH{IK6F!v+7HSK}$ofvbN1 zI0vrg`28HX8vn0z;G2=AUpeMCSv#E)sm$M75xr8oTw6R*z}hdBd1Ym*t7@vt>LTT} zk+L$atgNEGylmCl>hj99kA}6fyB{uF5?;NwE)uStUs+yP7p~K)!u1QH)fJJoHPsY1 zYiombtC!VBw5s}&x<%2daP8U(jvF=62P?xIUAnHkwoXLn*Ho>m4A%p^FdSK2E5e`% z7IESEYsw{fX{2^-_3EWk`XI1*0B$|DMfu;{atTNhbbQCOHx zu8XX}kXBN9CS_NMoanmwHPsIn0X5~Hovj7U<=Vp1lDp=Y-BNT*(QN|jY2l{1@K3>1 zOiRNkCl4ZR9OQ}k*ZTE`Crkl!8vZYpv`hh&*!cxbqdfW%9ng4t!`KwF)tx122~4>vQ1u21NPB9C&=S zfN#oy-@8=6TXNv0Y=3JGJX|8mZ_k0>Bg^m1fu9SC^6feBMY4QH4t%a0PiGFiL5{yK z2fmyHBYyq4aM}Lx9Qe;36y;CWdN@LRlye^*aKN4W*N_8#g=m8R7Swq-Byli~W8%+L z2RuWUpdklb?Uhtxh67G*sozWoT+tBa&2hj%km+Bs1FmEyWdq&S>63aeNbsvFx^7o}~JGI86rEYu; zf8EoI5u@}Ps**gJ!tcftlqTts?C10mN)zcMJ2`!j(nK=Jc20Lwnn)$Nozwq8X(HKV z3#b2u(nPAsMo#|&rHO=+>p1-#N)zcMAK>)2DLsMGi#h%0lqOP17IXTWlqM2M&gAsh zDNUr2^lw@UP9?B zDc#BGyD3deoNVXxU6iJ!O>RdTA^!;f0egICwMPrYJ0s&#{fzz=^$RuLITaPPfc3h6 z+0y8Pfu=j>psW^|7)ac?VWmeKID^&#iSeIDyfks+JPN!g16{+eKw^0cO&_7Aefu8v zxThPmxSe{y8ow7ne`-n(^8ZETKl1wi@&Amdey{(&1N&CFr*Gu(h0x*I3Ne7lM^XG= zSBa5MLjNx#qr}>Gz@K{cz&;fb}FTq19H2za`c)Xl2s< z1U5U}|2F<|L^qjzz2*Vxa8j1XQR*DuQ$1=B;*!SmC^5c$9 z!j4W3a9nh9r+`x@|3IDm7HO*c`UMKjMvDIcFu&D9(VqkCw|blQ5(dUK6qO|IFDS7a z3I;^`Xftu=yHFpr7^_n{=5RJIp&8c{m@&AR+5NG&R43ADExFz6eyp|x3;FA#stbG*yEDhiN#J)h&@HnQhn`v?$Suh{D zXWTaxSfL#Vit{aVXZ%P*Uc8gn>N8aIT@>-}rD6UsGuAwJbBh?OhdSvJ9V5H0Q&G=gw=TCW@ z++GmH{7rA^hE=tvX;8OTbO^MLcQ=2RhMK6Jf%Ta&a23h{mm;xT4C*@0`5`A-qE~S0 zW|2kX?WSS8g>;D>(*|}Uf&p{<`1za>|Cow)tD@gWwm|PLiQabG+~ezhEZ+`w_(JWm zJJI@Xs-A|Z1EOQr%O5jeHxfQ^jmf4<6U`}F!m$;i7 zkpQjFB*MH6Eh&atkN$~n2>vsU3tInzfYaPoQSXy^N-qzbJ4aJ9H&OYgQN}X2QS=PJ zmbu+Fclpe1H1>91XnSlqYA>eR&!Obt-T#3xXm+&Sj_n#a3`oFkBM}j>#z6`)JFNL4 z3V)BY;+$pA8TcQvM?1933T?B^cIqdzqv;L3Fto=7phU-9vo(6H9ooqm9j;KjLdjfn zYh;5R+G`H2!nUp(H#I^n+89?;C4H@3*aefa0!FA z+tFxQ$!Qfv1UT$hqz*^C0*s3#j~_% z65mJC;BJ6X?oYpjk*~sR3@e2hUP#aI2<2yH_(>}FIhr-ZF6w<74dpIMbct8Uoj%($U|cyHMa`Jj9&?*_vT?l8c=hIP)cP6g~}W5C`^ zo6o>^KL)Io1waPWMlq&{`Q_pk8Z?=L&BFL%EVKx_xBy&b%1K1rHO ziS@ko6T^z{Lfo(tI}w!Hu{llWbS477wcl`?r~OUCy5DVfTINyox_IEzU!Zp411Q~r zNv8r$dnvBDH=cveW!T^4=G;%b+Vr08Zi61sX~mDDK+|5zNP}KN!g{eQIbDD8@HxAU z^19xb?&8Sd^LCs@SK&F~9Yqk(hFw^|Jqm)STd_ z!Mj(vXLOx$fBBL#?&agoxF?ST4+WaK!BqS6vC!U5Usv>{gg<2_?sMs8!q9X>f7a9w z8W^s(&+qGb?30+T_qbo*=l2cAPL)*bD@jc01>2P*B2Q_|x`Th!#Iw+a#MRrDW5{|N z4ZH;1*l|jG`+d9`?k!W1vf_s@crisQ-h+5%=0G|(JNBgQHmdCl^|+e{F;&|vu;LNw zv)gJbMHr~y@n8pFqD$m;gKich!?2^pelO6-sWa|^d_rBl-#TF=rd?;)32GM@WCRbI z9~yV1y29NHrv98^9XGuFguCla{WPKNmn9WlBhj|qZsSq&Y$OVGF@Yu?AW%os0qV>i z_m%~S+Ke|JNU!;N5Q-ftu-fVY*ZZxwfv|(9r_k(iaXBj<04y6DrI3^vT!YF8`F4T| zj*aj%l|7n9Rj?nKW8q2BSeK-+QIM6UF;=&Ao~_RF6EsG%FXTMJ&X#L=KBOD# zZNzeV8*!V>>_?eTX%5IG zS|hr)&3YRIp!6Lx!Cql(m+Z@i|7ML{+ z`$-y5Hp0M<6T6uq!HHBu5?h+k{_7c%@vZX^?a)SDOvr51<6;6dKjOwt_ZB~*0y9m# zj1YdbB6=GwhAx(Y7bYY4Vwf@Zw%k?t0AXkNqL6bd7~2Jw*-!BWy4mKTSUmpZ+aRnl5WL>BPUj-`55vWF7KU5(wwo{y!xi0R$0;U}Ya*JBT(d=w z)0A~{v!FzqlZ9prWaEbMKWYT5UONi5|^7>C7N$QVI@=zeaMQ>pxUP7uN|l;`HMU-xhrcYxb%OHzw#A-VVh9= zHH|utQ?Ia$GOO=0d#t#J@*GSG7NaqZK>_t(F{+VE1%F@`+pf3qoXl;ym_VG8BUlXf zmEJ~6p|>$c;}oY-hZ-hI_DgP{wO~Q(gC^E|655m?Hi&1N#g@0*3hlJPykHp1++&A& zAhTeikr3NqGr^D$n}W9Gl6Sh~1~C<|=T5n&<>p$N@tp~}04Mz-lmrUbRDOi|V}({^X5fQ-&i z0W3~oUBb$osm#q8(%dW-=4PD6oo#W(X%e|cC-vZN9>+%K9E)uWX>_i^fTht{iD)k? z{e-;aW+BrkE{smfmqsUy3$i##FO?Q2&3KjjO9x0v+mJRm2_h6qVR{ahfPZ0dep!dn z+2`=$2!pdbdNOg>MGVeQ**xL2&G|ChoU?_^S^AVF96Z|~P9DHmVbfmL#PfmW`s8vz z5Zs4=tz3)C2n!S#^s!mw-f|i8NzlbNS#B+_VkJZ;-f&W8p-Lz39RF%8Zl*sjEIY&IKNlcX}n+-OhidbPAal=9YZ9Vd`* z%GpB5O=ltJvEq*r>Vz(8AetrT0suHLA?2LJFKkXixU@M(N3t48OpXLH4)$h-&^{!I zjb(2-aY-hp!X>*k(zx7)y?gQ`i9VYrJeJ)_$Y7y&6(Y*4C$7`^gi5GtkbA67klon{ z3|Q=i78bbB*$2NOg(3+Lck_J^iU4>Z5_zSFx|K|15+6Zq#1YAxE})v|0>L_fG7O)w zK0&>OA@~_*I1ElKD{VnpgZMEmI4C{Th^|MsHs`pXV3w5zXB){Yhs~+@iiL=@IY(c1 zn@1~#E_61ljr1WC@IAMpt@Nz{aAkY_CtQ;M(C}3<$4@-8SP~7mk?FCS`PP9L4A?#&`vGl*cX9IJ(8j z1hj>8VqtM+t%1^rF!FnA5~` zp!UP<4P&A9Lo)8gQ4Cw+CQJv~Ck$qakwTI->4`HHcFk60b+!m{R90te+UoqApin`3 zRvXopRwpQRYlc#(AH^o-W^hyreGo@~Hho25EipYO5tNwSo!Pm*C7>r==|rvVC5 z*<~~Bj5I*SPB9huPd<>VtP#{s6h=m9YJ_q-K}E)pBnn5MFo!kzdr(-mHToe1zR=W^RZ3IT`Jhl(rIc1y>Gecs zp5kX6Q0$kZ7;o%9qP@N; zR;+FK*x;==e$Ml$USpT}0=nA|##%L#Oyr8rP=1eOuus5CL9zocS6%tt~uT^um2mrUglwaa}p;8Q^}L8y<)rUYM9Y+tl}&I=l!2be77n$QXwKI$3iV7ZmZvA9;N$HSr`&N2Xnh^ z9yJp4T*=N0#KI4t@eEVJr|^6b4th<)H^XU>KFte*lrpSA#UaPeNV^kF|6N|R6Hfgr8F_I+ix8* zy>Bi|Oqp$+v4*nQ@FPsbe&JFQ_Zar;CAb)5_>M*U7bb4HNk8Y;hfA9Fv5`LTHP$42hCEeuf*kYNEXGHG$Xp10dK6g4{UiX zG4V1}?>6-wF|(5yA#zuWXZV@$u9n~{>}BnTigeX3$wr^NJ^{4UFD9q}F{e%v2Dz_>VN>L=wY8(t-) zu93J<2q0>*-XHwdn6n4N-GL$5AZlJ%-E6VVmO`@wW?jRblHFe6&0k4nSLmn}+L%om zlG`>hx6O7XUjw%ZucR-8!^HK9b@mYJG$wE4&5RvyBe_QiF-bhMnb~`Zdw$<7?bE-5 z@EdJQo68iwVZ@du?%UwLSrgy65F1-(A%oqUuExkEZ(RocGiz@Xw=%P&))?E{P9~^- z5?kAw;3sVM0w>A;^bVIa^*3>Y(eMt)nf({+aC^xOB{WZpseSIFh%>*@gN`sVGW#66 zp|eS=G%@N{wNenqm9L(8%Z~NJvvdl-nYPqIJh9$J8<B0h%#yJ|+D;yf$hfBH1K5eoP;=~;Iu;H=b>4*pr_;Egvc9sCkh z>Oe!O5_oep45!(23ruXfIiM+W^(M9`h-eGx> zv5zk?k`mq(Jpm>BR#Sh&(0@%^+klUcVII50-_)ZI;(}~&D|FroO*|85;?S^K=|XY9 z3T|a(ycL?3d(+1;6u-64@U6gIn_pp8c5JGdm^T-sMpOiart#4i8x0^ZuNWu}#H>gF-i4^`dtb&>LY1S)|O zeWYQsHUdK?L5K{vW*^3hP+A3$>i6K+*);a+?@1K+brwy~14#YG5jLqNm^b#Tcf`DL zyI6nG3btg;ecmW@-_CPSufA#h%G7^jS_6Jo{CV!5|KK%*UEw`)S0eADSj@u<5>u|k z6>n4jm0=BKR?|nTY5KYe6Q?dlNZslA&xX13;$S1q-kq7f9%~VbcMHuP_XIzM+1tTg zdT_fQ+yO(=+gCpx51|Y$H0%}qX8fmaYk;JXIhF4-xNs{lL`I1qieNE>PgekbUWlxI zzy5Oa#S7T@%$*s=vCTP!d^eEp4KrWCpekgenT(%Bd|}vU?sO-vV{Kt3?$6^f15y|^ zC!Yq>`F-!jO29!ud&&*jW`*B6XL?@*qxeQ3`N-&uGVNM$32dcUsuHZy2v+eiV12R8H&mGi*c9KePjbIlf8j}Dk}OT!&;^ko_G+q-{3F8lUTU~7 z*5QkR*Ir>7icSR!klvkPwt3yjIP%8ioqkexA zJo}(M4P=8!^IisTN0)VO@UMs~Ca_V?Gd6U7jDV~Uo7Fj1Sq?!HW<>H@^Zv16|0rwS zCMJFZCjLfd;)9KLaJL@ZsRuXP=4Qw_v$J6?xP%PZaq!16OLbV?#8P~7GL4KhS2ZfG zvX}*TvS)pT+O77`u|xz|OkM^MTrQ^XMC<{F(`VG3#wj4!?{gFkl;!ui*iJKLimAVC z>hH3TWN0p9r(q+Iy9VRP;-90s&{3FwIGb6B^p^FrN3hUdsDrehnAW?b`Nwve*4r5= znxvaFhW$8IHVRi96}uGOK!CGy>cYglTeEOCuPaHr(wLkBmyd&UG77Qe8oBHA{SLd% zNS^vSkl_ZdlSwhnf0SCzpIVHbBljm)UUM)k^BUE2_ zInuKaK^{YH{3B*Rf{jLqL~`|X`xAK|5&I7D(dnF}-5~cJ#>L2eM+iB43ijO$2GqWT z`5Ugs$y|{*FkEcVNjwzt=;3e~1r-pe4r+jY1yr1NpyI1&6psOsuZS7I=D(~w_cau! zH?HT2YeG{k7_Nt1!G0^jN^?fWO2wH-S20=zsz7ljh93A?cSdn0&Dfzht0##w&*!?I zI0l`p>D;(SCemX&8=!s-r(zT0N8Ho34Ob2pvsadt&HUG%>A< zo^ea${jt?$c#~%QNd4ue?^NuPfIY6na*@}aHZH&KU<63()(3y)*WcC8`t{S$(1v{b z8piwep}}wQm>o-yb&ybEy>CT#SjV8d8*m9?HFw}L+IjIDV;UDv8SZ=DNGzZ+vx4Sc z)Qy|4c*3(IexPA|Q&JzCf(OSigr?Yb@erfcan3&LBp&Swb>LimD?xej^pc-e}M!WFm%*n!;_ry#z4aK4hL3mr1_H;CUm z=?J+8I6Zs90>xS{8--YCJKO=C+bA@5VE;7=Lx-Rz({q)Bj)_{m-WRMBJe^s`t^M9( zcti<3L-n3@!rQH%$8iT9PdaQ^hr7;A2a0CF{iqKGU^*3yqxt3Shdc*U4C;QYCpy^h zBilUWGxtOuqJ@uq)gV17Y~V`ue|g8Q6@7*))(13zsjiu8?rNA|xWawO_gSgfNhD1k z^^NxfcSLROjmsE|{jN}l-s!hq@Oyjl0O&4v^SqJRZ3hLPJxrIdsFieOBhEF!E0=DhYZr~KhJG1(&eO^5GbzV};u%IQf*#wr40Lv%RSniTo?)3IC zDdnR14WM}dXg;}NFIL|d+7pQ|nyU?8xV@!eHO_q6bGqj>O?OZ0o!$AF(K^?MM=o)u z?;iopowzQqn?S-*FtyLz6}#LHb?TwrNqR*D^VwK3DPYC6TG3V#N-Ypdn}gOfIPP#i z(alekw}OnMU~=CB(C!g(sa43O3E)^l#^BXgGeeB95qhT&_*+Z+7e7mx*}wn9QCgSvJDTbppD+ZAlJf{hSx zhTDj>+ADhW=d2Zdz7y^Qy&#Qd^Plus_V9GPEW(_1 z!SC&X-wGbKK0F#|2RprxI2&mr#27U+-wBfid~14Ntsif~YQ6#{HV?4NC=9k{2|_6K z-Y)F0R^QqFrgJIln7eccX7YMe>E|l@prN*A3b=#acO|Aw0`&<>CpQj+$?{8So6S3h zZI%?GxhpnCCXoD0t|HwAb6r7{=f$D%E_dP>1Sn{+729-@t~sPd=ut0@xo{|ndCmgI znj})O`E@`p65ry<2J9~^gJ%(|2Y17!Pb|BZl_wUahk(3R|Jmb)^?qTr6*X}N1wL278W!*@X#o|?gMyWe^i zkKP-FRjqckgQi6E0kk7Df#2hVUz}#15u4MHm}h#2_FH0}qsURrGfR$+K2Igij%V<@ zqMh(-wrBUt67!<{%3X5Iepg_9m*?#h>+0y&)GwI&Z^7sOgmIN7G5mgVcnk@O*Y_02 zOHM3c2fm9pR&Z>D{`(%(U+Y-VdfJ~@b^~-@F2(Y+9XgfLbgf?ZJ?D+Y`Vq=;F9hiM zv6N%TR}*@#-+CLtOJH#ldIO^gJ;QfG3B6yiN(QyM7(xy=L79cP|>^siOGhs<``}F4kjM zZGn_Ao|2jwhR;l|};>e@QRdL6rkPeOh6(~j8=WpFO8i){QRiRz4k0VNc-!TjEC z+>CEGy|0+Q!|ud$RK{M>Zb)`AW(^5VAg#%crTZ;=9*sMtl~VpP6s>f>!?Bt{Jhhe9 zHK0Vt+P%Ga^NQj91&zjc*1csvCJi5|Q~$|gR~<*{N3aDHxQJ(-qs_oYs-@p|X2XG| zU+ccJ4cHHW>lk6r1>b3?PY>;Z7K|5<&`qM|pCiMsA4|RnHp)V;b&%BLLlVC`u>@OM zP&WBb_~XE*{XzIV=x#nT5}#lTKh9Ld>}L&+z^B18D@l9^gp!CDgqC-(p=$7lSqLTR z1QN-h)bAS-M-78_W#QC1$C~7Gr4pO;h1?37^GytdQZLv?3k6Pw+$8Qg zXB1BM3fyxhSK}0q9+)jKhVwyrR0kbtt9VWKZiSr$vkKdk$WiWjM1F zs42FIwbPTM3F^6_O-fLkP^qY_ySWZ;1j5}1Jix>zEsi4D11v9y!61{ZWsoV7gl1ry?gD8yrKj~k%Pmdh!9f;kHN9srii9x> zHx0ZmU@N$GZekslBsN*d6_~BG159=e8aO_ahFL$E@@F6*gvn2){D7FZH0AH(t2opG zBFo7cv|OiFVA=13qoy;Td^Emu?v1R3cj<%QkV7gJ*PMd-DU1q!6gCXE!;prLp(Wj+ z&}YO=#zfxLR434*e#agH8CL@sLG6dEDULB;khGNkP5jP7CS~JQO{nPYYKe z>HGmR&O-Wngb;fsI3VYc}Cc5#$c}cb3E3^iDgt4SLHYz8DYrj-{Z5 z2}#~1;jr6p!Qsuc(f($m3-^o_$o*hWA%l$MH={x0b-AU*Cl5hS=)qCV;$nIsBtgH%u&RCK6B$^8>J+2Z~Pqk6JBR2+I;3w_r?ckWkW|@ zp%(J9Jn#2DWz4PG=x#2c(!9R#A}TKyi#_RTd83do1>piPtT!z4+eYEz#LAeSvJ%3y z_!*@`AvC@4R<6gxxy}wdA?@m#r`Q&Nb$8-0(2B+AOuhxi6DtB^3@pVc zETj#y9WN`vWz8*76ixmu{wU04Pzg(GHP0bEXvr&S%jq8;0e6AZ)mvU>}iBn+CuXeak0Ne!V>%u*@^L{^4Ug|HLuu;Uwgp&D{C zkKu)ZE~x3Q7@nIUQUQ%#L)h9p4hcTcZ`XsQFY0)<3rM7wnEUmo2mdsyYr{%PeP$r7 z&rCaNS_hNuILOaYeMT0Y0;OeG9BM<6Pb|9xcCRGx%`hOKpew@OL-LFCIXku|S*Da5 zyqC4$BK|XYq~8fz&-$&y@a8}BJ0EZ0*!HJp{D8apFyEBMqS)Q_VM=%D<1Fc2E5K8^p_ z5Dwucw>tW`o{m1QEwOQpmR7a^mtc#!>hjP>H%RF?ZL)MCk~s}I$fqIjro$)i_jNVk zqTx`IE)dWeK(rk5YiYPQfG1N~IiZtkbc%aI1vi=)FYSKlp__ZaUMQbNr(=YJ(NkyK z_y45S5|$^G#6dfGWyA$}QD%TuxG~qL>CGANb9P$MJ=O~r8I$JjQtKzy8K<(@gJYLd ziG|K%7r*r`Rur4nSp+G(Z2;3Eqi~44oE@Y;#yW(_PmAF$g_m=;-f$_LCf;E>RN2i% zc8em&=2MV;SY^B{Q@%}+(NSt$L+?x^51Z*b7af9Si`V<%9i~t8L&&miJy@6CEJ=qr z1$OKg`{F_HCSC*Q+#{_d_Vhk*%&b1iE;#AJrXmgr@PGkcFW1Z0vgarATrjkIqkoG- zV7Bz>ETrKRrhdkb!fak~$iO2SxW0_*OQBA>uM00gl8kapU5ngq`Yyz7v4ea3iFp$- zDs*v0{1SR(r5mS~kUW{i(hus-f;jrn{DzajlNPy?>n*!NGkk9}%p~H(TOrx+K+Sv( z%~<`oT7(2f%qy;A)O6DY^yQvgjjCxH; z#Zf%!k{3vf|3}Wu8<+e$6s8+jfu?;0{-z80(L<%yuW*a;GN^yt-9YhOdAy%_~Qo-QyQ1p@YMi>XPx=rj$#6!3r52cHG72K$s~?abfNT^PF1mUp*3+k?CT zsFot{81mpHZhG(1hrj(}+?dn`-T_2SI-e)4-V~iVk6wzoMkb(d@h9RZw>njFXy3@fLhaD60Py;7?Uufr!Tv;}J` z@p+AOKR0+nq%@JRJaPjp>f zIljXJHXtMeRvY%Lt**egS;`}8@zs`(^J-}$Sfn~!5w5E%uU+qngsaxo)KUzzR}q%w zC7opk-~rXH4$H;G>_Vl>vW8b1UR4>ch|H4pOBR7l7x_!ezO=-@_zus4^0k%Wm7YjV zhDoVk47av?y&9veN%ny{z3yejOe zSp`{uwOPB;6JEJGd^5;zWo5Yb<0Qa5o_p5O7j76ccX+fL>$H_1>YE8e(MVV$G6nz2 zu|FhZw`gG*qjBihx#l(^q<6Z%xjmKIhH%@?RH_Hz$NoK)dJ|#CQ>oMxvIP#OQgqb4 z`K459CBm}^HzL%3o=WXP*mf$FI*RaxU#3zQC?DZ8*nsc62^ARO^Y5lol?d14ZNIGu zr{g?g55g(vgMRv>OEkT{K)-I{rTOG(y#cUk_#eQy_*+2!Nd?~+H~)%D7B^kG`I5x= z=DaN~sz>Dv{O|w!RO)M!5V=UXN@RQgEtUGq4=C4)a@%@Rsl??MZ;$pvy&pF-FH(-? z@EZPmews>s6=8aO6vvOopNIK=75Vg(OFF+~olE`Ih-D)l{t>2f*k(fH>f|6b73X~fgzN}9%R&Py- z`Q^;~pz8-knpl8-E*Vkji8<-3bJCui^k;I?zMM3DJBxnwff@eM=7HZ8BG5WkiO9R} zr)nrh2lezL(Lq1DXhJ_2Jp5~v`LY@9A(*LoO2tW3XQSzgI~`ji0u zt`UKjPcj5Q1)m{1mSF9qtUo~%OZRsnCC1+_2aY2uo{#Dm-V#m^$b8UKR{oGoKPvO_ zX#vikEc^LG1t-U#+aihZ&&hC+4DXj=wG10%*et`pmf=6k@JBLyMutC^;jd))z6>YH z1-)K|MKb)H3>V4pei>HFP+K^E{vDnf3m1jFp4mmSif-}TGIQpfnYYiJ?U}IznoGSz zA5i}RMQxKLM7i-elGsLl2c#p7b;Zy3)Lr4mRq05h;XX*v-EdtrQB2Ngd+Tt z+n-8mv?)02PgV6~_(0BrsrvMRHu^n^|IYf2Qf{hn&b?eL{YTYPfJQ`|_0|5ZLNaZf zKh?j2eFG7yukhQyO5~{U&vGi{_TQXSf2{8ni&n*2t2l+*@ZZ`0z*j}C3hz?`6X5jv z$)xr@SzqZFn%Xbdi4wWvRqLrhGqRuYQ*tV^;GyX#DmH3%s3UlES2z1DIXO1J_z_YXkgpr zzKJCN>hYK0p0uGW;A4${BeH4y`8nhNGlsjh;%ZS}{rww;j~xF$0#5xl%6(Lo??PlW zyd4|^{`?s5m&Sm<2Dq+$M0-GvzY%Hr{R;nSJjyS@K0v_e6_x~7{s{Kf0rtLxf9(^9 z;K#mEgp+{qaqt=_y@E6GhkU{MxYMazdLusswXggsa$DDCOSp3MvX2(+7!t1hB_7$q zA_<>1O90phi)e*}H-!cKv@B2hGWDzcH0-NHUOnLYxRLx7XZU1os>GXYM*DNw&iCgD z2>Wyq{d);lejD~l0^Sa|2ENGUuRXH7@)NPI7A2pO<@+Q(Q*HVk9HSk&uS4_lm5Xxh zGez`8zzP4k^5GPhA1OZvWIM{Q#Xe@V^A_M&il+JRcVt}0=H`SeaXcXhzC@NU0Nf+v z&S3f&@LO}*q1PDEF97)DQRGZ%PWdCU`~x{~CDG`N!8v}nXkL3H2i_s!U(11?knR6Z zz&|0&Q1B@UehAgJEOHZ+tzB7P^x0XnZ`bHZt1=u3ucYK{sJF7F zY;|SLgXNWF>`y2wkJf9#>##CfRkdFAV=gkdn*~e!L9>u%49iy4)YPd1wp%n)9GI`I#zA>C238wh8O51n8GA>{ z7M9*~7mf_?S+HQKxvXrN|E^NAOslR@XLadX;rewr;?pvxb?F=$L7B{^VU(?kR#(vZ zpE{!lR_bcX#0jB7t(azZ8**UjW5BX9_*mpprH>2C=u^mWvZ}avVQI--^UH22x~1qgt*U-uII_4_go`kg3@y-V-2HIblJM%a zb->g7%JRCpaGi$p%8E7Rwb{)C&E;AZUwp`hSJju)&1ZtBM;9e^245)9s>1b)c`zV^ za5%e4Sy@GWIjsavQXkF9tE!*RorvKs<$D)px6ho(ZO_N3II@&4FKF diff --git a/evaluation/utils/matlabPyrTools/upConv.mexglx b/evaluation/utils/matlabPyrTools/upConv.mexglx deleted file mode 100755 index 3b124799cb2c37bcdd66e7114939ec2632116441..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28633 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 diff --git a/evaluation/utils/matlabPyrTools/upConv.mexmac b/evaluation/utils/matlabPyrTools/upConv.mexmac deleted file mode 100755 index 98e7560189a8834da5f9570059a109ccaf01ba94..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34264 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 QRm8i%;&D+a8Df0?75;zua{vGU diff --git a/evaluation/utils/matlabPyrTools/upConv.mexw32 b/evaluation/utils/matlabPyrTools/upConv.mexw32 deleted file mode 100755 index 36d501181174321aa24e68b062e8d7a079d4928e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26112 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℘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 nbands) | (band < 1)) - error(sprintf('Bad band number (%d) should be in range [1,%d].', band, nbands)); -end - -maxLev = wpyrHt(pind); -if ((level > maxLev) | (level < 1)) - error(sprintf('Bad level number (%d), should be in range [1,%d].', level, maxLev)); -end - -band = band + nbands*(level-1); -im = pyrBand(pyr,pind,band); diff --git a/evaluation/utils/matlabPyrTools/wpyrHt.m b/evaluation/utils/matlabPyrTools/wpyrHt.m deleted file mode 100755 index 476be83..0000000 --- a/evaluation/utils/matlabPyrTools/wpyrHt.m +++ /dev/null @@ -1,15 +0,0 @@ -% [HEIGHT] = wpyrHt(INDICES) -% -% Compute height of separable QMF/wavelet pyramid with given index matrix. - -% Eero Simoncelli, 6/96. - -function [ht] = wpyrHt(pind) - -if ((pind(1,1) == 1) | (pind(1,2) ==1)) - nbands = 1; -else - nbands = 3; -end - -ht = (size(pind,1)-1)/nbands; diff --git a/evaluation/utils/matlabPyrTools/wpyrLev.m b/evaluation/utils/matlabPyrTools/wpyrLev.m deleted file mode 100755 index 18f30ae..0000000 --- a/evaluation/utils/matlabPyrTools/wpyrLev.m +++ /dev/null @@ -1,30 +0,0 @@ -% [LEV,IND] = wpyrLev(PYR,INDICES,LEVEL) -% -% Access a level from a separable QMF/wavelet pyramid. -% Return as an SxB matrix, B = number of bands, S = total size of a band. -% Also returns an Bx2 matrix containing dimensions of the subbands. - -% Eero Simoncelli, 6/96. - -function [lev,ind] = wpyrLev(pyr,pind,level) - -if ((pind(1,1) == 1) | (pind(1,2) ==1)) - nbands = 1; -else - nbands = 3; -end - -if ((level > wpyrHt(pind)) | (level < 1)) - error(sprintf('Level number must be in the range [1, %d].', wpyrHt(pind))); -end - -firstband = 1 + nbands*(level-1) -firstind = 1; -for l=1:firstband-1 - firstind = firstind + prod(pind(l,:)); -end - - -ind = pind(firstband:firstband+nbands-1,:); -lev = pyr(firstind:firstind+sum(prod(ind'))-1); - diff --git a/evaluation/utils/matlabPyrTools/zconv2.m b/evaluation/utils/matlabPyrTools/zconv2.m deleted file mode 100755 index f678d89..0000000 --- a/evaluation/utils/matlabPyrTools/zconv2.m +++ /dev/null @@ -1,41 +0,0 @@ -% RES = ZCONV2(MTX1, MTX2, CTR) -% -% Convolution of two matrices, with boundaries handled as if the larger mtx -% lies in a sea of zeros. Result will be of size of LARGER vector. -% -% The origin of the smaller matrix is assumed to be its center. -% For even dimensions, the origin is determined by the CTR (optional) -% argument: -% CTR origin -% 0 DIM/2 (default) -% 1 (DIM/2)+1 (behaves like conv2(mtx1,mtx2,'same')) - -% Eero Simoncelli, 2/97. - -function c = zconv2(a,b,ctr) - -if (exist('ctr') ~= 1) - ctr = 0; -end - -if (( size(a,1) >= size(b,1) ) & ( size(a,2) >= size(b,2) )) - large = a; small = b; -elseif (( size(a,1) <= size(b,1) ) & ( size(a,2) <= size(b,2) )) - large = b; small = a; -else - error('one arg must be larger than the other in both dimensions!'); -end - -ly = size(large,1); -lx = size(large,2); -sy = size(small,1); -sx = size(small,2); - -%% These values are the index of the small mtx that falls on the -%% border pixel of the large matrix when computing the first -%% convolution response sample: -sy2 = floor((sy+ctr+1)/2); -sx2 = floor((sx+ctr+1)/2); - -clarge = conv2(large,small); -c = clarge(sy2:ly+sy2-1, sx2:lx+sx2-1); diff --git a/evaluation/utils/matlabPyrTools/range2.mexmaci64 b/h5_generator/.DS_Store similarity index 57% rename from evaluation/utils/matlabPyrTools/range2.mexmaci64 rename to h5_generator/.DS_Store index ee259f645212a465b7f811c85de49336bf58c133..1f045ec0776f3b5e3ba1ffb5e149cb6a106af183 100755 GIT binary patch literal 6148 zcmeHKJx{|h5PerVw1S}vAEQSmB#@X`qN)tc{D4B60z*ow@G)oM$M7rRoqY;Q0umEK za3|e8`|LYAFHz10Ak(M(7?=PUQ56ScnomT>ReLfp&yXlFM~OM^kmClYz1i;gjST3! z+ruqNY*5jDyuUfUE8J5nT;q{r6^^jJD9YucC>M;=kLHYe_!fmNV7Ha)nUMu^ekapw zC({^fu9;&Q_qFM-E&H8_9X!}RS2$_D!``0dr4z@li!7%Q6dt#3;?ktv0u`w!u!vejs&EqtN+SWvwsEl`34u5$5~b6%y-5taUb8>c z0W|?RDY8N!2c%x;nI4chap3@=p;7<|Qs5B8PkTXiXpvBa5T(%Ny_s2JJ5H&nzJ0riJoEO;KYzL2Oh{-mAtVB$1;%oikZIsZyI?Gb2%$8c7*4aL`bnyXL|}+X zwupfilsa0;L5WjiJgJqhzXsPrLJVoFQJB241~8sIZe&cI+K!v)T%X^m?c935aPqMq zBO>B8i3NxUf#{f~7c~pk8uMEc@pNI2c#|LOKRBgX+p+S6QK4&$*B#{wUym4{flrOG zDb>d4h@~1Dw`h!aM#LKy0T9>5+eXMSKQ?lFu2mS6_9$ruR|NUb^9CHBE5`Nnqck_J z=X~cI$MeJC`%# z{|?Krh~y_GGep`&FpMK!MW(nN<~A6o-+k-o&(;_3OkVr=xq+`2Cea+%lQJRr3Lm?h zkVW87Z!!P_3GWvN#>02IHa~!M)CT@H*RIIi9{(;6z`$$O-fy>VsyWS~Mb#PGr{^<9 zDGm=Lp8+#Q8}`%c9XIT!I&~LZ=NHCGHj{m>ZDD>mY$uo9yEneS)^VL5t5&GaZ#0{w zcD%FJjs3r>uZs!StM?lmw;j!hAFOlaRl_4cPn5=xBEMJkl&zzRz?8Cpp54`F@n0jaK z>8)IpzZSoY3#ooBA@ zcb#8-h@KzeRDBzhnVwHonw%4Lin6ab9C3zHGmliKU;%=&3`lBbB2vXo5?*c@0!NbN zPo!s*Bg(VN(N7ofmUPfg%}1wqc%Fy&F^;EN0k8aZ-SeOZTOo()Eugr38qhTms<>lZ zvB1WQ*`W1eE}M_Dd7RBJv-t#@C)xZeo69f*!PDykY2|*n2FM!9?Oc8m<=tF<0A-2G zyHE~uc_+$${LOr?Vlr2_9K-dCTn?f94aj&sOMAi1TbeC*%BnT$8d|}L<9c6u7#C#2 zwH-O5$*OE=sxBAI!hLp8wQNl`RM;Pum@(KVEX%ZHRoBg|>cF-U%xzb9gcTvTVo;#a zOHYwdNeW3V&5=1s7{dn|X4k{2-AgDl4fuI6G1%e6$ z6$mO2R3NB8P=TNVK?VK?6~Oiof@6;j_1%JFPZcrtIFaM&!kr-a zv{PWeuaD;(sNW;{{0iVG;0}TN0f$Hk!!SAmGvI$CzSw{#8t};m{AL5jqpsR`XBzPP z4H!>H@H7g)55Nv49-Cm__9htE+r@t6Mr>s0JR4&);}&wd2A>yTvzB1XoPTeS$ro~P z+T(wBz`N;m#4Tj0Zko@#MM4d&bQrLcHwz5FNl~9Ynud=ls8Kour%I02W4ak#>thE> w^udk})I6#=eS-H3J^<}>qm;4_nMP69N*r)sF89Ovm6gwOFvyOn;5Hfk1L&FX7XSbN diff --git a/h5_generator/gopro_hdf5_generator.m b/h5_generator/gopro_hdf5_generator.m new file mode 100755 index 0000000..45ea39f --- /dev/null +++ b/h5_generator/gopro_hdf5_generator.m @@ -0,0 +1,115 @@ +% ------------------------------------------------------------------------- +% Description: +% A function to generate train hdf5 patches. +% +% Parameter: +% - The download dataset GOPRO_Large's directory +% +% Output: +% - The generated patches are stored in hdf5 files in the directory of +% GOPRO_Large/GOPRO_train256_4x_HDF5. +% +% Citation: +% Gated Fusion Network for Joint Image Deblurring and Super-Resolution +% The British Machine Vision Conference(BMVC2018 oral) +% Xinyi Zhang, Hang Dong, Zhe Hu, Wei-Sheng Lai, Fei Wang and Ming-Hsuan Yang +% +% Contact: +% cvxinyizhang@gmail.com +% Project Website: +% http://xinyizhang.tech/bmvc2018 +% https://github.com/jacquelinelala/GFN +%% +function gopro_hdf5_generator(folder) + +scale = 4; +size_label = 256; +size_input = size_label/scale; +stride = 128; + +train_folder = fullfile(folder, 'train'); +save_root =fullfile(folder, sprintf('GOPRO_train%d_%dx_HDF5', size_label, scale)); + +if ~isdir(save_root) + mkdir(save_root) +end + +%% generate data +train_sets = dir(fullfile(train_folder,'GO*')); +parts = length(train_sets) +downsizes= [0.5,0.7,1]; +for n=1:parts/2 %n +data = zeros(size_input, size_input, 3, 1); +label_db = zeros(size_input, size_input, 3, 1); +label = zeros(size_label, size_label, 3, 1); +count = 0; +margain = 0; + +for index = (n-1)*2 +1 :n*2 +HR_image_path = fullfile(train_folder, train_sets(index).name, 'sharp') +Blur_image_path = fullfile(train_folder, train_sets(index).name, 'blur_gamma') +filepaths_HR = dir(fullfile(HR_image_path, '0*.png')); +filepaths_BLur = dir(fullfile(Blur_image_path, '0*.png')); + +for i = 1 : length(filepaths_HR) + for downsize = 1:length(downsizes) + image = imread(fullfile(HR_image_path,filepaths_HR(i).name)); + image_Blur = imread(fullfile(Blur_image_path,filepaths_BLur(i).name)); + image = imresize(image,downsizes(downsize),'bicubic'); + image_Blur = imresize(image_Blur,downsizes(downsize),'bicubic'); + if size(image,3)==3 + image = im2double(image); + image_Blur = im2double(image_Blur); + HR_label = modcrop(image, scale); + Blur_label = modcrop(image_Blur, scale); + [hei,wid, c] = size(HR_label); + filepaths_HR(i).name + for x = 1 + margain : stride : hei-size_label+1 - margain + for y = 1 + margain :stride : wid-size_label+1 - margain + %Crop HR patch + HR_patch_label = HR_label(x : x+size_label-1, y : y+size_label-1, :); + [dx,dy] = gradient(HR_patch_label); + gradSum = sqrt(dx.^2 + dy.^2); + gradValue = mean(gradSum(:)); + if gradValue < 0.005 + continue; + end + %Crop Blur patch + Blur_patch_label = Blur_label(x : x+size_label-1, y : y+size_label-1, :); + LR_BLur_input = imresize(Blur_patch_label,1/scale,'bicubic'); + Deblur_label = imresize(HR_patch_label,1/scale,'bicubic'); + count=count+1; + data(:, :, :, count) = LR_BLur_input; + label_db(:, :, :, count) = Deblur_label; + label(:, :, :, count) = HR_patch_label; + end % end of y + end % end of x + end % end of if + end %end of downsize +end % end of i +end % end of index + +order = randperm(count); +data = data(:, :, :, order); +label_db = label_db(:, :, :, order); +label = label(:, :, :, order); + +%% writing to HDF5 +savepath = fullfile(save_root ,sprintf('LR-GOPRO_x4_Part%d.h5', n)) +chunksz = 64; +created_flag = false; +totalct = 0; + +for batchno = 1:floor(count/chunksz) + last_read=(batchno-1)*chunksz; + batchdata = data(:,:,:,last_read+1:last_read+chunksz); + batchlabs_db = label_db(:,:,:,last_read+1:last_read+chunksz); + batchlabs = label(:,:,:,last_read+1:last_read+chunksz); + startloc = struct('dat',[1,1,1,totalct+1], 'lab_db', [1,1,1,totalct+1], 'lab', [1,1,1,totalct+1]); + curr_dat_sz = store2hdf5(savepath, batchdata, batchlabs_db, batchlabs, ~created_flag, startloc, chunksz); + created_flag = true; + totalct = curr_dat_sz(end); +end + +h5disp(savepath); +end % index fo n \ No newline at end of file diff --git a/h5_generator/gopro_val_generator.m b/h5_generator/gopro_val_generator.m new file mode 100755 index 0000000..458228f --- /dev/null +++ b/h5_generator/gopro_val_generator.m @@ -0,0 +1,70 @@ +% ------------------------------------------------------------------------- +% Description: +% A function to generate test dataset: blur_lr input images and hr +% images. +% +% Parameter: +% - The download dataset GOPRO_Large's directory +% +% Output: +% - The generated images are stored in the directory of +% GOPRO_Large/Validation_4x/LR_Blur and GOPRO_Large/Validation_4x/HR +% +% Citation: +% Gated Fusion Network for Joint Image Deblurring and Super-Resolution +% The British Machine Vision Conference(BMVC2018 oral) +% Xinyi Zhang, Hang Dong, Zhe Hu, Wei-Sheng Lai, Fei Wang and Ming-Hsuan Yang +% +% Contact: +% cvxinyizhang@gmail.com +% Project Website: +% http://xinyizhang.tech/bmvc2018 +% https://github.com/jacquelinelala/GFN + +%% +function gopro_val_generator(folder) +%% scale factors +scale = 4; +test_folder = fullfile(folder,'test'); +blur_root = fullfile(folder, sprintf('Validation_%dx/LR_Blur', scale)); +hr_root = fullfile(folder, sprintf('Validation_%dx/HR', scale)); + +if ~isdir(blur_root) + mkdir(blur_root) +end +if ~isdir(hr_root) + mkdir(hr_root) +end + +%% generate data +val_sets = dir(fullfile(test_folder,'GO*')); +parts = length(val_sets) +name_index = 0; +for n=1:parts +HR_image_path = fullfile(val_sets(n).folder, val_sets(n).name, 'sharp') +Blur_image_path = fullfile(val_sets(n).folder, val_sets(n).name, 'blur_gamma') +filepaths_HR = dir(fullfile(HR_image_path, '0*.png')); +filepaths_BLur = dir(fullfile(Blur_image_path, '0*.png')); + +index = 0; +margain = 0; + +for index = 1 : length(filepaths_HR) + + name_index = name_index + 1; + image = imread(fullfile(filepaths_HR(index).folder,filepaths_HR(index).name)); + image_Blur = imread(fullfile(filepaths_BLur(index).folder,filepaths_BLur(index).name)); + if size(image,3)==3 + image = im2double(image); + image_Blur = im2double(image_Blur); + HR_label1 = modcrop(image, 16);%save + Blur_label1 = modcrop(image_Blur, 16); + filepaths_HR(index).name + %Crop Blur patch + LR_BLur_input = imresize(Blur_label1,1/scale,'bicubic');%save + imwrite(LR_BLur_input, fullfile(blur_root,sprintf('%04d.png',name_index)));%save + imwrite(HR_label1, fullfile(hr_root,sprintf('%04d.png',name_index)));%save + end +end +end + diff --git a/h5_generator/modcrop.m b/h5_generator/modcrop.m new file mode 100755 index 0000000..70db8d2 --- /dev/null +++ b/h5_generator/modcrop.m @@ -0,0 +1,31 @@ +% ------------------------------------------------------------------------- +% Description: +% Make a image get a modulo operation. +% +% Parameter: +% +% Output: +% - A moduloed image. +% +% Citation: +% Gated Fusion Network for Joint Image Deblurring and Super-Resolution +% The British Machine Vision Conference(BMVC2018 oral) +% Xinyi Zhang, Hang Dong, Zhe Hu, Wei-Sheng Lai, Fei Wang and Ming-Hsuan Yang +% +% Contact: +% cvxinyizhang@gmail.com +% Project Website: +% http://xinyizhang.tech/bmvc2018 +%% +function imgs = modcrop(imgs, modulo) +if size(imgs,3)==1 + sz = size(imgs); + sz = sz - mod(sz, modulo); + imgs = imgs(1:sz(1), 1:sz(2)); +else + tmpsz = size(imgs); + sz = tmpsz(1:2); + sz = sz - mod(sz, modulo); + imgs = imgs(1:sz(1), 1:sz(2),:); +end + diff --git a/h5_generator/store2hdf5.m b/h5_generator/store2hdf5.m new file mode 100755 index 0000000..de5545e --- /dev/null +++ b/h5_generator/store2hdf5.m @@ -0,0 +1,91 @@ +% ------------------------------------------------------------------------- +% Description: +% Store into hdf5 files. +% +% Parameter: +% +% Output: +% - The generated hdf5 files to train. +% +% Citation: +% Gated Fusion Network for Joint Image Deblurring and Super-Resolution +% The British Machine Vision Conference(BMVC2018 oral) +% Xinyi Zhang, Hang Dong, Zhe Hu, Wei-Sheng Lai, Fei Wang and Ming-Hsuan Yang +% +% Contact: +% cvxinyizhang@gmail.com +% Project Website: +% http://xinyizhang.tech/bmvc2018 +%% +function [curr_dat_sz, curr_lab_db_sz, curr_lab_sz] = store2hdf5(filename, data, labels_db, labels, create, startloc, chunksz) + % *data* is W*H*C*N matrix of images should be normalized (e.g. to lie between 0 and 1) beforehand + % *label* is D*N matrix of labels (D labels per sample) + % *create* [0/1] specifies whether to create file newly or to append to previously created file, useful to store information in batches when a dataset is too big to be held in memory (default: 1) + % *startloc* (point at which to start writing data). By default, + % if create=1 (create mode), startloc.data=[1 1 1 1], and startloc.lab=[1 1]; + % if create=0 (append mode), startloc.data=[1 1 1 K+1], and startloc.lab = [1 K+1]; where K is the current number of samples stored in the HDF + % chunksz (used only in create mode), specifies number of samples to be stored per chunk (see HDF5 documentation on chunking) for creating HDF5 files with unbounded maximum size - TLDR; higher chunk sizes allow faster read-write operations + + % verify that format is right + dat_dims=size(data); + lab_db_dims=size(labels_db); + lab_dims=size(labels); + num_samples=dat_dims(end); + + assert(lab_dims(end)==num_samples, 'Number of samples should be matched between data and labels'); + assert(lab_db_dims(end)==num_samples, 'Number of samples should be matched between data and labels'); + + + if ~exist('create','var') + create=true; + end + + + if create + %fprintf('Creating dataset with %d samples\n', num_samples); + if ~exist('chunksz', 'var') + chunksz=1000; + end + if exist(filename, 'file') + fprintf('Warning: replacing existing file %s \n', filename); + delete(filename); + end + + h5create(filename, '/data', [dat_dims(1:end-1) Inf], 'Datatype', 'single', 'ChunkSize', [dat_dims(1:end-1) chunksz]); % width, height, channels, number + h5create(filename, '/label_db', [lab_db_dims(1:end-1) Inf], 'Datatype', 'single', 'ChunkSize', [lab_db_dims(1:end-1) chunksz]); % width, height, channels, number + h5create(filename, '/label', [lab_dims(1:end-1) Inf], 'Datatype', 'single', 'ChunkSize', [lab_dims(1:end-1) chunksz]); % width, height, channels, number + if ~exist('startloc','var') + startloc.dat=[ones(1,length(dat_dims)-1), 1]; + startloc.lab_db=[ones(1,length(lab_db_dims)-1), 1]; + startloc.lab=[ones(1,length(lab_dims)-1), 1]; + end + + else % append mode + if ~exist('startloc','var') + info=h5info(filename); + prev_dat_sz=info.Datasets(1).Dataspace.Size; + prev_lab_db_sz=info.Datasets(2).Dataspace.Size; + prev_lab_sz=info.Datasets(3).Dataspace.Size; + + assert(prev_dat_sz(1:end-1)==dat_dims(1:end-1), 'Data dimensions must match existing dimensions in dataset'); + assert(prev_lab_db_sz(1:end-1)==lab_db_dims(1:end-1), 'Label_db dimensions must match existing dimensions in dataset'); + assert(prev_lab_sz(1:end-1)==lab_dims(1:end-1), 'Label dimensions must match existing dimensions in dataset'); + startloc.dat=[ones(1,length(dat_dims)-1), prev_dat_sz(end)+1]; + startloc.lab_db=[ones(1,length(lab_db_dims)-1), prev_lab_db_sz(end)+1]; + startloc.lab=[ones(1,length(lab_dims)-1), prev_lab_sz(end)+1]; + end + end + + if ~isempty(data) + h5write(filename, '/data', single(data), startloc.dat, size(data)); + h5write(filename, '/label_db', single(labels_db), startloc.lab_db, size(labels_db)); + h5write(filename, '/label', single(labels), startloc.lab, size(labels)); + end + + if nargout + info=h5info(filename); + curr_dat_sz=info.Datasets(1).Dataspace.Size; + curr_lab_db_sz=info.Datasets(2).Dataspace.Size; + curr_lab_sz=info.Datasets(3).Dataspace.Size; + end +end diff --git a/models/.DS_Store b/models/.DS_Store index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..899289e646275790cef50897eda7469389bdc5e5 100755 GIT binary patch literal 8196 zcmeHMK~Eb;6n+D=*rh28fdEMktDs7eKoRR;g(!+}9GcXMT3n1Mgd}FY9?XjM&T4lJ z1w!RZe?ZS|e?W4{p~w7zNImqJQ`JL%KqKYUQ~PFTyus_ZN+TLY$qbtL-p+e(hWU1Q zGj9O^l5bQEfN=mwVdba|VDpl~^}KeJ9@#UDNYEcx1tksZ6{%667*Gr-1{4E|0mZ=E z#sHq#yrjCE`$DT)#eibqy<~vL2OTTNoW!QUD0E;Gr2vS1*c}y=c>=(Fbcs2MO@XMv zLWC=#a3wOuAi^E{b!nHA*c2$-fym^8$eD@EP)Ia8j;}}NKym_As~AuWbTS}vccb7i ztKzif@8|!HO5{SosO$!wwD_gsId%}v%seGMy?q~i*q=({&xzFC(iYn-g=W|Y@}|Ge zpNeLxSKwuZZzKF=4L>{ z)v`7iSUz){A`9%$X71V%?b@9HDKCVyUT`-V&bWgVFM8Z8SfPG^*x|prX8OMA)@Xk3 zu47iHv*_ko7_vII4E&7y?v}&Ww*D^W(Owc%)yVVlT3qgZPA>g%ABg-yxX*xZb zE6UCkOu;qy0#;xf_ThW@2_C^?cmlt{pYRvyClllxnIf~~Dw!vrlLEO#isUP@B)ofC zFY#<^3V~!D5ntj?$#)&*)}klglS%CA2dHV^)tR?#S7)<)SI=HLj$NJUAmm~@A!IB; zhz2*|27C!+px^-m3${=;;4)mm=WTEj{@=Zle-^S`{GTWM`yj-b>)^G|1HYo(!z1A+ zwtIJ9U%bTE3Qeac-h5~}8i+c=%&~^1I1qKlsQ(z6;>eW7>t`}FJ!lI}+Dk*zZQPky z{xvkkuhOX*C5zQP;S;s7uFe(~s*TVBc=`u>lGIhZ>b$M)VjqX{xLs3Vw5KPGg_gAhnpCgF}!R pBnTAa1`@77th%xAJM(0I8AV3M$)+;eJWLRCKt?lcj^~-f3;-`E4{!hg diff --git a/networks/.DS_Store b/networks/.DS_Store index 8dfdff2dcdf906dfc9db495adae4b32fd4fba585..b4d63361868849d816d7850ed1e8a5d9bf089de4 100755 GIT binary patch delta 41 wcmZoMXffFEnn~2y%tS}Q(7?o~R!5=Q(8$18N5R5)5_1}}2}8x^Oy=1l0P&v-1ONa4 delta 41 wcmZoMXffFEnn~2u*jPuw(9puPR!5=Q(7?!CN5Rx&5_1}J1%t`vOy=1l0P@`n3;+NC diff --git a/networks/GFN_4x.py b/networks/GFN_4x.py new file mode 100755 index 0000000..0b1c736 --- /dev/null +++ b/networks/GFN_4x.py @@ -0,0 +1,229 @@ +import torch +import torch.nn as nn +import math +import torch.nn.init as init +import os + +class _ResBLockDB(nn.Module): + def __init__(self, inchannel, outchannel, stride=1): + super(_ResBLockDB, self).__init__() + self.layers = nn.Sequential( + nn.Conv2d(inchannel, outchannel, 3, stride, 1, bias=True), + nn.ReLU(inplace=True), + nn.Conv2d(outchannel, outchannel, 3, stride, 1, bias=True) + ) + for i in self.modules(): + if isinstance(i, nn.Conv2d): + j = i.kernel_size[0] * i.kernel_size[1] * i.out_channels + i.weight.data.normal_(0, math.sqrt(2 / j)) + if i.bias is not None: + i.bias.data.zero_() + + def forward(self, x): + out = self.layers(x) + residual = x + out = torch.add(residual, out) + return out + +class _ResBlockSR(nn.Module): + def __init__(self, inchannel, outchannel, stride=1): + super(_ResBlockSR, self).__init__() + self.layers = nn.Sequential( + nn.Conv2d(inchannel, outchannel, 3, stride, 1, bias=True), + nn.LeakyReLU(0.2, inplace=True), + nn.Conv2d(outchannel, outchannel, 3, stride, 1, bias=True) + ) + for i in self.modules(): + if isinstance(i, nn.Conv2d): + j = i.kernel_size[0] * i.kernel_size[1] * i.out_channels + i.weight.data.normal_(0, math.sqrt(2 / j)) + if i.bias is not None: + i.bias.data.zero_() + + def forward(self, x): + out = self.layers(x) + residual = x + out = torch.add(residual, out) + return out + +class _DeblurringMoudle(nn.Module): + def __init__(self): + super(_DeblurringMoudle, self).__init__() + self.conv1 = nn.Conv2d(3, 64, (7, 7), 1, padding=3) + self.relu = nn.LeakyReLU(0.2, inplace=True) + self.resBlock1 = self._makelayers(64, 64, 6) + self.conv2 = nn.Sequential( + nn.Conv2d(64, 128, (3, 3), 2, 1), + nn.ReLU(inplace=True) + ) + self.resBlock2 = self._makelayers(128, 128, 6) + self.conv3 = nn.Sequential( + nn.Conv2d(128, 256, (3, 3), 2, 1), + nn.ReLU(inplace=True) + ) + self.resBlock3 = self._makelayers(256, 256, 6) + self.deconv1 = nn.Sequential( + nn.ConvTranspose2d(256, 128, (4, 4), 2, padding=1), + nn.ReLU(inplace=True) + ) + self.deconv2 = nn.Sequential( + nn.ConvTranspose2d(128, 64, (4, 4), 2, padding=1), + nn.ReLU(inplace=True), + nn.Conv2d(64, 64, (7, 7), 1, padding=3) + ) + self.convout = nn.Sequential( + nn.Conv2d(64, 64, (3, 3), 1, 1), + nn.ReLU(inplace=True), + nn.Conv2d(64, 3, (3, 3), 1, 1) + ) + for i in self.modules(): + if isinstance(i, nn.Conv2d): + j = i.kernel_size[0] * i.kernel_size[1] * i.out_channels + i.weight.data.normal_(0, math.sqrt(2 / j)) + if i.bias is not None: + i.bias.data.zero_() + + def _makelayers(self, inchannel, outchannel, block_num, stride=1): + layers = [] + for i in range(0, block_num): + layers.append(_ResBLockDB(inchannel, outchannel)) + return nn.Sequential(*layers) + + def forward(self, x): + con1 = self.relu(self.conv1(x)) + res1 = self.resBlock1(con1) + res1 = torch.add(res1, con1) + con2 = self.conv2(res1) + res2 = self.resBlock2(con2) + res2 = torch.add(res2, con2) + con3 = self.conv3(res2) + res3 = self.resBlock3(con3) + res3 = torch.add(res3, con3) + decon1 = self.deconv1(res3) + deblur_feature = self.deconv2(decon1) + deblur_out = self.convout(torch.add(deblur_feature, con1)) + return deblur_feature, deblur_out + +class _SRMoudle(nn.Module): + def __init__(self): + super(_SRMoudle, self).__init__() + self.conv1 = nn.Conv2d(3, 64, (7, 7), 1, padding=3) + self.relu = nn.LeakyReLU(0.2, inplace=True) + self.resBlock = self._makelayers(64, 64, 8, 1) + self.conv2 = nn.Conv2d(64, 64, (3, 3), 1, 1) + + for i in self.modules(): + if isinstance(i, nn.Conv2d): + j = i.kernel_size[0] * i.kernel_size[1] * i.out_channels + i.weight.data.normal_(0, math.sqrt(2 / j)) + if i.bias is not None: + i.bias.data.zero_() + + def _makelayers(self, inchannel, outchannel, block_num, stride=1): + layers = [] + for i in range(0, block_num): + layers.append(_ResBlockSR(inchannel, outchannel)) + return nn.Sequential(*layers) + + def forward(self, x): + con1 = self.relu(self.conv1(x)) + res1 = self.resBlock(con1) + con2 = self.conv2(res1) + sr_feature = torch.add(con2, con1) + return sr_feature + +class _GateMoudle(nn.Module): + def __init__(self): + super(_GateMoudle, self).__init__() + + self.conv1 = nn.Conv2d(131, 64, (3, 3), 1, 1) + self.relu = nn.LeakyReLU(0.2, inplace=True) + self.conv2 = nn.Conv2d(64, 64, (1, 1), 1, padding=0) + + for i in self.modules(): + if isinstance(i, nn.Conv2d): + j = i.kernel_size[0] * i.kernel_size[1] * i.out_channels + i.weight.data.normal_(0, math.sqrt(2 / j)) + if i.bias is not None: + i.bias.data.zero_() + + def forward(self, x): + con1 = self.relu(self.conv1(x)) + scoremap = self.conv2(con1) + return scoremap + +class _ReconstructMoudle(nn.Module): + def __init__(self): + super(_ReconstructMoudle, self).__init__() + self.resBlock = self._makelayers(64, 64, 8) + self.conv1 = nn.Conv2d(64, 256, (3, 3), 1, 1) + self.pixelShuffle1 = nn.PixelShuffle(2) + self.relu1 = nn.LeakyReLU(0.1, inplace=True) + self.conv2 = nn.Conv2d(64, 256, (3, 3), 1, 1) + self.pixelShuffle2 = nn.PixelShuffle(2) + self.relu2 = nn.LeakyReLU(0.2, inplace=True) + self.conv3 = nn.Conv2d(64, 64, (3, 3), 1, 1) + self.relu3 = nn.LeakyReLU(0.2, inplace=True) + self.conv4 = nn.Conv2d(64, 3, (3, 3), 1, 1) + + for i in self.modules(): + if isinstance(i, nn.Conv2d): + j = i.kernel_size[0] * i.kernel_size[1] * i.out_channels + i.weight.data.normal_(0, math.sqrt(2 / j)) + if i.bias is not None: + i.bias.data.zero_() + + def _makelayers(self, inchannel, outchannel, block_num, stride=1): + layers = [] + for i in range(0, block_num): + layers.append(_ResBLockDB(inchannel, outchannel)) + return nn.Sequential(*layers) + + def forward(self, x): + res1 = self.resBlock(x) + con1 = self.conv1(res1) + pixelshuffle1 = self.relu1(self.pixelShuffle1(con1)) + con2 = self.conv2(pixelshuffle1) + pixelshuffle2 = self.relu2(self.pixelShuffle2(con2)) + con3 = self.relu3(self.conv3(pixelshuffle2)) + sr_deblur = self.conv4(con3) + return sr_deblur + +class Net(nn.Module): + def __init__(self): + super(Net, self).__init__() + self.deblurMoudle = self._make_net(_DeblurringMoudle) + self.srMoudle = self._make_net(_SRMoudle) + self.geteMoudle = self._make_net(_GateMoudle) + self.reconstructMoudle = self._make_net(_ReconstructMoudle) + + def forward(self, x, gated, isTest): + if isTest == True: + origin_size = x.size() + input_size = (math.ceil(origin_size[2]/4)*4, math.ceil(origin_size[3]/4)*4) + out_size = (origin_size[2]*4, origin_size[3]*4) + x = nn.functional.upsample(x, size=input_size, mode='bilinear') + + deblur_feature, deblur_out = self.deblurMoudle(x) + sr_feature = self.srMoudle(x) + if gated == True: + scoremap = self.geteMoudle(torch.cat((deblur_feature, x, sr_feature), 1)) + else: + scoremap = torch.cuda.FloatTensor().resize_(sr_feature.shape).zero_()+1 + repair_feature = torch.mul(scoremap, deblur_feature) + fusion_feature = torch.add(sr_feature, repair_feature) + recon_out = self.reconstructMoudle(fusion_feature) + + if isTest == True: + recon_out = nn.functional.upsample(recon_out, size=out_size, mode='bilinear') + + return deblur_out, recon_out + + def _make_net(self, net): + nets = [] + nets.append(net()) + return nn.Sequential(*nets) + + + + diff --git a/networks/GFN_x4.py b/networks/GFN_x4.py deleted file mode 100755 index 7a69e99..0000000 --- a/networks/GFN_x4.py +++ /dev/null @@ -1,187 +0,0 @@ -import torch -import torch.nn as nn -import math -import torch.nn.init as init - - -class _Residual_Block_DB(nn.Module): - def __init__(self, num_ft): - super(_Residual_Block_DB, self).__init__() - - self.conv1 = nn.Conv2d(in_channels=num_ft, out_channels=num_ft, kernel_size=3, stride=1, padding=1, bias=True) - self.relu = nn.ReLU(inplace=True) - self.conv2 = nn.Conv2d(in_channels=num_ft, out_channels=num_ft, kernel_size=3, stride=1, padding=1, bias=True) - - def forward(self, x): - identity_data = x - output = self.relu(self.conv1(x)) - output = self.conv2(output) - output = torch.add(output, identity_data) - return output - -class _Residual_Block_SR(nn.Module): - def __init__(self): - super(_Residual_Block_SR, self).__init__() - - self.conv1 = nn.Conv2d(in_channels=64, out_channels=64, kernel_size=3, stride=1, padding=1, bias=True) - self.relu = nn.LeakyReLU(0.2, inplace=True) - self.conv2 = nn.Conv2d(in_channels=64, out_channels=64, kernel_size=3, stride=1, padding=1, bias=True) - - def forward(self, x): - identity_data = x - output = self.relu(self.conv1(x)) - output = self.conv2(output) - output = torch.add(output, identity_data) - return output - - -class _EDNet(nn.Module): - def __init__(self): - super(_EDNet, self).__init__() - - self.conv_input = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=7, stride=1, padding=3, bias=True) - self.relu = nn.LeakyReLU(0.2, inplace=True) - - self.residual_db = self.make_layer(_Residual_Block_DB, 6, 64) - - self.conv_stride1 = nn.Sequential( - nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3, stride=2, padding=1, bias=True), - nn.ReLU(inplace=True) - ) - self.residual_db1 = self.make_layer(_Residual_Block_DB, 6, 128) - - self.conv_stride2 = nn.Sequential( - nn.Conv2d(in_channels=128, out_channels=256, kernel_size=3, stride=2, padding=1, bias=True), - nn.ReLU(inplace=True) - ) - - self.residual_db2 = self.make_layer(_Residual_Block_DB, 6, 256) - - self.deconv2 = nn.Sequential( - nn.ConvTranspose2d(in_channels=256, out_channels=128, kernel_size=4, stride=2, padding=1, bias=True), - nn.ReLU(), - ) - - self.deconv1 = nn.Sequential( - nn.ConvTranspose2d(in_channels=128, out_channels=64, kernel_size=4, stride=2, padding=1, bias=True), - nn.ReLU(), - nn.Conv2d(in_channels=64, out_channels=64, kernel_size=7, stride=1, padding=3, bias=True) - ) - - self.conv_out = nn.Sequential( - nn.Conv2d(in_channels=64, out_channels=64, kernel_size=3, stride=1, padding=1, bias=True), - nn.ReLU(), - nn.Conv2d(in_channels=64, out_channels=3, kernel_size=3, stride=1, padding=1, bias=True) - ) - - for m in self.modules(): - if isinstance(m, nn.Conv2d): - n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels - m.weight.data.normal_(0, math.sqrt(2. / n)) - if m.bias is not None: - m.bias.data.zero_() - elif isinstance(m, nn.BatchNorm2d): - m.weight.data.fill_(1) - if m.bias is not None: - m.bias.data.zero_() - - def make_layer(self, block, num_of_layer, num_ft): - layers = [] - for _ in range(num_of_layer): - layers.append(block(num_ft)) - return nn.Sequential(*layers) - - def forward(self, x): - out = self.conv_input(x) - res1 = out - out = self.residual_db(out) - out = torch.add(out, res1) - out = self.conv_stride1(out) - residual1 = out - out = self.residual_db1(out) - out = torch.add(out, residual1) - out = self.conv_stride2(out) - residual2 = out - out = self.residual_db2(out) - out = torch.add(out, residual2) - out = self.deconv2(out) - out = self.deconv1(out) - res_ft = out - out = torch.add(out, res1) - out = self.conv_out(out) - return res_ft, out - - -class Net(nn.Module): - def __init__(self): - super(Net, self).__init__() - - self.conv_input = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=9, stride=1, padding=4, bias=True) - self.relu = nn.LeakyReLU(0.2, inplace=True) - - self.residual1 = self.make_layer(_Residual_Block_SR, 8) - self.residual2 = self.make_layer(_Residual_Block_SR, 8) - - self.conv_mid = nn.Conv2d(in_channels=64, out_channels=64, kernel_size=3, stride=1, padding=1, bias=True) - - self.upscale4x = nn.Sequential( - nn.Conv2d(in_channels=64, out_channels=256, kernel_size=3, stride=1, padding=1, bias=True), - nn.PixelShuffle(2), - nn.LeakyReLU(0.2, inplace=True), - nn.Conv2d(in_channels=64, out_channels=256, kernel_size=3, stride=1, padding=1, bias=True), - nn.PixelShuffle(2), - nn.LeakyReLU(0.2, inplace=True), - ) - - self.conv_output = nn.Sequential( - nn.Conv2d(64, 64, (3, 3), (1, 1), (1, 1)), # eliminate the artifacts - nn.LeakyReLU(0.2, inplace=True), - nn.Conv2d(64, 3, (3, 3), (1, 1), (1, 1)) - ) - - self.ednet = self.make_layer(_EDNet, 1) - - ##############Attention Model##################### - self.attention_model = nn.Sequential( - nn.Conv2d(in_channels=131, out_channels=64, kernel_size=3, stride=1, padding=1, bias=True), - nn.LeakyReLU(0.2, inplace=True), - nn.Conv2d(in_channels=64, out_channels=64, kernel_size=1, stride=1, padding=0, bias=True), - ) - - for m in self.modules(): - if isinstance(m, nn.Conv2d): - n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels - m.weight.data.normal_(0, math.sqrt(2. / n)) - if m.bias is not None: - m.bias.data.zero_() - elif isinstance(m, nn.BatchNorm2d): - m.weight.data.fill_(1) - if m.bias is not None: - m.bias.data.zero_() - - def make_layer(self, block, num_of_layer): - layers = [] - for _ in range(num_of_layer): - layers.append(block()) - return nn.Sequential(*layers) - - def forward(self, x): - [detail_ft, lr_deblur] = self.ednet(x) - att_in1 = detail_ft - - out = self.conv_input(x) - residual = out - out = self.residual1(out) - out = self.conv_mid(out) - out = torch.add(out, residual) - att_in2 = out - att_in = torch.cat((x,att_in1, att_in2), dim=1) - scoremap = self.attention_model(att_in) - detail_ft = torch.mul(detail_ft, scoremap) - - out = torch.add(out, detail_ft) - - out = self.residual2(out) - out = self.upscale4x(out) - sr = self.conv_output(out) - return lr_deblur, scoremap, sr \ No newline at end of file diff --git a/test_GFN_4x.py b/test_GFN_4x.py new file mode 100755 index 0000000..894d52d --- /dev/null +++ b/test_GFN_4x.py @@ -0,0 +1,133 @@ +# Citation: +# Gated Fusion Network for Joint Image Deblurring and Super-Resolution +# The British Machine Vision Conference(BMVC2018 oral) +# Xinyi Zhang, Hang Dong, Zhe Hu, Wei-Sheng Lai, Fei Wang and Ming-Hsuan Yang +# Contact: +# cvxinyizhang@gmail.com +# Project Website: +# http://xinyizhang.tech/bmvc2018 +# https://github.com/jacquelinelala/GFN + +from __future__ import print_function +import argparse +import os +import time +from math import log10 +from os.path import join +from torchvision import transforms +from torchvision import utils as utils +import torch +from torch.utils.data import DataLoader +from datasets.dataset_hf5 import DataValSet +import statistics +import matplotlib.pyplot as plot +import re + +parser = argparse.ArgumentParser(description="PyTorch LapSRN Test") +parser.add_argument("--scale", default=4, type=int, help="scale factor, Default: 4") +parser.add_argument("--gated", type=bool, default=True, help="Activated gate module") +parser.add_argument("--isTest", type=bool, default=True, help="Test or not") +parser.add_argument('--dataset', required=True, help='Path of the validation dataset') +parser.add_argument("--intermediate_process", default="", type=str, help="Test on intermediate pkl (default: none)") +os.environ['CUDA_VISIBLE_DEVICES'] = '1' +device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + +test_set=[ + {'gated':False}, + {'gated':False}, + {'gated':True} +] + +def is_pkl(filename): + return any(filename.endswith(extension) for extension in [".pkl"]) + +def which_trainingstep_epoch(resume): + trainingstep = "".join(re.findall(r"\d", resume)[0]) + start_epoch = "".join(re.findall(r"\d", resume)[1:]) + return int(trainingstep), int(start_epoch) + +def displayFeature(feature): + feat_permute = feature.permute(1, 0, 2, 3) + grid = utils.make_grid(feat_permute.cpu(), nrow=16, normalize=True, padding=10) + grid = grid.numpy().transpose((1, 2, 0)) + display_grid = grid[:, :, 0] + plot.imshow(display_grid) + +def test(test_gen, model, criterion, SR_dir): + avg_psnr = 0 + med_time = [] + + with torch.no_grad(): + for iteration, batch in enumerate(test_gen, 1): + LR_Blur = batch[0] + HR = batch[1] + LR_Blur = LR_Blur.to(device) + HR = HR.to(device) + + if opt.isTest == True: + test_Tensor = torch.cuda.FloatTensor().resize_(1).zero_() + 1 + else: + test_Tensor = torch.cuda.FloatTensor().resize_(1).zero_() + if opt.gated == True: + gated_Tensor = torch.cuda.FloatTensor().resize_(1).zero_() + 1 + else: + gated_Tensor = torch.cuda.FloatTensor().resize_(1).zero_() + + start_time = time.perf_counter()#-------------------------begin to deal with an image's time + [lr_deblur, sr] = model(LR_Blur, gated_Tensor, test_Tensor) + #modify + sr = torch.clamp(sr, min=0, max=1) + torch.cuda.synchronize()#wait for CPU & GPU time syn + evalation_time = time.perf_counter() - start_time#---------finish an image + med_time.append(evalation_time) + + resultSRDeblur = transforms.ToPILImage()(sr.cpu()[0]) + resultSRDeblur.save(join(SR_dir, '{0:04d}_GFN_4x.png'.format(iteration))) + print("Processing {}".format(iteration)) + mse = criterion(sr, HR) + psnr = 10 * log10(1 / mse) + avg_psnr += psnr + + print("Avg. SR PSNR:{:4f} dB".format(avg_psnr / iteration)) + median_time = statistics.median(med_time) + print(median_time) + +def model_test(model): + model = model.to(device) + criterion = torch.nn.MSELoss(size_average=True) + criterion = criterion.to(device) + print(opt) + test(testloader, model, criterion, SR_dir) + +opt = parser.parse_args() +root_val_dir = opt.dataset# #----------Validation path +SR_dir = join(root_val_dir, 'Results') #--------------------------SR results save path +isexists = os.path.exists(SR_dir) +if not isexists: + os.makedirs(SR_dir) +print("The results of testing images sotre in {}.".format(SR_dir)) + +testloader = DataLoader(DataValSet(root_val_dir), batch_size=1, shuffle=False, pin_memory=False) +print("===> Loading model and criterion") + +if opt.intermediate_process: + test_pkl = opt.intermediate_process + if is_pkl(test_pkl): + print("Testing model {}----------------------------------".format(opt.intermediate_process)) + train_step, epoch = which_trainingstep_epoch(opt.intermediate_process) + opt.gated = test_set[train_step-1]['gated'] + model = torch.load(test_pkl) + model_test(model) + else: + print("It's not a pkl file. Please give a correct pkl folder on command line for example --opt.intermediate_process /models/1/GFN_epoch_25.pkl)") +else: + test_dir = 'models/' + test_list = [x for x in sorted(os.listdir(test_dir)) if is_pkl(x)] + print("Testing on the given 3-step trained model which stores in /models, and ends with pkl.") + for i in range(len(test_list)): + print("Testing model is {}----------------------------------".format(test_list[i])) + model = torch.load(join(test_dir, test_list[i])) + model_test(model) + + + diff --git a/test_GFN_x4.py b/test_GFN_x4.py deleted file mode 100755 index 8226a93..0000000 --- a/test_GFN_x4.py +++ /dev/null @@ -1,90 +0,0 @@ -from __future__ import print_function - -import argparse -import os -import time -from math import log10 -from os.path import join -import numpy as np -from torchvision import transforms -import torch -from torch.utils.data import DataLoader -from datasets.dataset_hf5 import DataValSet -import statistics - -# Training settings -model_sets = {'GFN_4x':'models/GFN_4x.pth'} -modelName = 'GFN_4x' - -# Training settings -parser = argparse.ArgumentParser(description="PyTorch LapSRN Test") -parser.add_argument("--cuda", action="store_true", help="use cuda?") -parser.add_argument("--model", default=model_sets[modelName], type=str, help="model path") -parser.add_argument("--scale", default=4, type=int, help="scale factor, Default: 4") -os.environ['CUDA_VISIBLE_DEVICES'] = '0' -device = torch.device("cuda" if torch.cuda.is_available() else "cpu") - -def test(test_gen, model, criterion, SR_dir): - avg_psnr = 0 - med_time = [] - - with torch.no_grad(): - for iteration, batch in enumerate(test_gen, 1): - LR_Blur = batch[0] - LR_Deblur = batch[1] - HR = batch[2] - names = batch[3] - - LR_Blur = LR_Blur.to(device) - LR_Deblur = LR_Deblur.to(device) - HR = HR.to(device) - - start_time = time.perf_counter()#-------------------------begin to deal with an image's time - [lr_deblur, scoremap, sr] = model(LR_Blur) - #modify - im_l = lr_deblur.cpu().numpy() - im_l[im_l < 0] = 0 - im_l[im_l > 1] = 1 - im_h = sr.cpu().numpy() - im_h[im_h < 0] = 0 - im_h[im_h > 1] = 1 - torch.cuda.synchronize()#wait for CPU & GPU time syn - evalation_time = time.perf_counter() - start_time#---------finish an image - med_time.append(evalation_time) - - - lr_tensor = torch.from_numpy(np.asarray(im_l, np.float32)) - sr_tensor = torch.from_numpy(np.asarray(im_h, np.float32)) - - resultSRDeblur = transforms.ToPILImage()(sr_tensor[0]) - resultSRDeblur.save(join(SR_dir, '{0:04d}_GFN_4x.png'.format(iteration))) - LR = lr_tensor.to(device) - SR = sr_tensor.to(device) - - mse = criterion(SR, HR) - psnr = 10 * log10(1 / mse) - avg_psnr += psnr - print(iteration) - - print("===>Avg. SR PSNR:{:4f} dB".format(avg_psnr / iteration)) - median_time = statistics.median(med_time) - print(median_time) - -opt = parser.parse_args() -print(opt) - -print("===> Loading datasets") -root_val_dir = '/4TB/datasets/LR-GOPRO/Validation_4x' #----------Validation path -SR_dir = join(root_val_dir, 'Results') #--------------------------SR results save path -print(SR_dir) -testloader = DataLoader(DataValSet(root_val_dir), batch_size=1, shuffle=False, pin_memory=False) -print("===> Loading model and criterion") -print(opt.model) -model = torch.load(opt.model, map_location=lambda storage, loc: storage)["model"] -model = model.to(device) -criterion = torch.nn.MSELoss(size_average=True) -criterion = criterion.to(device) - -test(testloader, model, criterion, SR_dir) - - diff --git a/train_GFN_4x.py b/train_GFN_4x.py new file mode 100755 index 0000000..f2a40ec --- /dev/null +++ b/train_GFN_4x.py @@ -0,0 +1,151 @@ +# Citation: +# Gated Fusion Network for Joint Image Deblurring and Super-Resolution +# The British Machine Vision Conference(BMVC2018 oral) +# Xinyi Zhang, Hang Dong, Zhe Hu, Wei-Sheng Lai, Fei Wang and Ming-Hsuan Yang +# Contact: +# cvxinyizhang@gmail.com +# Project Website: +# http://xinyizhang.tech/bmvc2018 +# https://github.com/jacquelinelala/GFN + +from __future__ import print_function +import torch.optim as optim +import argparse +import os +from os.path import join +import torch +from torch.utils.data import DataLoader +from datasets.dataset_hf5 import DataSet +from networks.GFN_4x import Net +import random +import re + +# Training settings +parser = argparse.ArgumentParser(description="PyTorch Train") +parser.add_argument("--batchSize", type=int, default=16, help="Training batch size") +parser.add_argument("--start_training_step", type=int, default=1, help="Training step") +parser.add_argument("--nEpochs", type=int, default=60, help="Number of epochs to train") +parser.add_argument("--lr", type=float, default=1e-4, help="Learning rate, default=1e-4") +parser.add_argument("--step", type=int, default=7, help="Change the learning rate for every 30 epochs") +parser.add_argument("--start-epoch", type=int, default=1, help="Start epoch from 1") +parser.add_argument("--lr_decay", type=float, default=0.5, help="Decay scale of learning rate, default=0.5") +parser.add_argument("--resume", default="", type=str, help="Path to checkpoint (default: none)") +parser.add_argument("--scale", default=4, type=int, help="Scale factor, Default: 4") +parser.add_argument("--lambda_db", type=float, default=0.5, help="Weight of deblurring loss, default=0.5") +parser.add_argument("--gated", type=bool, default=False, help="Activated gate module") +parser.add_argument("--isTest", type=bool, default=False, help="Test or not") +parser.add_argument('--dataset', required=True, help='Path of the training dataset(.h5)') +os.environ['CUDA_VISIBLE_DEVICES'] = '1' +device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + +training_settings=[ + {'nEpochs': 25, 'lr': 1e-4, 'step': 7, 'lr_decay': 0.5, 'lambda_db': 0.5, 'gated': False}, + {'nEpochs': 60, 'lr': 1e-4, 'step': 30, 'lr_decay': 0.1, 'lambda_db': 0.5, 'gated': False}, + {'nEpochs': 55, 'lr': 5e-5, 'step': 25, 'lr_decay': 0.1, 'lambda_db': 0, 'gated': True} +] + +def mkdir_steptraing(): + root_folder = os.path.abspath('.') + models_folder = join(root_folder, 'models') + step1_folder, step2_folder, step3_folder = join(models_folder,'1'), join(models_folder,'2'), join(models_folder, '3') + isexists = os.path.exists(step1_folder) and os.path.exists(step2_folder) and os.path.exists(step3_folder) + if not isexists: + os.makedirs(step1_folder) + os.makedirs(step2_folder) + os.makedirs(step3_folder) + print("===> Step training models store in models/1 & /2 & /3.") + +def is_hdf5_file(filename): + return any(filename.endswith(extension) for extension in [".h5"]) + +def which_trainingstep_epoch(resume): + trainingstep = "".join(re.findall(r"\d", resume)[0]) + start_epoch = "".join(re.findall(r"\d", resume)[1:]) + return int(trainingstep), int(start_epoch) + +def adjust_learning_rate(epoch): + lr = opt.lr * (opt.lr_decay ** (epoch // opt.step)) + print(lr) + for param_group in optimizer.param_groups: + param_group['lr'] = lr + +def checkpoint(step, epoch): + model_out_path = "models/{}/GFN_epoch_{}.pkl".format(step, epoch) + torch.save(model, model_out_path) + print("===>Checkpoint saved to {}".format(model_out_path)) + +def train(train_gen, model, criterion, optimizer, epoch): + epoch_loss = 0 + for iteration, batch in enumerate(train_gen, 1): + #input, targetdeblur, targetsr + LR_Blur = batch[0] + LR_Deblur = batch[1] + HR = batch[2] + LR_Blur = LR_Blur.to(device) + LR_Deblur = LR_Deblur.to(device) + HR = HR.to(device) + + if opt.isTest == True: + test_Tensor = torch.cuda.FloatTensor().resize_(1).zero_()+1 + else: + test_Tensor = torch.cuda.FloatTensor().resize_(1).zero_() + if opt.gated == True: + gated_Tensor = torch.cuda.FloatTensor().resize_(1).zero_()+1 + else: + gated_Tensor = torch.cuda.FloatTensor().resize_(1).zero_() + + [lr_deblur, sr] = model(LR_Blur, gated_Tensor, test_Tensor) + + loss1 = criterion(lr_deblur, LR_Deblur) + loss2 = criterion(sr, HR) + mse = loss2 + opt.lambda_db * loss1 + epoch_loss += mse + optimizer.zero_grad() + mse.backward() + optimizer.step() + if iteration % 100 == 0: + print("===> Epoch[{}]({}/{}): Loss{:.4f};".format(epoch, iteration, len(trainloader), mse.cpu())) + print("===>Epoch{} Complete: Avg loss is :{:4f}".format(epoch, epoch_loss / len(trainloader))) + +opt = parser.parse_args() +opt.seed = random.randint(1, 10000) +torch.manual_seed(opt.seed) +torch.cuda.manual_seed(opt.seed) + +train_dir = opt.dataset +train_sets = [x for x in sorted(os.listdir(train_dir)) if is_hdf5_file(x)] +print("===> Loading model and criterion") + +if opt.resume: + if os.path.isfile(opt.resume): + print("Loading from checkpoint {}".format(opt.resume)) + model = torch.load(opt.resume) + model.load_state_dict(model.state_dict()) + opt.start_training_step, opt.start_epoch = which_trainingstep_epoch(opt.resume) +else: + model = Net() + mkdir_steptraing() + +model = model.to(device) +criterion = torch.nn.MSELoss(size_average=True) +criterion = criterion.to(device) +optimizer = optim.Adam(model.parameters(), lr=opt.lr) +print() + +for i in range(opt.start_training_step, 4): + opt.nEpochs = training_settings[i-1]['nEpochs'] + opt.lr = training_settings[i-1]['lr'] + opt.step = training_settings[i-1]['step'] + opt.lr_decay = training_settings[i-1]['lr_decay'] + opt.lambda_db = training_settings[i-1]['lambda_db'] + opt.gated = training_settings[i-1]['gated'] + print(opt) + for epoch in range(opt.start_epoch, opt.nEpochs+1): + adjust_learning_rate(epoch-1) + random.shuffle(train_sets) + for j in range(len(train_sets)): + print("Step {}:Training folder is {}-------------------------------".format(i, train_sets[j])) + train_set = DataSet(join(train_dir, train_sets[j])) + trainloader = DataLoader(dataset=train_set, batch_size=opt.batchSize, shuffle=True, num_workers=1) + train(trainloader, model, criterion, optimizer, epoch) + checkpoint(i, epoch) \ No newline at end of file