From 7a28d9a98e0054a49ec4967ae6ee341692497709 Mon Sep 17 00:00:00 2001 From: Unknown <850576570@qq.com> Date: Sun, 23 Dec 2018 09:27:00 +0800 Subject: [PATCH] Added evaluating code referenced in DeepVideoDeblurring. https://github.com/shuochsu/DeepVideoDeblurring/issues/3 --- evaluate/evaluate.m | 86 + evaluate/evaluate_align.m | 93 + evaluate/evaluation_code/MAD_index.m | 656 ++++ evaluate/evaluation_code/README.txt | 65 + evaluate/evaluation_code/dftregistration.m | 212 ++ evaluate/evaluation_code/eval_image.m | 106 + .../evaluation_code/get_best_metric_value2.m | 18 + .../metrix_mux/configure_metrix_mux.m | 88 + .../metrix_mux/get_name_cell_metrix_mux.m | 55 + .../metrix_mux/index.html | 305 ++ .../metrix_mux/metrix/compile_metrix_vsnr.m | 59 + .../metrix/ifc/ifcvec_release/distsub_est_M.m | 70 + .../metrix/ifc/ifcvec_release/ifcvec.m | 132 + .../metrix/ifc/ifcvec_release/ind2wtree.m | 13 + .../metrix/ifc/ifcvec_release/readme.txt | 62 + .../ifc/ifcvec_release/refparams_vecgsm.m | 52 + .../metrix_mux/metrix/metrix_ifc.m | 42 + .../metrix_mux/metrix/metrix_mse.m | 42 + .../metrix_mux/metrix/metrix_mssim.m | 42 + .../metrix_mux/metrix/metrix_nqm.m | 55 + .../metrix_mux/metrix/metrix_psnr.m | 44 + .../metrix_mux/metrix/metrix_snr.m | 45 + .../metrix_mux/metrix/metrix_ssim.m | 42 + .../metrix_mux/metrix/metrix_uqi.m | 42 + .../metrix_mux/metrix/metrix_vif.m | 42 + .../metrix_mux/metrix/metrix_vifp.m | 42 + .../metrix_mux/metrix/metrix_vsnr.m | 42 + .../metrix_mux/metrix/metrix_wsnr.m | 42 + .../metrix_mux/metrix/mssim/mssim_index.m | 129 + .../metrix/mssim/ssim_index_modified.m | 271 ++ .../metrix/nqm/ImageQuality/cmaskn.m | 23 + .../metrix_mux/metrix/nqm/ImageQuality/ctf.m | 13 + .../metrix_mux/metrix/nqm/ImageQuality/dm.m | 32 + .../metrix/nqm/ImageQuality/gthresh.m | 13 + .../metrix_mux/metrix/nqm/ImageQuality/nqm.m | 149 + .../metrix/nqm/ImageQuality/nqm_modified.m | 242 ++ .../metrix/nqm/ImageQuality/weight_freq_csf.m | 35 + .../metrix/nqm/ImageQuality/wsnr_new.m | 60 + .../nqm/ImageQuality/wsnr_new_modified.m | 89 + .../metrix_mux/metrix/ssim/ssim_index.m | 195 ++ .../metrix_mux/metrix/uqi/img_qi.m | 118 + .../metrix/vif/vifp_release/readme.txt | 56 + .../metrix/vif/vifp_release/vifp_mscale.m | 99 + .../metrix/vif/vifvec_release/ind2wtree.m | 13 + .../metrix/vif/vifvec_release/readme.txt | 60 + .../vif/vifvec_release/refparams_vecgsm.m | 52 + .../metrix/vif/vifvec_release/vifsub_est_M.m | 70 + .../metrix/vif/vifvec_release/vifvec.m | 135 + .../metrix_mux/metrix/vsnr/horse.JP2.bmp | Bin 0 -> 263222 bytes .../metrix_mux/metrix/vsnr/horse.NOZ.bmp | Bin 0 -> 263222 bytes .../metrix_mux/metrix/vsnr/horse.bmp | Bin 0 -> 263222 bytes .../metrix_mux/metrix/vsnr/imdwt.m | 11 + .../metrix/vsnr/imdwt_cpp/compile_imdwt.m | 2 + .../vsnr/imdwt_cpp/compile_imdwt_modified.m | 49 + .../vsnr/imdwt_cpp/ginclude/gbuffer.cpp | 143 + .../metrix/vsnr/imdwt_cpp/ginclude/gbuffer.h | 3016 +++++++++++++++++ .../vsnr/imdwt_cpp/ginclude/gbufferlist.cpp | 32 + .../vsnr/imdwt_cpp/ginclude/gbufferlist.h | 353 ++ .../metrix/vsnr/imdwt_cpp/ginclude/gfile.h | 189 ++ .../vsnr/imdwt_cpp/ginclude/gstepsizes.cpp | 28 + .../vsnr/imdwt_cpp/ginclude/gstepsizes.h | 131 + .../vsnr/imdwt_cpp/ginclude/gtransform.cpp | 28 + .../vsnr/imdwt_cpp/ginclude/gtransform.h | 406 +++ .../metrix/vsnr/imdwt_cpp/ginclude/gtypes.h | 230 ++ .../vsnr/imdwt_cpp/ginclude/gwavelift.cpp | 29 + .../vsnr/imdwt_cpp/ginclude/gwavelift.h | 515 +++ .../vsnr/imdwt_cpp/ginclude/gwavelist.cpp | 28 + .../vsnr/imdwt_cpp/ginclude/gwavelist.h | 434 +++ .../metrix/vsnr/imdwt_cpp/imdwt.cpp | 95 + .../metrix_mux/metrix/vsnr/imdwt_modified.m | 80 + .../metrix_mux/metrix/vsnr/readme.txt | 28 + .../metrix_mux/metrix/vsnr/vsnr.m | 309 ++ .../metrix_mux/metrix/vsnr/vsnr_demo.m | 29 + .../metrix_mux/metrix/vsnr/vsnr_modified.m | 387 +++ .../metrix_mux/metrix_mux.m | 157 + .../metrix_mux/preprocess_metrix_mux.m | 148 + .../metrix_mux/test_metrix_mux.m | 72 + .../metrix_mux/utilities/dwt2d/bior53.m | 53 + .../metrix_mux/utilities/dwt2d/bior97.m | 66 + .../metrix_mux/utilities/dwt2d/dwt2d.m | 114 + .../metrix_mux/utilities/dwt2d/idwt2d.m | 119 + .../utilities/matlabPyrTools/ChangeLog | 430 +++ .../utilities/matlabPyrTools/Contents.m | 107 + .../utilities/matlabPyrTools/MEX/-MacReadMe | 1 + .../matlabPyrTools/MEX/.AppleDouble/.Parent | Bin 0 -> 589 bytes .../utilities/matlabPyrTools/MEX/.FBCIndex | Bin 0 -> 258048 bytes .../MEX/.FBCLockFolder/.FBCSemaphoreFile | Bin 0 -> 6 bytes .../matlabPyrTools/MEX/Makefile-linux | 39 + .../matlabPyrTools/MEX/Makefile-ml6-linux | 39 + .../utilities/matlabPyrTools/MEX/Makefile-osx | 39 + .../matlabPyrTools/MEX/Makefile-solaris | 38 + .../matlabPyrTools/MEX/Makefile-sun4 | 39 + .../utilities/matlabPyrTools/MEX/convolve.c | 325 ++ .../utilities/matlabPyrTools/MEX/convolve.h | 55 + .../utilities/matlabPyrTools/MEX/corrDn.c | 145 + .../utilities/matlabPyrTools/MEX/corrDn.c~ | 151 + .../utilities/matlabPyrTools/MEX/corrDn.dll | Bin 0 -> 49664 bytes .../utilities/matlabPyrTools/MEX/corrDn.mex | Bin 0 -> 53067 bytes .../utilities/matlabPyrTools/MEX/corrDn.mex4 | Bin 0 -> 140703 bytes .../matlabPyrTools/MEX/corrDn.mexglx | Bin 0 -> 26678 bytes .../utilities/matlabPyrTools/MEX/corrDn.mexlx | Bin 0 -> 22398 bytes .../matlabPyrTools/MEX/corrDn.mexmac | Bin 0 -> 26224 bytes .../matlabPyrTools/MEX/corrDn.mexsol | Bin 0 -> 29556 bytes .../matlabPyrTools/MEX/corrDn.\302\265" | Bin 0 -> 95744 bytes .../matlabPyrTools/MEX/corrDn.\302\265.exp" | 1 + .../matlabPyrTools/MEX/corrDn.\302\265.rsrc" | 0 .../matlabPyrTools/MEX/corrDn.\317\200.4" | 0 .../utilities/matlabPyrTools/MEX/edges-orig.c | 494 +++ .../utilities/matlabPyrTools/MEX/edges.c | 647 ++++ .../utilities/matlabPyrTools/MEX/histo.c | 140 + .../utilities/matlabPyrTools/MEX/histo.c~ | 146 + .../utilities/matlabPyrTools/MEX/histo.dll | Bin 0 -> 8192 bytes .../utilities/matlabPyrTools/MEX/histo.mex | Bin 0 -> 2828 bytes .../utilities/matlabPyrTools/MEX/histo.mex4 | Bin 0 -> 14698 bytes .../utilities/matlabPyrTools/MEX/histo.mexglx | Bin 0 -> 8934 bytes .../utilities/matlabPyrTools/MEX/histo.mexlx | Bin 0 -> 6401 bytes .../utilities/matlabPyrTools/MEX/histo.mexmac | Bin 0 -> 26068 bytes .../utilities/matlabPyrTools/MEX/histo.mexsol | Bin 0 -> 7304 bytes .../matlabPyrTools/MEX/histo.\302\265" | Bin 0 -> 73980 bytes .../matlabPyrTools/MEX/histo.\302\265.exp" | 1 + .../matlabPyrTools/MEX/histo.\302\265.rsrc" | 0 .../matlabPyrTools/MEX/histo.\317\200.4" | 0 .../utilities/matlabPyrTools/MEX/innerProd.c | 52 + .../matlabPyrTools/MEX/innerProd.dll | Bin 0 -> 41984 bytes .../matlabPyrTools/MEX/innerProd.mexglx | Bin 0 -> 17704 bytes .../matlabPyrTools/MEX/innerProd.mexlx | Bin 0 -> 4479 bytes .../matlabPyrTools/MEX/innerProd.mexmac | Bin 0 -> 21600 bytes .../matlabPyrTools/MEX/innerProd.mexsol | Bin 0 -> 3948 bytes .../utilities/matlabPyrTools/MEX/pointOp.c | 126 + .../utilities/matlabPyrTools/MEX/pointOp.c~ | 132 + .../utilities/matlabPyrTools/MEX/pointOp.dll | Bin 0 -> 34816 bytes .../utilities/matlabPyrTools/MEX/pointOp.mex | Bin 0 -> 2536 bytes .../utilities/matlabPyrTools/MEX/pointOp.mex4 | Bin 0 -> 12472 bytes .../matlabPyrTools/MEX/pointOp.mexglx | Bin 0 -> 8677 bytes .../matlabPyrTools/MEX/pointOp.mexlx | Bin 0 -> 6167 bytes .../matlabPyrTools/MEX/pointOp.mexmac | Bin 0 -> 26064 bytes .../matlabPyrTools/MEX/pointOp.mexsol | Bin 0 -> 6872 bytes .../utilities/matlabPyrTools/MEX/pointOp.o | Bin 0 -> 4636 bytes .../matlabPyrTools/MEX/pointOp.\302\265" | Bin 0 -> 73639 bytes .../matlabPyrTools/MEX/pointOp.\302\265.exp" | 1 + .../matlabPyrTools/MEX/pointOp.\302\265.rsrc" | 0 .../matlabPyrTools/MEX/pointOp.\317\200.4" | 0 .../utilities/matlabPyrTools/MEX/range2.c | 56 + .../utilities/matlabPyrTools/MEX/range2.c~ | 62 + .../utilities/matlabPyrTools/MEX/range2.dll | Bin 0 -> 33792 bytes .../utilities/matlabPyrTools/MEX/range2.mex | Bin 0 -> 1181 bytes .../utilities/matlabPyrTools/MEX/range2.mex4 | Bin 0 -> 10318 bytes .../matlabPyrTools/MEX/range2.mexglx | Bin 0 -> 6933 bytes .../utilities/matlabPyrTools/MEX/range2.mexlx | Bin 0 -> 4683 bytes .../matlabPyrTools/MEX/range2.mexmac | Bin 0 -> 25960 bytes .../matlabPyrTools/MEX/range2.mexsol | Bin 0 -> 4660 bytes .../utilities/matlabPyrTools/MEX/range2.o | Bin 0 -> 2404 bytes .../matlabPyrTools/MEX/range2.\302\265" | Bin 0 -> 70932 bytes .../matlabPyrTools/MEX/range2.\302\265.exp" | 1 + .../matlabPyrTools/MEX/range2.\302\265.rsrc" | 0 .../matlabPyrTools/MEX/range2.\317\200.4" | 0 .../utilities/matlabPyrTools/MEX/upConv.c | 195 ++ .../utilities/matlabPyrTools/MEX/upConv.c~ | 201 ++ .../utilities/matlabPyrTools/MEX/upConv.dll | Bin 0 -> 51200 bytes .../utilities/matlabPyrTools/MEX/upConv.mex | Bin 0 -> 53570 bytes .../utilities/matlabPyrTools/MEX/upConv.mex4 | Bin 0 -> 142295 bytes .../matlabPyrTools/MEX/upConv.mexglx | Bin 0 -> 27798 bytes .../utilities/matlabPyrTools/MEX/upConv.mexlx | Bin 0 -> 23430 bytes .../matlabPyrTools/MEX/upConv.mexmac | Bin 0 -> 30320 bytes .../matlabPyrTools/MEX/upConv.mexsol | Bin 0 -> 31148 bytes .../utilities/matlabPyrTools/MEX/upConv.o | Bin 0 -> 7460 bytes .../matlabPyrTools/MEX/upConv.\302\265" | Bin 0 -> 97060 bytes .../matlabPyrTools/MEX/upConv.\302\265.exp" | 1 + .../matlabPyrTools/MEX/upConv.\302\265.rsrc" | 0 .../matlabPyrTools/MEX/upConv.\317\200.4" | 0 .../utilities/matlabPyrTools/MEX/wrap.c | 281 ++ .../utilities/matlabPyrTools/MEX/wrap.o | Bin 0 -> 5476 bytes .../utilities/matlabPyrTools/README | 55 + .../utilities/matlabPyrTools/TUTORIALS/README | 18 + .../matlabPyrTools/TUTORIALS/matlabPyrTools.m | 145 + .../matlabPyrTools/TUTORIALS/pyramids.m | 903 +++++ .../utilities/matlabPyrTools/binomialFilter.m | 18 + .../utilities/matlabPyrTools/blur.m | 28 + .../utilities/matlabPyrTools/blurDn.m | 59 + .../utilities/matlabPyrTools/buildGpyr.m | 82 + .../utilities/matlabPyrTools/buildLpyr.m | 109 + .../utilities/matlabPyrTools/buildSCFpyr.m | 90 + .../matlabPyrTools/buildSCFpyrLevs.m | 73 + .../utilities/matlabPyrTools/buildSFpyr.m | 102 + .../utilities/matlabPyrTools/buildSFpyrLevs.m | 63 + .../utilities/matlabPyrTools/buildSpyr.m | 61 + .../utilities/matlabPyrTools/buildSpyrLevs.m | 37 + .../utilities/matlabPyrTools/buildWpyr.m | 100 + .../utilities/matlabPyrTools/cconv2.m | 50 + .../utilities/matlabPyrTools/clip.m | 32 + .../utilities/matlabPyrTools/corrDn.m | 67 + .../utilities/matlabPyrTools/einstein.pgm | Bin 0 -> 65596 bytes .../utilities/matlabPyrTools/entropy2.m | 31 + .../utilities/matlabPyrTools/factorial.m | 16 + .../utilities/matlabPyrTools/feynman.pgm | Bin 0 -> 65593 bytes .../utilities/matlabPyrTools/histo.m | 58 + .../utilities/matlabPyrTools/histoMatch.m | 35 + .../utilities/matlabPyrTools/ifftshift.m | 15 + .../utilities/matlabPyrTools/imGradient.m | 48 + .../utilities/matlabPyrTools/imStats.m | 41 + .../utilities/matlabPyrTools/innerProd.m | 12 + .../utilities/matlabPyrTools/kurt2.m | 24 + .../utilities/matlabPyrTools/lplot.m | 43 + .../utilities/matlabPyrTools/lpyrHt.m | 11 + .../utilities/matlabPyrTools/maxPyrHt.m | 25 + .../utilities/matlabPyrTools/mean2.m | 7 + .../utilities/matlabPyrTools/mkAngle.m | 32 + .../utilities/matlabPyrTools/mkAngularSine.m | 42 + .../utilities/matlabPyrTools/mkDisc.m | 61 + .../utilities/matlabPyrTools/mkFract.m | 36 + .../utilities/matlabPyrTools/mkGaussian.m | 58 + .../utilities/matlabPyrTools/mkImpulse.m | 25 + .../metrix_mux/utilities/matlabPyrTools/mkR.m | 32 + .../utilities/matlabPyrTools/mkRamp.m | 47 + .../utilities/matlabPyrTools/mkSine.m | 67 + .../utilities/matlabPyrTools/mkSquare.m | 89 + .../utilities/matlabPyrTools/mkZonePlate.m | 33 + .../utilities/matlabPyrTools/mod_modified.m | 19 + .../utilities/matlabPyrTools/modulateFlip.m | 19 + .../utilities/matlabPyrTools/namedFilter.m | 71 + .../utilities/matlabPyrTools/nextFig.m | 19 + .../utilities/matlabPyrTools/pgmRead.m | 59 + .../utilities/matlabPyrTools/pgmWrite.m | 120 + .../utilities/matlabPyrTools/pixelAxes.m | 70 + .../utilities/matlabPyrTools/pointOp.m | 28 + .../utilities/matlabPyrTools/pwd2path.m | 6 + .../utilities/matlabPyrTools/pyrBand.m | 11 + .../utilities/matlabPyrTools/pyrBandIndices.m | 24 + .../utilities/matlabPyrTools/pyrLow.m | 12 + .../utilities/matlabPyrTools/range2.m | 18 + .../utilities/matlabPyrTools/rconv2.m | 50 + .../utilities/matlabPyrTools/rcosFn.m | 45 + .../utilities/matlabPyrTools/reconLpyr.m | 83 + .../utilities/matlabPyrTools/reconSCFpyr.m | 87 + .../utilities/matlabPyrTools/reconSFpyr.m | 108 + .../utilities/matlabPyrTools/reconSFpyrLevs.m | 69 + .../utilities/matlabPyrTools/reconSpyr.m | 96 + .../utilities/matlabPyrTools/reconSpyrLevs.m | 46 + .../utilities/matlabPyrTools/reconWpyr.m | 148 + .../utilities/matlabPyrTools/setPyrBand.m | 32 + .../utilities/matlabPyrTools/shift.m | 15 + .../utilities/matlabPyrTools/showIm.m | 221 ++ .../utilities/matlabPyrTools/showLpyr.m | 202 ++ .../utilities/matlabPyrTools/showSpyr.m | 188 + .../utilities/matlabPyrTools/showWpyr.m | 204 ++ .../utilities/matlabPyrTools/skew2.m | 21 + .../utilities/matlabPyrTools/sp0Filters.m | 72 + .../utilities/matlabPyrTools/sp1Filters.m | 91 + .../utilities/matlabPyrTools/sp3Filters.m | 121 + .../utilities/matlabPyrTools/sp5Filters.m | 110 + .../utilities/matlabPyrTools/spyrBand.m | 34 + .../utilities/matlabPyrTools/spyrHigh.m | 10 + .../utilities/matlabPyrTools/spyrHt.m | 16 + .../utilities/matlabPyrTools/spyrLev.m | 24 + .../utilities/matlabPyrTools/spyrNumBands.m | 20 + .../utilities/matlabPyrTools/steer.m | 68 + .../utilities/matlabPyrTools/steer2HarmMtx.m | 71 + .../utilities/matlabPyrTools/subMtx.m | 21 + .../utilities/matlabPyrTools/upBlur.m | 52 + .../utilities/matlabPyrTools/upConv.m | 80 + .../utilities/matlabPyrTools/var2.m | 17 + .../utilities/matlabPyrTools/vectify.m | 8 + .../utilities/matlabPyrTools/wpyrBand.m | 39 + .../utilities/matlabPyrTools/wpyrHt.m | 15 + .../utilities/matlabPyrTools/wpyrLev.m | 30 + .../utilities/matlabPyrTools/zconv2.m | 41 + evaluate/evaluation_code/imshift.m | 69 + evaluate/evaluation_code/myrgb2gray.m | 110 + evaluate/evaluation_code/shiftmatrix.m | 34 + evaluate/evaluation_code/start_eval_image.m | 79 + evaluate/evaluation_code/vec.m | 7 + my_run_pred.sh | 52 + run_model.sh | 9 +- 273 files changed, 22041 insertions(+), 4 deletions(-) create mode 100644 evaluate/evaluate.m create mode 100644 evaluate/evaluate_align.m create mode 100644 evaluate/evaluation_code/MAD_index.m create mode 100644 evaluate/evaluation_code/README.txt create mode 100644 evaluate/evaluation_code/dftregistration.m create mode 100644 evaluate/evaluation_code/eval_image.m create mode 100644 evaluate/evaluation_code/get_best_metric_value2.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/configure_metrix_mux.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/get_name_cell_metrix_mux.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/index.html create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/compile_metrix_vsnr.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/ifc/ifcvec_release/distsub_est_M.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/ifc/ifcvec_release/ifcvec.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/ifc/ifcvec_release/ind2wtree.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/ifc/ifcvec_release/readme.txt create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/ifc/ifcvec_release/refparams_vecgsm.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/metrix_ifc.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/metrix_mse.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/metrix_mssim.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/metrix_nqm.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/metrix_psnr.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/metrix_snr.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/metrix_ssim.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/metrix_uqi.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/metrix_vif.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/metrix_vifp.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/metrix_vsnr.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/metrix_wsnr.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/mssim/mssim_index.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/mssim/ssim_index_modified.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/nqm/ImageQuality/cmaskn.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/nqm/ImageQuality/ctf.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/nqm/ImageQuality/dm.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/nqm/ImageQuality/gthresh.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/nqm/ImageQuality/nqm.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/nqm/ImageQuality/nqm_modified.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/nqm/ImageQuality/weight_freq_csf.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/nqm/ImageQuality/wsnr_new.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/nqm/ImageQuality/wsnr_new_modified.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/ssim/ssim_index.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/uqi/img_qi.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/vif/vifp_release/readme.txt create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/vif/vifp_release/vifp_mscale.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/vif/vifvec_release/ind2wtree.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/vif/vifvec_release/readme.txt create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/vif/vifvec_release/refparams_vecgsm.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/vif/vifvec_release/vifsub_est_M.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/vif/vifvec_release/vifvec.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/vsnr/horse.JP2.bmp create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/vsnr/horse.NOZ.bmp create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/vsnr/horse.bmp create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/vsnr/imdwt.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/vsnr/imdwt_cpp/compile_imdwt.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/vsnr/imdwt_cpp/compile_imdwt_modified.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/vsnr/imdwt_cpp/ginclude/gbuffer.cpp create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/vsnr/imdwt_cpp/ginclude/gbuffer.h create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/vsnr/imdwt_cpp/ginclude/gbufferlist.cpp create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/vsnr/imdwt_cpp/ginclude/gbufferlist.h create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/vsnr/imdwt_cpp/ginclude/gfile.h create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/vsnr/imdwt_cpp/ginclude/gstepsizes.cpp create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/vsnr/imdwt_cpp/ginclude/gstepsizes.h create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/vsnr/imdwt_cpp/ginclude/gtransform.cpp create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/vsnr/imdwt_cpp/ginclude/gtransform.h create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/vsnr/imdwt_cpp/ginclude/gtypes.h create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/vsnr/imdwt_cpp/ginclude/gwavelift.cpp create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/vsnr/imdwt_cpp/ginclude/gwavelift.h create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/vsnr/imdwt_cpp/ginclude/gwavelist.cpp create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/vsnr/imdwt_cpp/ginclude/gwavelist.h create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/vsnr/imdwt_cpp/imdwt.cpp create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/vsnr/imdwt_modified.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/vsnr/readme.txt create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/vsnr/vsnr.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/vsnr/vsnr_demo.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix/vsnr/vsnr_modified.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/metrix_mux.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/preprocess_metrix_mux.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/test_metrix_mux.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/dwt2d/bior53.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/dwt2d/bior97.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/dwt2d/dwt2d.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/dwt2d/idwt2d.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/ChangeLog create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/Contents.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/-MacReadMe create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/.AppleDouble/.Parent create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/.FBCIndex create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/.FBCLockFolder/.FBCSemaphoreFile create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/Makefile-linux create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/Makefile-ml6-linux create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/Makefile-osx create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/Makefile-solaris create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/Makefile-sun4 create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/convolve.c create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/convolve.h create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/corrDn.c create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/corrDn.c~ create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/corrDn.dll create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/corrDn.mex create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/corrDn.mex4 create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/corrDn.mexglx create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/corrDn.mexlx create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/corrDn.mexmac create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/corrDn.mexsol create mode 100644 "evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/corrDn.\302\265" create mode 100644 "evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/corrDn.\302\265.exp" create mode 100644 "evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/corrDn.\302\265.rsrc" create mode 100644 "evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/corrDn.\317\200.4" create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/edges-orig.c create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/edges.c create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/histo.c create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/histo.c~ create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/histo.dll create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/histo.mex create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/histo.mex4 create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/histo.mexglx create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/histo.mexlx create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/histo.mexmac create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/histo.mexsol create mode 100644 "evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/histo.\302\265" create mode 100644 "evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/histo.\302\265.exp" create mode 100644 "evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/histo.\302\265.rsrc" create mode 100644 "evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/histo.\317\200.4" create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/innerProd.c create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/innerProd.dll create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/innerProd.mexglx create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/innerProd.mexlx create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/innerProd.mexmac create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/innerProd.mexsol create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/pointOp.c create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/pointOp.c~ create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/pointOp.dll create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/pointOp.mex create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/pointOp.mex4 create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/pointOp.mexglx create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/pointOp.mexlx create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/pointOp.mexmac create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/pointOp.mexsol create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/pointOp.o create mode 100644 "evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/pointOp.\302\265" create mode 100644 "evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/pointOp.\302\265.exp" create mode 100644 "evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/pointOp.\302\265.rsrc" create mode 100644 "evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/pointOp.\317\200.4" create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/range2.c create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/range2.c~ create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/range2.dll create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/range2.mex create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/range2.mex4 create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/range2.mexglx create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/range2.mexlx create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/range2.mexmac create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/range2.mexsol create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/range2.o create mode 100644 "evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/range2.\302\265" create mode 100644 "evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/range2.\302\265.exp" create mode 100644 "evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/range2.\302\265.rsrc" create mode 100644 "evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/range2.\317\200.4" create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/upConv.c create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/upConv.c~ create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/upConv.dll create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/upConv.mex create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/upConv.mex4 create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/upConv.mexglx create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/upConv.mexlx create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/upConv.mexmac create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/upConv.mexsol create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/upConv.o create mode 100644 "evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/upConv.\302\265" create mode 100644 "evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/upConv.\302\265.exp" create mode 100644 "evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/upConv.\302\265.rsrc" create mode 100644 "evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/upConv.\317\200.4" create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/wrap.c create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/MEX/wrap.o create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/README create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/TUTORIALS/README create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/TUTORIALS/matlabPyrTools.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/TUTORIALS/pyramids.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/binomialFilter.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/blur.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/blurDn.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/buildGpyr.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/buildLpyr.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/buildSCFpyr.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/buildSCFpyrLevs.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/buildSFpyr.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/buildSFpyrLevs.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/buildSpyr.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/buildSpyrLevs.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/buildWpyr.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/cconv2.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/clip.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/corrDn.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/einstein.pgm create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/entropy2.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/factorial.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/feynman.pgm create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/histo.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/histoMatch.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/ifftshift.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/imGradient.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/imStats.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/innerProd.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/kurt2.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/lplot.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/lpyrHt.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/maxPyrHt.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/mean2.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/mkAngle.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/mkAngularSine.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/mkDisc.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/mkFract.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/mkGaussian.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/mkImpulse.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/mkR.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/mkRamp.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/mkSine.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/mkSquare.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/mkZonePlate.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/mod_modified.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/modulateFlip.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/namedFilter.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/nextFig.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/pgmRead.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/pgmWrite.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/pixelAxes.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/pointOp.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/pwd2path.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/pyrBand.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/pyrBandIndices.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/pyrLow.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/range2.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/rconv2.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/rcosFn.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/reconLpyr.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/reconSCFpyr.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/reconSFpyr.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/reconSFpyrLevs.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/reconSpyr.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/reconSpyrLevs.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/reconWpyr.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/setPyrBand.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/shift.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/showIm.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/showLpyr.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/showSpyr.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/showWpyr.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/skew2.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/sp0Filters.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/sp1Filters.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/sp3Filters.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/sp5Filters.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/spyrBand.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/spyrHigh.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/spyrHt.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/spyrLev.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/spyrNumBands.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/steer.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/steer2HarmMtx.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/subMtx.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/upBlur.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/upConv.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/var2.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/vectify.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/wpyrBand.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/wpyrHt.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/wpyrLev.m create mode 100644 evaluate/evaluation_code/image_quality_algorithms/metrix_mux/utilities/matlabPyrTools/zconv2.m create mode 100644 evaluate/evaluation_code/imshift.m create mode 100644 evaluate/evaluation_code/myrgb2gray.m create mode 100644 evaluate/evaluation_code/shiftmatrix.m create mode 100644 evaluate/evaluation_code/start_eval_image.m create mode 100644 evaluate/evaluation_code/vec.m diff --git a/evaluate/evaluate.m b/evaluate/evaluate.m new file mode 100644 index 0000000..d966ce3 --- /dev/null +++ b/evaluate/evaluate.m @@ -0,0 +1,86 @@ + +%% Clean +clear +close all + +%% Parameters +date = '1220'; +alignments = {'_nowarp','_homography','_OF'};%{'_nowarp','_homography','_OF'}; +outputDir = 'E:\projects\DeepVideoDeblurring\outImg'; +outputFolderPrefix = [date '_validating_model2_symskip_nngraph2_deeper']; +gtDir = 'E:\projects\DeepVideoDeblurring\dataset\quantitative_datasets'; +global frameExt +frameExt = '.jpg'; + +%% Scan videos +outputFolders = {}; +for alignment = alignments + outputFolders{end+1} = [outputFolderPrefix,alignment{1}]; +end +outputFolders = fullfile(outputDir,outputFolders); +% videoNames = {}; +% for outputFolder = outputFolders +% videoNames{end+1} = dir(outputFolder{1}); +% maskFolders = [videoNames{end}.isdir]; +% videoNames{end} = videoNames{end}(maskFolders); +% videoNames{end} = videoNames{end}(3:end); +% videoNames{end} = {videoNames{end}.name}; +% end + +validset = {'IMG_0030' 'IMG_0049' 'IMG_0021' '720p_240fps_2' 'IMG_0032' ... +'IMG_0033' 'IMG_0031' 'IMG_0003' 'IMG_0039' 'IMG_0037'};% from git rep DeepVideoDeburring + +%% Evaluate PSNR +align2PSNRs = zeros(length(alignments),length(validset)+1); +for iAlignment = 1:length(alignments) + alignment = alignments{iAlignment}; + + %% scan validset frames + frameDirs = scanFrames(outputFolders{iAlignment},gtDir,validset); + + %% evaluate PSNR + for iVideo = 1:size(frameDirs,1) + avgPSNR = 0; + nFrame = size(frameDirs,2); + parfor iFrame = 1:nFrame + gtFrameDir = frameDirs{iVideo,iFrame,1}; + outputFrameDir = frameDirs{iVideo,iFrame,2}; + gt = imread(gtFrameDir); + output = imread(outputFrameDir); + scores = evaluate_align(gt,output,'PSNR'); + avgPSNR = avgPSNR+scores.PSNR; +% scores = metrix_mux(gt,output,'PSNR'); +% avgPSNR = avgPSNR+scores; + end + avgPSNR = avgPSNR/nFrame; + align2PSNRs(iAlignment,iVideo) = avgPSNR; + fprintf('video %d/%d done!\n',iVideo,size(frameDirs,1)) + end + +end +align2PSNRs(:,end) = mean(align2PSNRs(:,1:length(validset)),2) + +%% functions +function frameDirs = scanFrames(outputFolder,gtDir,videoNames) +global frameExt +% for all videos +disp('Scanning frames...'); +frameDirs = {}; +iFrameAll = 1; +for iVideo = 1:length(videoNames) + videoName = videoNames{iVideo}; + outputFrameFolder = fullfile(outputFolder,videoName); + outputFrameNames = dir(fullfile(outputFrameFolder,['*',frameExt])); + outputFrameNames = {outputFrameNames.name}; + gtFrameFolder = fullfile(gtDir,videoName,'GT'); + gtFrameNames = dir(fullfile(gtFrameFolder,['*',frameExt])); + gtFrameNames = {gtFrameNames.name}; + for iFrame = 1:length(outputFrameNames) + frameDirs{iVideo,iFrame,1} = [gtFrameFolder,'/',gtFrameNames{iFrame}]; + frameDirs{iVideo,iFrame,2} = [outputFrameFolder,'/',outputFrameNames{iFrame}]; + iFrameAll = iFrameAll+1; + end + fprintf('Found %d frames, video %d/%d\n',iFrameAll-1,iVideo,length(videoNames)) +end +fprintf('Found %d frames\n',iFrameAll-1) +end \ No newline at end of file diff --git a/evaluate/evaluate_align.m b/evaluate/evaluate_align.m new file mode 100644 index 0000000..0e15c1c --- /dev/null +++ b/evaluate/evaluate_align.m @@ -0,0 +1,93 @@ +function scores = evaluate_align(groundTruth,deblurred,metric) +% BENCHMARK_EVAL_IMAGE computes various quality measures given +% a deblurred image and the corresponding ID, i.e. you have to +% provide the image and kernel number +% +% Michael Hirsch and Rolf Koehler (c) 2012 + +addpath(genpath('image_quality_algorithms')) + +% ----------------------------------------------------------------- +% Check that input images are 8bit. +% To use the image quality assessment algorithms the images have to be in 8 +% bit, with a maximum value of 255, so not normalized. +% ----------------------------------------------------------------- +if ( ~isa(deblurred, 'uint8') || size(deblurred,3)~=3 ) + error('Input image has to be a color image of type uint8!'); +end + +% z will denote the estimated, i.e. deblurred image +z = double(deblurred); + +% Create constant image which will act as a mask +c = ones(size(deblurred)); + +% Initialize containers for quality measures +mse = []; +mssim = []; +vif = []; +ifc = []; +psnr = []; +mad = []; + + +% ================================================================= +% compute the image quality measure score +% ----------------------------------------------------------------- + + +% Load ground truth image, denoted by x +x = double(groundTruth); +xf = fft2(mean(x,3)); + +% Scale image intensity +zs = (sum(vec(x.*z)) / sum(vec(z.*z))) .* z; +zf = fft2(mean(zs,3)); + +% Estimate shift by registering deblurred to ground truth image +[output Greg] = dftregistration(xf, zf, 1); +shift = output(3:4); + +% Apply shift +cr = imshift(double(c), shift, 'same'); +zr = imshift(double(zs), shift, 'same'); +xr = x.*cr; + +% Compute various quality measures +switch metric + case 'MSE' + mse = [mse metrix_mux(xr, zr, 'MSE')]; + case 'MSSIM' + mssim = [mssim metrix_mux(xr, zr, 'MSSIM')]; + case 'VIF' + vif = [vif metrix_mux(xr, zr, 'VIF')]; + case 'IFC' + ifc = [ifc metrix_mux(xr, zr, 'IFC')]; + case 'PSNR' + psnr = [psnr metrix_mux(xr, zr, 'PSNR')]; + case 'MAD' + MAD_temp = MAD_index(xr, zr); + mad = [mad MAD_temp.MAD]; +end + + +% ================================================================= +% Save results +% ----------------------------------------------------------------- +switch metric + case 'MSE' + scores.MSE = mse; + case 'MSSIM' + scores.MSSIM = mssim; + case 'VIF' + scores.VIF = vif; + case 'IFC' + scores.IFC = ifc; + case 'PSNR' + scores.PSNR = psnr; + case 'MAD' + scores.MAD = mad; +end + +return + diff --git a/evaluate/evaluation_code/MAD_index.m b/evaluate/evaluation_code/MAD_index.m new file mode 100644 index 0000000..939b2ac --- /dev/null +++ b/evaluate/evaluation_code/MAD_index.m @@ -0,0 +1,656 @@ +function [index map gabors] = MAD_index( ref_img, dst_img, thresh ) +% MAD_INDEX Compute Perceived Difference of two images +% index = MAD_INDEX(ref_img, dst_img) where ref_img and dst_img are +% uint8 images and dst_img is a distorted version of ref_img +% returns the similarity score for the reference and distorted image as +% a structure: +% index.MAD: the difference score, higher means more different +% index.LO : the difference score based on assumption that distortions +% are highly visible (low quality image) +% index.HI : the difference score based on assumption that distortions +% are diffcult to see (high quality image) +% index.sig: blending parameter used to mix HI and LO into MAD score +% +% [index map] = MAD_INDEX(ref_img, dst_img) also returns maps used +% in calculating the scores: +% map.LO: returns an estimate of perceived annoyance of the highly +% visible distortion artifacts as an image the same size as the inputs +% map.HI: returns an estimate of the visibility of artifacts in the image +% as an image the same size as the inputs + +% Author: Eric Larson +% Department of Electrical and Computer Engineering +% Oklahoma State University, 2008 +% University Of Washington Seattle, 2009 +% Image Coding and Analysis Lab + +% 2008: Eric Larson, MAD code creation +% 2009: Eric Larson, Added mex file support +% 2010: (april) Releasing beta version of code +% 2010: (june) Fixed constant of 200 on d_detect +% 2010: (november) Fixed output gabor handling and non integer input images +% 2011: (september) Mad is now faster! + +if( nargin == 0 ) + %error( 'No valid input given. Please provide images or image names.' ); + index = hi_index; + return; +elseif( ~isinteger( ref_img ) && ~isfloat( ref_img )) + % read in the image names + ref_img = imread( ref_img ); + dst_img = imread( dst_img ); +end + +% Parameterize the input +% Initializations +index.LO = -1; +index.HI = -1; +index.MAD = -1; +map.LO = zeros( size( ref_img ) ); +map.HI = zeros( size( ref_img ) ); +map.sig = -1; + +% Ready data for processing +if( ndims( ref_img ) == 3 ) + ref_img = myrgb2gray( ref_img ); +end + +if( ndims( dst_img ) == 3 ) + dst_img = myrgb2gray( dst_img ); +end + +ref = double( ref_img ); +dst = double( dst_img ); + +% Calculate high quality index +% Calculate low quality index + +[index.HI map.HI] = hi_index( ref_img, dst_img ); + +if nargout >= 3 + [index.LO map.LO gabors] = lo_index( ref, dst ); +else + [index.LO map.LO] = lo_index( ref, dst ); +end + +% Combine outputs using sigmoid blend +if( nargin > 3 ) + thresh1 = thresh(1); + thresh2 = thresh(2); +else + thresh1 = 2.55; + thresh2 = 3.35; +end +b1 = exp(-thresh1/thresh2); +b2 = 1/(log(10)*thresh2); + +sig = 1 ./ ( 1 + b1*index.HI^b2 ) ; +index.sig = sig; +index.MAD = ( index.LO^(1-sig) .* index.HI.^(sig) ); + +% Not used, reserved for future version of MAD +%[map.ADAPT map.ALPHA index.SMAD] = adapt_map(map,[thresh1 thresh2]); +% profile off +% profile report + +end + +%=========================================== +% OTHER FUNCTIONS +%------------------------------------------- + +%----------------------------------------------------- +function [I mp imgs] = hi_index( ref_img, dst_img ) +% Calculate the high quality index by calculating the masking map and +% then approximating the local statistics, using filtering. +% Author: Eric Larson +% Department of Electrical and Computer Engineering +% Oklahoma State University, 2008 +% Image Coding and Analysis Lab + +% Masking/luminance parameters +k = 0.02874; +G = 0.5 ; % luminance threshold +C_slope = 1; % slope of detection threshold +Ci_thrsh= -5; % contrast to start slope, rather than const threshold +Cd_thrsh= -5; % saturated threshold +ms_scale= 1; % scaling constant +if(nargin==0)% for debug only, + I={'collapsing (mask) and raw lmse',... + 'using c code',... + 'using log scale',... + 'two norm',... + sprintf('Ci = %.2f',Ci_thrsh),... + sprintf('Cslope = %.2f',C_slope),... + sprintf('Cd = %.2f',Cd_thrsh),... + sprintf('G = %.2f',G),... + 'LO QUALITY',... + }; + return; +end +% log(Contrast of ref-dst) vs. log(Contrast of reference) +% / +% / +% / _| <- Cslope +% / +%----------+ <- Cdthresh (y axis height) +% /\ +% || +% Ci thresh (x axis value) + +% TAKE TO LUMINANCE DOMAIN USING LUT +if isinteger(ref_img) + LUT = 0:1:255; %generate LUT + LUT = k .* LUT .^ (2.2/3); + ref = LUT( ref_img + 1 ); + dst = LUT( dst_img + 1 ); +else % don't use the speed up + ref = k .* ref_img .^ (2.2/3); + dst = k .* dst_img .^ (2.2/3); +end + +[M N] = size( ref ); + +% ACCOUNT FOR CONTRAST SENSITIVITY +csf = make_csf( M, N, 32 )'; +ref = real( ifft2( ifftshift( fftshift( fft2( ref ) ).* csf ) ) ); +dst = real( ifft2( ifftshift( fftshift( fft2( dst ) ).* csf ) ) ); +refS = ref; +dstS = dst; + +% Use c code to get fast local stats +[std_2 std_1 m1_1] = ical_std( dst-ref, ref ); + +BSIZE = 16; + +Ci_ref = log(std_1./m1_1); % contrast of reference (also a measure of entropy) +Ci_dst = log(std_2./m1_1); % contrast of distortions (also a measure of entropy) +Ci_dst( find( m1_1 < G ) ) = -inf; + +msk = zeros( size(Ci_dst) ); +idx1 = find( (Ci_ref > Ci_thrsh) ... + & (Ci_dst > (C_slope * (Ci_ref - Ci_thrsh) + Cd_thrsh) ) ); +idx2 = find( (Ci_ref <= Ci_thrsh) & (Ci_dst > Cd_thrsh) ); + +msk(idx1) = ( Ci_dst( idx1 ) - (C_slope * (Ci_ref( idx1 )-Ci_thrsh) + Cd_thrsh) ) ./ ms_scale; +msk(idx2) = ( Ci_dst( idx2 ) - Cd_thrsh ) ./ ms_scale; +%= ( Contrast of heavy Dst - 0.75 * Contrast Ref ) / normalize +%= ( Contrast of low Dst - Threshold ) / normalize + +% Use lmse and weight by distortion mask +win = ones( BSIZE ) ./ BSIZE^2; + +% Michael Hirsch: replaced imfilter with filter2 which is shipped +% with MATLAB -> no need for image toolbox +%lmse = ( imfilter( ( double(ref_img) - double(dst_img) ).^2, ... +% win, 'symmetric', 'same', 'conv' ) ); +lmse = ( filter2( win, ( double(ref_img) - double(dst_img) ).^2, 'same' ) ); + +mp = msk .* lmse; + +% kill the edges +mp2 = mp( BSIZE+1:end-BSIZE-1, BSIZE+1:end-BSIZE-1); + +I = norm( mp2(:) , 2 ) ./ sqrt( length( mp2(:) ) ) .* 200; + +if( nargout > 2) + imgs.ref = refS; + imgs.dst = dstS; +end + + +end +%----------------------------------------------------- + +% %----------------------------------------------------- +function [I mp gabors] = lo_index( ref, dst ) +% Calculate the low quality index by calculating the Gabor analysis and +% then the local statistics, +% Author: Eric Larson +% Department of Electrical and Computer Engineering +% Oklahoma State University, 2008 +% Image Coding and analysis lab + + +% Decompose using Gabor Analysis +gabRef = gaborconvolve( double( ref ) ); +gabDst = gaborconvolve( double( dst ) ); + +[M N] = size( gabRef{1,1} ); +O = size( gabRef, 1 ) * size( gabRef, 2 ); +s = [0.5 0.75 1 5 6]; +mp = zeros( M, N ); +s = s./sum(s(:)); + + +if( nargout == 3) + gabors.dst = zeros( M, N, 5*4*3 ); + gabors.ref = zeros( M, N, 5*4*3 ); +end + +im_k = 0; +BSIZE = 16; +for gb_i = 1:5 + for gb_j = 1:4 + + im_k = im_k + 1; + fprintf('%d ',im_k) + + if( nargout == 3 ) + [gabors.ref(:,:,3*(im_k-1)+1), gabors.ref(:,:,3*(im_k-1)+2), gabors.ref(:,:,3*(im_k-1)+3)] ... + = ical_stat( abs( gabRef{gb_i,gb_j} ) ); + + [gabors.dst(:,:,3*(im_k-1)+1), gabors.dst(:,:,3*(im_k-1)+2), gabors.dst(:,:,3*(im_k-1)+3)] ... + = ical_stat( abs( gabDst{gb_i,gb_j} ) ); + + else + % otherwise keep memory footprint to a minimum + [std.ref, skw.ref, krt.ref] ... + = ical_stat( abs( gabRef{gb_i,gb_j} ) ); + [std.dst, skw.dst, krt.dst] ... + = ical_stat( abs( gabDst{gb_i,gb_j} ) ); + + mp = mp + s(gb_i) .* ( abs( std.ref - std.dst )... std + + 2.*abs( skw.ref - skw.dst )... skew + + abs( krt.ref - krt.dst ) ); % kurtosis + end + end +end + +fprintf('\n ') + +% kill the edges +mp2 = mp( BSIZE+1:end-BSIZE-1, BSIZE+1:end-BSIZE-1); + +I = norm( mp2 (:), 2 ) / sqrt( length( mp2(:) ) ) ; +% = norm of statistical diff map / ( root image size * normalization ) +end +%----------------------------------------------------- +% %----------------------------------------------------- +% function [I mp gabors] = lo_index( ref, dst ) +% % Calculate the low quality index by calculating the Gabor analysis and +% % then the local statistics, +% % Author: Eric Larson +% % Department of Electrical and Computer Engineering +% % Oklahoma State University, 2008 +% % Image Coding and analysis lab +% +% % Decompose using Gabor Analysis +% gabRef = gaborconvolve( double( ref ) ); +% gabDst = gaborconvolve( double( dst ) ); +% [M N] = size( gabRef{1,1} ); +% O = size( gabRef, 1 ) * size( gabRef, 2 ); +% s = [0.5 0.75 1 5 6]; +% mp = zeros( M, N ); +% mp_cell = cell(5*4,1); +% s = s./sum(s(:)); +% NAR = nargout; +% +% if( NAR == 3) +% % gabors.dst = zeros( M, N, 5*4*3 ); +% % gabors.ref = zeros( M, N, 5*4*3 ); +% gabors_dst1 = cell(5*4,1); +% gabors_dst2 = cell(5*4,1); +% gabors_dst3 = cell(5*4,1); +% gabors_ref1 = cell(5*4,1); +% gabors_ref2 = cell(5*4,1); +% gabors_ref3 = cell(5*4,1); +% end +% +% % im_k = 0; +% BSIZE = 16; +% % for gb_i = 1:5 +% % for gb_j = 1:4 +% % im_k = im_k + 1; +% if( NAR == 3 ) +% parfor it=1:20 +% im_k = it; +% gb_j = mod(it-1,4)+1; +% gb_i = (it - gb_j)/4 + 1; +% fprintf('%d ',im_k) +% % [gabors.ref(:,:,3*(im_k-1)+1), gabors.ref(:,:,3*(im_k-1)+2), gabors.ref(:,:,3*(im_k-1)+3)] ... +% % = ical_stat( abs( gabRef{gb_i,gb_j} ) ); +% [gabors_ref1{it} gabors_ref2{it} gabors_ref3{it}] = ical_stat( abs( gabRef{gb_i,gb_j} ) ); +% +% % [gabors.dst(:,:,3*(im_k-1)+1), gabors.dst(:,:,3*(im_k-1)+2), gabors.dst(:,:,3*(im_k-1)+3)] ... +% % = ical_stat( abs( gabDst{gb_i,gb_j} ) ); +% [gabors_dst1{it} gabors_dst2{it} gabors_dst3{it}] = ical_stat( abs( gabDst{gb_i,gb_j} ) ); +% end +% else +% parfor it=1:20 +% im_k = it; +% gb_j = mod(it-1,4)+1; +% gb_i = (it - gb_j)/4 + 1; +% fprintf('%d ',im_k) +% % otherwise keep memory footprint to a minimum +% [std_ref, skw_ref, krt_ref] ... +% = ical_stat( abs( gabRef{gb_i,gb_j} ) ); +% [std_dst, skw_dst, krt_dst] ... +% = ical_stat( abs( gabDst{gb_i,gb_j} ) ); +% +% mp_cell{it} = s(gb_i) .* ( abs( std_ref - std_dst )... std +% + 2.*abs( skw_ref - skw_dst )... skew +% + abs( krt_ref - krt_dst ) ); % kurtosis +% end +% end +% +% % Process variables after parfor! +% if( NAR == 3) +% gabors.dst = zeros( M, N, 5*4*3 ); +% gabors.ref = zeros( M, N, 5*4*3 ); +% for im_k=1:20 +% gabors.ref(:,:,3*(im_k-1)+1) = gabors_ref1{im_k}; +% gabors.ref(:,:,3*(im_k-1)+2) = gabors_ref2{im_k}; +% gabors.ref(:,:,3*(im_k-1)+3) = gabors_ref3{im_k}; +% gabors.dst(:,:,3*(im_k-1)+1) = gabors_dst1{im_k}; +% gabors.dst(:,:,3*(im_k-1)+2) = gabors_dst2{im_k}; +% gabors.dst(:,:,3*(im_k-1)+3) = gabors_dst3{im_k}; +% end +% else +% for it=1:20 +% mp = mp + mp_cell{it}; +% end +% end +% +% fprintf('\n ') +% +% % kill the edges +% mp2 = mp( BSIZE+1:end-BSIZE-1, BSIZE+1:end-BSIZE-1); +% +% I = norm( mp2 (:), 2 ) / sqrt( length( mp2(:) ) ) ; +% % = norm of statistical diff map / ( root image size * normalization ) +% end +% %----------------------------------------------------- + +%----------------------------------------------------- +function [res] = make_csf(x, y, nfreq) +[xplane,yplane]=meshgrid(-x/2+0.5:x/2-0.5, -y/2+0.5:y/2-0.5); % generate mesh +plane=(xplane+1i*yplane)/y*2*nfreq; +radfreq=abs(plane); % radial frequency + +% We modify the radial frequency according to angle. +% w is a symmetry parameter that gives approx. 3 dB down along the +% diagonals. +w=0.7; +s=(1-w)/2*cos(4*angle(plane))+(1+w)/2; +radfreq=radfreq./s; + +% Now generate the CSF +csf = 2.6*(0.0192+0.114*radfreq).*exp(-(0.114*radfreq).^1.1); +f=find( radfreq < 7.8909 ); csf(f)=0.9809+zeros(size(f)); + +res = csf; +end +%----------------------------------------------------- +% +% %----------------------------------------------------- +% function EO = gaborconvolve( im ) +% % GABORCONVOLVE - function for convolving image with log-Gabor filters +% % +% % Usage: EO = gaborconvolve(im, nscale, norient ) +% % +% % For details of log-Gabor filters see: +% % D. J. Field, "Relations Between the Statistics of Natural Images and the +% % Response Properties of Cortical Cells", Journal of The Optical Society of +% % America A, Vol 4, No. 12, December 1987. pp 2379-2394 +% % Notes on filter settings to obtain even coverage of the spectrum +% % dthetaOnSigma 1.5 +% % sigmaOnf .85 mult 1.3 +% % sigmaOnf .75 mult 1.6 (bandwidth ~1 octave) +% % sigmaOnf .65 mult 2.1 +% % sigmaOnf .55 mult 3 (bandwidth ~2 octaves) +% % +% % Author: Peter Kovesi +% % Department of Computer Science & Software Engineering +% % The University of Western Australia +% % pk@cs.uwa.edu.au www.cs.uwa.edu.au/~pk +% % +% % May 2001 +% % Altered, 2008, Eric Larson +% +% nscale = 5; %Number of wavelet scales. +% norient = 4; %Number of filter orientations. +% minWaveLength = 3; %Wavelength of smallest scale filter. +% mult = 3; %Scaling factor between successive filters. +% sigmaOnf = 0.55; %Ratio of the standard deviation of the +% %Gaussian describing the log Gabor filter's transfer function +% %in the frequency domain to the filter center frequency. +% %Orig: 3 6 12 27 64 +% wavelength = [minWaveLength ... +% minWaveLength*mult ... +% minWaveLength*mult^2 ... +% minWaveLength*mult^3 ... +% minWaveLength*mult^4 ]; +% +% dThetaOnSigma = 1.5; %Ratio of angular interval between filter orientations +% % and the standard deviation of the angular Gaussian +% % function used to construct filters in the +% % freq. plane. +% +% +% [rows cols] = size( im ); +% imagefft = fft2( im ); % Fourier transform of image +% +% EO = cell( nscale, norient ); % Pre-allocate cell array +% +% % Pre-compute to speed up filter construction +% +% x = ones(rows,1) * (-cols/2 : (cols/2 - 1))/(cols/2); +% y = (-rows/2 : (rows/2 - 1))' * ones(1,cols)/(rows/2); +% radius = sqrt(x.^2 + y.^2); % Matrix values contain *normalised* radius from centre. +% radius(round(rows/2+1),round(cols/2+1)) = 1; % Get rid of the 0 radius value in the middle +% % so that taking the log of the radius will +% % not cause trouble. +% +% % Precompute sine and cosine of the polar angle of all pixels about the +% % centre point +% +% theta = atan2(-y,x); % Matrix values contain polar angle. +% % (note -ve y is used to give +ve +% % anti-clockwise angles) +% sintheta = sin(theta); +% costheta = cos(theta); +% clear x; clear y; clear theta; % save a little memory +% +% thetaSigma = pi/norient/dThetaOnSigma; % Calculate the standard deviation of the +% % angular Gaussian function used to +% % construct filters in the freq. plane. +% % The main loop... +% for o = 1:norient, % For each orientation. +% fprintf('.'); +% angl = (o-1)*pi/norient; % Calculate filter angle. +% +% % Pre-compute filter data specific to this orientation +% % For each point in the filter matrix calculate the angular distance from the +% % specified filter orientation. To overcome the angular wrap-around problem +% % sine difference and cosine difference values are first computed and then +% % the atan2 function is used to determine angular distance. +% +% ds = sintheta * cos(angl) - costheta * sin(angl); % Difference in sine. +% dc = costheta * cos(angl) + sintheta * sin(angl); % Difference in cosine. +% dtheta = abs(atan2(ds,dc)); % Absolute angular distance. +% spread = exp((-dtheta.^2) / (2 * thetaSigma^2)); % Calculate the angular filter component. +% +% for s = 1:nscale, % For each scale. +% +% % Construct the filter - first calculate the radial filter component. +% fo = 1.0/wavelength(s); % Centre frequency of filter. +% rfo = fo/0.5; % Normalised radius from centre of frequency plane +% % corresponding to fo. +% % logGabor = exp( (-(log(radius/rfo)).^2) / (2 * log(sigmaOnf)^2) ); +% logGabor = exp( (-(log(radius/rfo)).^2) / (2 * log(sigmaOnf)^2) ); +% logGabor( round(rows/2+1), round(cols/2+1) ) = 0; % Set the value at the center of the filter +% % back to zero (undo the radius fudge). +% +% filter = fftshift( logGabor .* spread ); % Multiply by the angular spread to get the filter +% % and swap quadrants to move zero frequency +% % to the corners. +% +% % Do the convolution, back transform, and save the result in EO +% EO{s,o} = ifft2( imagefft .* filter ); +% +% +% end % ... and process the next scale +% +% end % For each orientation +% +% end +% %----------------------------------------------------- +function EO = gaborconvolve( im ) + +% GABORCONVOLVE - function for convolving image with log-Gabor filters +% +% Usage: EO = gaborconvolve(im, nscale, norient ) +% +% For details of log-Gabor filters see: +% D. J. Field, "Relations Between the Statistics of Natural Images and the +% Response Properties of Cortical Cells", Journal of The Optical Society of +% America A, Vol 4, No. 12, December 1987. pp 2379-2394 +% Notes on filter settings to obtain even coverage of the spectrum +% dthetaOnSigma 1.5 +% sigmaOnf .85 mult 1.3 +% sigmaOnf .75 mult 1.6 (bandwidth ~1 octave) +% sigmaOnf .65 mult 2.1 +% sigmaOnf .55 mult 3 (bandwidth ~2 octaves) +% +% Author: Peter Kovesi +% Department of Computer Science & Software Engineering +% The University of Western Australia +% pk@cs.uwa.edu.au www.cs.uwa.edu.au/~pk +% +% May 2001 +% Altered, 2008, Eric Larson +% Altered precomputations, 2011, Eric Larson + +nscale = 5; %Number of wavelet scales. +norient = 4; %Number of filter orientations. +minWaveLength = 3; %Wavelength of smallest scale filter. +mult = 3; %Scaling factor between successive filters. +sigmaOnf = 0.55; %Ratio of the standard deviation of the +%Gaussian describing the log Gabor filter's transfer function +%in the frequency domain to the filter center frequency. +%Orig: 3 6 12 27 64 +wavelength = [minWaveLength ... + minWaveLength*mult ... + minWaveLength*mult^2 ... + minWaveLength*mult^3 ... + minWaveLength*mult^4 ]; + +dThetaOnSigma = 1.5; %Ratio of angular interval between filter orientations +% and the standard deviation of the angular Gaussian +% function used to construct filters in the +% freq. plane. + + +[rows cols] = size( im ); +imagefft = fft2( im ); % Fourier transform of image + +EO = cell( nscale, norient ); % Pre-allocate cell array + +% Pre-compute to speed up filter construction +x = ones(rows,1) * (-cols/2 : (cols/2 - 1))/(cols/2); +y = (-rows/2 : (rows/2 - 1))' * ones(1,cols)/(rows/2); +radius = sqrt(x.^2 + y.^2); % Matrix values contain *normalised* radius from centre. +radius(round(rows/2+1),round(cols/2+1)) = 1; % Get rid of the 0 radius value in the middle +radius = log(radius); +% so that taking the log of the radius will +% not cause trouble. + +% Precompute sine and cosine of the polar angle of all pixels about the +% centre point + +theta = atan2(-y,x); % Matrix values contain polar angle. +% (note -ve y is used to give +ve +% anti-clockwise angles) +sintheta = sin(theta); +costheta = cos(theta); +clear x; clear y; clear theta; % save a little memory + +thetaSigma = pi/norient/dThetaOnSigma; % Calculate the standard deviation of the +% angular Gaussian function used to +% construct filters in the freq. plane. +rows = round(rows/2+1); +cols = round(cols/2+1); +% precompute the scaling filters +logGabors = cell(1,nscale); +for s = 1:nscale % For each scale. + + % Construct the filter - first calculate the radial filter component. + fo = 1.0/wavelength(s); % Centre frequency of filter. + rfo = fo/0.5; % Normalised radius from centre of frequency plane + % corresponding to fo. + tmp = -(2 * log(sigmaOnf)^2); + tmp2= log(rfo); + logGabors{s} = exp( (radius-tmp2).^2 /tmp ); + + logGabors{s}( rows, cols ) = 0; % Set the value at the center of the filter + % back to zero (undo the radius fudge). +end + + +% The main loop... +for o = 1:norient, % For each orientation. + fprintf('.'); + angl = (o-1)*pi/norient; % Calculate filter angle. + + % Pre-compute filter data specific to this orientation + % For each point in the filter matrix calculate the angular distance from the + % specified filter orientation. To overcome the angular wrap-around problem + % sine difference and cosine difference values are first computed and then + % the atan2 function is used to determine angular distance. + + ds = sintheta * cos(angl) - costheta * sin(angl); % Difference in sine. + dc = costheta * cos(angl) + sintheta * sin(angl); % Difference in cosine. + dtheta = abs(atan2(ds,dc)); % Absolute angular distance. + spread = exp((-dtheta.^2) / (2 * thetaSigma^2)); % Calculate the angular filter component. + + for s = 1:nscale, % For each scale. + + filter = fftshift( logGabors{s} .* spread ); % Multiply by the angular spread to get the filter + % and swap quadrants to move zero frequency + % to the corners. + + % Do the convolution, back transform, and save the result in EO + EO{s,o} = ifft2( imagefft .* filter ); + + + end % ... and process the next scale + +end % For each orientation + +end +% function [mp alpha I] = adapt_map( map, thresh ) +% +% if( ndims(map.LO) == 1 ) +% hi = map.HI; +% lo = map.LO; +% else +% hi = sum( map.HI, 3 ) ./ 3; +% lo = map.LO; +% end +% +% b1 = exp( -thresh(1)/thresh(2) ); +% b2 = 1 / ( log(10)*thresh(2) ); +% +% alpha = 1 ./ ( 1 + b1 .* (abs(hi).^b2) ); +% +% mp = hi.^(alpha) .* lo.^(1-alpha); +% +% BSIZE = 16; +% mp2 = mp( BSIZE+1:end-BSIZE-1, BSIZE+1:end-BSIZE-1); +% I = mean( mp2 (:) ) ; +% end +% +% %----------------------------------------------------- +% function s = stdmod( block ) +% +% [a b] = size( block ); +% b11 = block( 1:a/2 , 1:b/2 ); +% b12 = block( 1:a/2 , b/2+1:b ); +% b21 = block( a/2+1:a, 1:b/2 ); +% b22 = block( a/2+1:a, b/2+1:b ); +% +% s = min( [ std( b11(:) ), std( b12(:) ), ... +% std( b21(:) ), std( b22(:) )] ); +% end +% %----------------------------------------------------- \ No newline at end of file diff --git a/evaluate/evaluation_code/README.txt b/evaluate/evaluation_code/README.txt new file mode 100644 index 0000000..957b1eb --- /dev/null +++ b/evaluate/evaluation_code/README.txt @@ -0,0 +1,65 @@ +================================================================= +This README File explains how to change and call the +start_eval_image.m script to evaluate the (PSNR) scores of your +deblurred images. + +ECCV 2012, Recording and playback of camera shake: +benchmarking blind deconvolution with a real-world database +Rolf Koehler, Michael Hirsch, Betty Mohler, Bernhard Schölkopf, +Stefan Harmeling + +corresponding author: rolf.koehler[ATAT]tuebingen.mpg.de +================================================================= + + +================================================================= +HOW TO SAVE AND NAME DEBLURRED IMAGES. +----------------------------------------------------------------- + * Deblurred images should be saved in a lossless format, e.g. 'png'. + * Specify the path where you moved the evaluation scripts, + the path where the deblurred images are saved to + the name of the deblurred images and + the img format, e.g. MYPATH = '~/EvalDeblur' + DEBLPATH = '~/deblurFolder' + DEBLNAME = 'Muller' + IMGEXT = 'png' + * NOTE: The deblurred images should be named in the following way + DEBLNAME{img_No}_{Kernel_No}.IMGEXT + e.g. Muller3_8.png (for image 3, Kernel 8) + + +================================================================= +HOW TO CALL THE .m SCRIPT = HOW TO GET THE PSNR SCORE OF AN IMAGE +----------------------------------------------------------------- + * copy the downloaded 48 GroundTruth$i_$j.mat files into the folder + groundTruthMatFiles + * in start_eval_image.m specify the path where you moved the evaluation scripts, + the name of the deblurred images and the + img format, e.g. MYPATH = '~/EvalDeblur' + DEBLPATH = '~/deblurFolder' + DEBLNAME = 'Muller' + IMGEXT = 'png' + * specify the metric you want to use (for the ECCV Paper only the + 'PSNR' metric was used. For the journal version also other metrics + will be used. + * Define the image numbers which you want to evaluate + * you can also define the images which you want to exclude, in case + you do not want to compute the score for all 4 * 12 images + + +================================================================= +RESULTS +----------------------------------------------------------------- +Each deblurred image is compared with around 200 ground truth images. +So in total you get for each deblurred image around 200 scores. +start_eval_image.m returns only a struct with the best score for each +deblurred image. + + +================================================================= +QUESTIONS? +----------------------------------------------------------------- +If any questions remained, we'll try to answer them: +rolf.koehler[ATAT]tuebingen.mpg.de + + diff --git a/evaluate/evaluation_code/dftregistration.m b/evaluate/evaluation_code/dftregistration.m new file mode 100644 index 0000000..386efb7 --- /dev/null +++ b/evaluate/evaluation_code/dftregistration.m @@ -0,0 +1,212 @@ + + +function [output Greg] = dftregistration(buf1ft,buf2ft,usfac) +% function [output Greg] = dftregistration(buf1ft,buf2ft,usfac); +% Efficient subpixel image registration by crosscorrelation. This code +% gives the same precision as the FFT upsampled cross correlation in a +% small fraction of the computation time and with reduced memory +% requirements. It obtains an initial estimate of the crosscorrelation peak +% by an FFT and then refines the shift estimation by upsampling the DFT +% only in a small neighborhood of that estimate by means of a +% matrix-multiply DFT. With this procedure all the image points are used to +% compute the upsampled crosscorrelation. +% Manuel Guizar - Dec 13, 2007 + +% Portions of this code were taken from code written by Ann M. Kowalczyk +% and James R. Fienup. +% J.R. Fienup and A.M. Kowalczyk, "Phase retrieval for a complex-valued +% object by using a low-resolution image," J. Opt. Soc. Am. A 7, 450-458 +% (1990). + +% Citation for this algorithm: +% Manuel Guizar-Sicairos, Samuel T. Thurman, and James R. Fienup, +% "Efficient subpixel image registration algorithms," Opt. Lett. 33, +% 156-158 (2008). + +% Inputs +% buf1ft Fourier transform of reference image, +% DC in (1,1) [DO NOT FFTSHIFT] +% buf2ft Fourier transform of image to register, +% DC in (1,1) [DO NOT FFTSHIFT] +% usfac Upsampling factor (integer). Images will be registered to +% within 1/usfac of a pixel. For example usfac = 20 means the +% images will be registered within 1/20 of a pixel. (default = 1) + +% Outputs +% output = [error,diffphase,net_row_shift,net_col_shift] +% error Translation invariant normalized RMS error between f and g +% diffphase Global phase difference between the two images (should be +% zero if images are non-negative). +% net_row_shift net_col_shift Pixel shifts between images +% Greg (Optional) Fourier transform of registered version of buf2ft, +% the global phase difference is compensated for. + +% Default usfac to 1 +if exist('usfac')~=1, usfac=1; end + +% Compute error for no pixel shift +if usfac == 0, + CCmax = sum(sum(buf1ft.*conj(buf2ft))); + rfzero = sum(abs(buf1ft(:)).^2); + rgzero = sum(abs(buf2ft(:)).^2); + error = 1.0 - CCmax.*conj(CCmax)/(rgzero*rfzero); + error = sqrt(abs(error)); + diffphase=atan2(imag(CCmax),real(CCmax)); + output=[error,diffphase]; + +% Whole-pixel shift - Compute crosscorrelation by an IFFT and locate the +% peak +elseif usfac == 1, + [m,n]=size(buf1ft); + CC = ifft2(buf1ft.*conj(buf2ft)); + [max1,loc1] = max(CC); + [max2,loc2] = max(max1); + rloc=loc1(loc2); + cloc=loc2; + CCmax=CC(rloc,cloc); + rfzero = sum(abs(buf1ft(:)).^2)/(m*n); + rgzero = sum(abs(buf2ft(:)).^2)/(m*n); + error = 1.0 - CCmax.*conj(CCmax)/(rgzero(1,1)*rfzero(1,1)); + error = sqrt(abs(error)); + diffphase=atan2(imag(CCmax),real(CCmax)); + md2 = fix(m/2); + nd2 = fix(n/2); + if rloc > md2 + row_shift = rloc - m - 1; + else + row_shift = rloc - 1; + end + + if cloc > nd2 + col_shift = cloc - n - 1; + else + col_shift = cloc - 1; + end + output=[error,diffphase,row_shift,col_shift]; + +% Partial-pixel shift +else + + % First upsample by a factor of 2 to obtain initial estimate + % Embed Fourier data in a 2x larger array + [m,n]=size(buf1ft); + mlarge=m*2; + nlarge=n*2; + CC=zeros(mlarge,nlarge); + CC(m+1-fix(m/2):m+1+fix((m-1)/2),n+1-fix(n/2):n+1+fix((n-1)/2)) = ... + fftshift(buf1ft).*conj(fftshift(buf2ft)); + + % Compute crosscorrelation and locate the peak + CC = ifft2(ifftshift(CC)); % Calculate cross-correlation + [max1,loc1] = max(CC); + [max2,loc2] = max(max1); + rloc=loc1(loc2);cloc=loc2; + CCmax=CC(rloc,cloc); + + % Obtain shift in original pixel grid from the position of the + % crosscorrelation peak + [m,n] = size(CC); md2 = fix(m/2); nd2 = fix(n/2); + if rloc > md2 + row_shift = rloc - m - 1; + else + row_shift = rloc - 1; + end + if cloc > nd2 + col_shift = cloc - n - 1; + else + col_shift = cloc - 1; + end + row_shift=row_shift/2; + col_shift=col_shift/2; + + % If upsampling > 2, then refine estimate with matrix multiply DFT + if usfac > 2, + %%% DFT computation %%% + % Initial shift estimate in upsampled grid + row_shift = round(row_shift*usfac)/usfac; + col_shift = round(col_shift*usfac)/usfac; + dftshift = fix(ceil(usfac*1.5)/2); %% Center of output array at dftshift+1 + % Matrix multiply DFT around the current shift estimate + CC = conj(dftups(buf2ft.*conj(buf1ft),ceil(usfac*1.5),ceil(usfac*1.5),usfac,... + dftshift-row_shift*usfac,dftshift-col_shift*usfac))/(md2*nd2*usfac^2); + % Locate maximum and map back to original pixel grid + [max1,loc1] = max(CC); + [max2,loc2] = max(max1); + rloc = loc1(loc2); cloc = loc2; + CCmax = CC(rloc,cloc); + rg00 = dftups(buf1ft.*conj(buf1ft),1,1,usfac)/(md2*nd2*usfac^2); + rf00 = dftups(buf2ft.*conj(buf2ft),1,1,usfac)/(md2*nd2*usfac^2); + rloc = rloc - dftshift - 1; + cloc = cloc - dftshift - 1; + row_shift = row_shift + rloc/usfac; + col_shift = col_shift + cloc/usfac; + + % If upsampling = 2, no additional pixel shift refinement + else + rg00 = sum(sum( buf1ft.*conj(buf1ft) ))/m/n; + rf00 = sum(sum( buf2ft.*conj(buf2ft) ))/m/n; + end + error = 1.0 - CCmax.*conj(CCmax)/(rg00*rf00); + error = sqrt(abs(error)); + diffphase=atan2(imag(CCmax),real(CCmax)); + % If its only one row or column the shift along that dimension has no + % effect. We set to zero. + if md2 == 1, + row_shift = 0; + end + if nd2 == 1, + col_shift = 0; + end + output=[error,diffphase,row_shift,col_shift]; +end + +% Compute registered version of buf2ft +if (nargout > 1)&&(usfac > 0), + [nr,nc]=size(buf2ft); + Nr = ifftshift([-fix(nr/2):ceil(nr/2)-1]); + Nc = ifftshift([-fix(nc/2):ceil(nc/2)-1]); + [Nc,Nr] = meshgrid(Nc,Nr); + Greg = buf2ft.*exp(i*2*pi*(-row_shift*Nr/nr-col_shift*Nc/nc)); + Greg = Greg*exp(i*diffphase); +elseif (nargout > 1)&&(usfac == 0) + Greg = buf2ft*exp(i*diffphase); +end +return + +function out=dftups(in,nor,noc,usfac,roff,coff) +% function out=dftups(in,nor,noc,usfac,roff,coff); +% Upsampled DFT by matrix multiplies, can compute an upsampled DFT in just +% a small region. +% usfac Upsampling factor (default usfac = 1) +% [nor,noc] Number of pixels in the output upsampled DFT, in +% units of upsampled pixels (default = size(in)) +% roff, coff Row and column offsets, allow to shift the output array to +% a region of interest on the DFT (default = 0) +% Recieves DC in upper left corner, image center must be in (1,1) +% Manuel Guizar - Dec 13, 2007 +% Modified from dftus, by J.R. Fienup 7/31/06 + +% This code is intended to provide the same result as if the following +% operations were performed +% - Embed the array "in" in an array that is usfac times larger in each +% dimension. ifftshift to bring the center of the image to (1,1). +% - Take the FFT of the larger array +% - Extract an [nor, noc] region of the result. Starting with the +% [roff+1 coff+1] element. + +% It achieves this result by computing the DFT in the output array without +% the need to zeropad. Much faster and memory efficient than the +% zero-padded FFT approach if [nor noc] are much smaller than [nr*usfac nc*usfac] + +[nr,nc]=size(in); +% Set defaults +if exist('roff')~=1, roff=0; end +if exist('coff')~=1, coff=0; end +if exist('usfac')~=1, usfac=1; end +if exist('noc')~=1, noc=nc; end +if exist('nor')~=1, nor=nr; end +% Compute kernels and obtain DFT by matrix products +kernc=exp((-i*2*pi/(nc*usfac))*( ifftshift([0:nc-1]).' - floor(nc/2) )*( [0:noc-1] - coff )); +kernr=exp((-i*2*pi/(nr*usfac))*( [0:nor-1].' - roff )*( ifftshift([0:nr-1]) - floor(nr/2) )); +out=kernr*in*kernc; +return diff --git a/evaluate/evaluation_code/eval_image.m b/evaluate/evaluation_code/eval_image.m new file mode 100644 index 0000000..55b5142 --- /dev/null +++ b/evaluate/evaluation_code/eval_image.m @@ -0,0 +1,106 @@ +function scores = eval_image(deblurred,img,kernel,metric) +% BENCHMARK_EVAL_IMAGE computes various quality measures given +% a deblurred image and the corresponding ID, i.e. you have to +% provide the image and kernel number +% +% Michael Hirsch and Rolf Koehler (c) 2012 + +addpath(genpath('image_quality_algorithms')) + +% ----------------------------------------------------------------- +% Check that input images are 8bit. +% To use the image quality assessment algorithms the images have to be in 8 +% bit, with a maximum value of 255, so not normalized. +% ----------------------------------------------------------------- +if ( ~isa(deblurred, 'uint8') || size(deblurred,3)~=3 ) + error('Input image has to be a color image of type uint8!'); +end + +% load in .mat containing Ground Truth images +load(sprintf('groundTruthMatFiles/GroundTruth%d_%d.mat', ... + img,kernel)); + +% z will denote the estimated, i.e. deblurred image +z = double(deblurred); + +% Create constant image which will act as a mask +c = ones(size(deblurred)); + +% Initialize containers for quality measures + mse = []; + mssim = []; + vif = []; + ifc = []; + psnr = []; + mad = []; + +N = size(GroundTruth,4); +idGt = 1:N; + +% For whatever reason ground truth image of (1,3) is missing + if img == 1 && kernel == 3 + idGt = [1:29,31:198]; + end + +% ================================================================= +% compute the image quality measure score +% ----------------------------------------------------------------- +for j = idGt + fprintf(['Processing motive %d of 4, kernel %d of 12, image %d ' ... + 'of %d for metric %s \n'], img, kernel,j, N,metric); + + % Load ground truth image, denoted by x + x = double(GroundTruth(:,:,:,j)); + xf = fft2(mean(x,3)); + + % Scale image intensity + zs = (sum(vec(x.*z)) / sum(vec(z.*z))) .* z; + zf = fft2(mean(zs,3)); + + % Estimate shift by registering deblurred to ground truth image + [output Greg] = dftregistration(xf, zf, 1); + shift = output(3:4); + + % Apply shift + cr = imshift(double(c), shift, 'same'); + zr = imshift(double(zs), shift, 'same'); + xr = x.*cr; + + % Compute various quality measures + switch metric + case 'MSE' + mse = [mse metrix_mux(xr, zr, 'MSE')]; + case 'MSSIM' + mssim = [mssim metrix_mux(xr, zr, 'MSSIM')]; + case 'VIF' + vif = [vif metrix_mux(xr, zr, 'VIF')]; + case 'IFC' + ifc = [ifc metrix_mux(xr, zr, 'IFC')]; + case 'PSNR' + psnr = [psnr metrix_mux(xr, zr, 'PSNR')]; + case 'MAD' + MAD_temp = MAD_index(xr, zr); + mad = [mad MAD_temp.MAD]; + end +end + +% ================================================================= +% Save results +% ----------------------------------------------------------------- +switch metric + case 'MSE' + scores.MSE = mse; + case 'MSSIM' + scores.MSSIM = mssim; + case 'VIF' + scores.VIF = vif; + case 'IFC' + scores.IFC = ifc; + case 'PSNR' + scores.PSNR = psnr; + case 'MAD' + scores.MAD = mad; +end + +return + diff --git a/evaluate/evaluation_code/get_best_metric_value2.m b/evaluate/evaluation_code/get_best_metric_value2.m new file mode 100644 index 0000000..2208e41 --- /dev/null +++ b/evaluate/evaluation_code/get_best_metric_value2.m @@ -0,0 +1,18 @@ +function val = get_best_metric_value2(score,metric,img,kernel) + +switch metric + case 'MSE' + val = abs(min(score(:))); + case 'PSNR' + val = abs(max(score(:))); + case 'MSSIM' + val = abs(max(score(:))); + case 'MAD' + val = abs(min(score(:))); + case 'IFC' + val = abs(max(score(:))); + case 'VIF' + val = abs(max(score(:))); +end + +return \ No newline at end of file diff --git a/evaluate/evaluation_code/image_quality_algorithms/metrix_mux/configure_metrix_mux.m b/evaluate/evaluation_code/image_quality_algorithms/metrix_mux/configure_metrix_mux.m new file mode 100644 index 0000000..ded6c31 --- /dev/null +++ b/evaluate/evaluation_code/image_quality_algorithms/metrix_mux/configure_metrix_mux.m @@ -0,0 +1,88 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% +%%% FUNCTION: configure_metrix_mux +%%% +%%% INPUTS: NONE +%%% +%%% OUTPUTS: NONE +%%% +%%% CHANGES: Sets the Matlab path variable to include folders that execute +%%% quality metric computation routines contained in the MeTriX MuX +%%% package, and compiles any non-Matlab code used for faster +%%% computation. Specifically, the routine searches for any .m file +%%% in the 'metrix' folder starting with the prefix +%%% 'compile_metrix_' and executes it. +%%% +%%% NOTES: This routine is the universal setup command for the MeTriX MuX +%%% package. All configuration operations for the package are +%%% accomplished by calling +%%% +%%% >> configure_metrix_mux +%%% +%%% from the Matlab prompt. +%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% Author: Matthew Gaubatz +%%% Version: 1.0 +%%% Date: 01/05/2007 +%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% Copyright (c) 2007 Visual Communications Lab, Cornell University +%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% Permission to use, copy, modify, distribute and sell this software +%%% and its documentation for any purpose is hereby granted without fee, +%%% provided that the above copyright notice appear in all copies and +%%% that both that copyright notice and this permission notice appear +%%% in supporting documentation. VCL makes no representations about +%%% the suitability of this software for any purpose. +%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% DISCLAIMER: +%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% The code provided hereunder is provided as is without warranty +%%% of any kind, either express or implied, including but not limited +%%% to the implied warranties of merchantability and fitness for a +%%% particular purpose. The author(s) shall in no event be liable for +%%% any damages whatsoever including direct, indirect, incidental, +%%% consequential, loss of business profits or special damages. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function configure_metrix_mux + +%%% +%%% add MeTriX MuX routines to the Matlab path +%%% +fprintf('Setting MeTriX MuX path...'); +configure_metrix_mux_name = 'configure_metrix_mux.m'; +configure_metrix_mux_path = which( configure_metrix_mux_name ); +metrix_mux_path = configure_metrix_mux_path( 1:end-length( configure_metrix_mux_name ) ); +path( genpath(metrix_mux_path), path ); +savepath; +fprintf('[Done!]\n'); + +%%% +%%% create list of compilation routines +%%% +fprintf('Compiling list of compilations routines...'); +compile_file_list = dir('metrix/compile_metrix_*.m'); +fprintf('%i found...', length(compile_file_list)); +fprintf('[Done!]\n'); + +%%% +%%% execute compilation routines +%%% +fprintf('Executing compilation routines...\n'); +for k = 1:length(compile_file_list) + + %%% + %%% removing the '.m' from each compilation file + %%% name to retrieve the routine to be invoked + %%% + compile_command_k = compile_file_list(k).name(1:end-2); + fprintf('%i - %s\n', k, compile_command_k ); + feval( compile_command_k ); + +end +fprintf('[Done!]\n'); + +test_metrix_mux; diff --git a/evaluate/evaluation_code/image_quality_algorithms/metrix_mux/get_name_cell_metrix_mux.m b/evaluate/evaluation_code/image_quality_algorithms/metrix_mux/get_name_cell_metrix_mux.m new file mode 100644 index 0000000..944f685 --- /dev/null +++ b/evaluate/evaluation_code/image_quality_algorithms/metrix_mux/get_name_cell_metrix_mux.m @@ -0,0 +1,55 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% +%%% FUNCTION: get_name_cell_metrix_mux +%%% +%%% INPUTS: NONE +%%% +%%% OUTPUTS: A cell containg the names of all metrix indicator strings +%%% associated with metrics supported by the MeTriX MuX +%%% package. +%%% +%%% CHANGES: NONE +%%% +%%% NOTES: If support for an additional algorithm is added, an appropriate +%%% indicator string should be added using this routine. +%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% Author: Matthew Gaubatz +%%% Version: 1.1 +%%% Date: 01/05/2007 +%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% Copyright (c) 2007 Visual Communications Lab, Cornell University +%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% Permission to use, copy, modify, distribute and sell this software +%%% and its documentation for any purpose is hereby granted without fee, +%%% provided that the above copyright notice appear in all copies and +%%% that both that copyright notice and this permission notice appear +%%% in supporting documentation. VCL makes no representations about +%%% the suitability of this software for any purpose. +%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% DISCLAIMER: +%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% The code provided hereunder is provided as is without warranty +%%% of any kind, either express or implied, including but not limited +%%% to the implied warranties of merchantability and fitness for a +%%% particular purpose. The author(s) shall in no event be liable for +%%% any damages whatsoever including direct, indirect, incidental, +%%% consequential, loss of business profits or special damages. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +function metrix_name_cell = get_name_cell_metrix_mux + +metrix_name_cell{1} = 'mse'; +metrix_name_cell{2} = 'psnr'; +metrix_name_cell{3} = 'ssim'; +metrix_name_cell{4} = 'mssim'; +metrix_name_cell{5} = 'vsnr'; +metrix_name_cell{6} = 'vif'; +metrix_name_cell{7} = 'vifp'; +metrix_name_cell{8} = 'uqi'; +metrix_name_cell{9} = 'ifc'; +metrix_name_cell{10} = 'nqm'; +metrix_name_cell{11} = 'wsnr'; +metrix_name_cell{12} = 'snr'; diff --git a/evaluate/evaluation_code/image_quality_algorithms/metrix_mux/index.html b/evaluate/evaluation_code/image_quality_algorithms/metrix_mux/index.html new file mode 100644 index 0000000..731361a --- /dev/null +++ b/evaluate/evaluation_code/image_quality_algorithms/metrix_mux/index.html @@ -0,0 +1,305 @@ + + +
+ +algorithm |        | indicator string |
mean-squared-error |        | 'MSE' |
peak signal-to-noise-ratio |        | 'PSNR' |
structural similarity index |        | 'SSIM' |
multi-scale SSIM index |        | 'MSSIM' |
visual signal-to-noise ratio |        | 'VSNR' |
visual information fidelity |        | 'VIF' |
pixel-based VIF |        | 'VIFP' |
universal quality index |        | 'UQI' |
information fidelity criterion |        | 'IFC' |
noise quality measure |        | 'NQM' |
weighted signal-to-noise ratio |        | 'WSNR' |
signal-to-noise ratio |        | 'SNR' |
algorithm | website | |
mean-squared-error (MSE) |      | http://foulard.ece.cornell.edu/gaubatz/metrix_mux/MSE.html |
peak signal-to-noise ratio (PSNR) |      | [see above] |
signal-to-noise ratio (SNR) |      | [see above] |
     | ||
structural similarity (SSIM) index |      | http://www.ece.uwaterloo.ca/~z70wang/research/ssim/ |
multi-scale SSIM index |      | [see above] |
     | ||
visual signal-to-noise ratio (VSNR) |      | http://foulard.ece.cornell.edu/dmc27/vsnr/vsnr.html |
     | ||
visual information fidelity (VIF) |      | http://live.ece.utexas.edu/research/quality/ |
pixel-based VIF |      | [see above] |
information fidelity criterion (IFC) |      | [see above] |
     | ||
universal quality index (UQI) |      | http://www.cns.nyu.edu/~zwang/files/research/quality_index/demo.html |
     | ||
noise quality measure (NQM) |      | http://signal.ece.utexas.edu/software/ |
weighted signal-to-noise ratio (WSNR) |      | [see above] |
}g@S9Xf+SNFosWyYYOvoZO8S2 *=}4A& |zS=yp$?FmBHheY3tpvozG0oAiQYE>6@FM#l;iZSdFIYIvbECwx&9S
zbT)R>DFh|CDI_+J$b8SpNDsgNFzDGr{xgM~n_b8uQoZi8%hkmRtZFq^rsL(LBt%Cg
z00@km0y#IMh=HDN0VIdjRXSl&T1+aL%HRm41_PRrayj^|DztrR#Wapk0DUlxni`f=
zBv43+-V(bMi9@L|nbhngx}p@_Mh!y0`3!Y)J;p 9m#FC~~Lbe)Y?-9b~
z1vptev~s0!B4bqoZ#%k5s|s;)a9<*;ARl&=@SbILr
zI^H|q-__gA2_~DAY^K=zmyfWlDvGJXI-jfF>GeS24*
Ca;~R!NMf8a4*H<1R27G6?*}v?9n<`h8kco@AJQZd{DiX7
zoD7{HK#tIYEFIg?##NG^8LP|4M5<(Ta3F(@qev)|iRF=OKT$%kDTT+RX$slb4nVlO
z4_1x0?}53A`a_g>=F+uGrw{J~%V!@{yQ^AI%za7q$%B9#{G{_En;*!oelmbD{|<