Add support for CIEDE2000 in rd tools
authorLuc Trudeau <luc@trud.ca>
Mon, 5 Jun 2017 20:28:04 +0000 (16:28 -0400)
committerLuc Trudeau <luc@trud.ca>
Mon, 5 Jun 2017 21:25:55 +0000 (17:25 -0400)
rd_collect now calls dump_ciede2000.py to output CIEDE2000 metrics.
bd_rate.sh, rd_average.sh and rd_plot.sh also support CIEDE2000

14 files changed:
tools/bd_rate.sh
tools/matlab/bd_rate.m
tools/rd_average.sh
tools/rd_collect.sh
tools/rd_collect_aom.sh
tools/rd_collect_bpg.sh
tools/rd_collect_daala.sh
tools/rd_collect_jpeg.sh
tools/rd_collect_libvpx.sh
tools/rd_collect_theora.sh
tools/rd_collect_webp.sh
tools/rd_collect_x264.sh
tools/rd_collect_x265.sh
tools/rd_plot.sh

index 805a271..683883f 100755 (executable)
@@ -34,6 +34,8 @@ SSIM1=$(cut -d\  -f 6 $1 | xargs | sed 's/ /,/g')
 SSIM2=$(cut -d\  -f 6 $2 | xargs | sed 's/ /,/g')
 FASTSSIM1=$(cut -d\  -f 7 $1 | xargs | sed 's/ /,/g')
 FASTSSIM2=$(cut -d\  -f 7 $2 | xargs | sed 's/ /,/g')
+CIEDE1=$(cut -d\  -f 8 $1 | xargs | sed 's/ /,/g')
+CIEDE2=$(cut -d\  -f 8 $2 | xargs | sed 's/ /,/g')
 
 PSNR_RATE=$($BJONTEGAARD 0 $N1 $AREA1 $SIZE1 $PSNR1 $N2 $AREA2 $SIZE2 $PSNR2)
 PSNR_DSNR=$($BJONTEGAARD 1 $N1 $AREA1 $SIZE1 $PSNR1 $N2 $AREA2 $SIZE2 $PSNR2)
@@ -43,9 +45,12 @@ SSIM_RATE=$($BJONTEGAARD 0 $N1 $AREA1 $SIZE1 $SSIM1 $N2 $AREA2 $SIZE2 $SSIM2)
 SSIM_DSNR=$($BJONTEGAARD 1 $N1 $AREA1 $SIZE1 $SSIM1 $N2 $AREA2 $SIZE2 $SSIM2)
 FASTSSIM_RATE=$($BJONTEGAARD 0 $N1 $AREA1 $SIZE1 $FASTSSIM1 $N2 $AREA2 $SIZE2 $FASTSSIM2)
 FASTSSIM_DSNR=$($BJONTEGAARD 1 $N1 $AREA1 $SIZE1 $FASTSSIM1 $N2 $AREA2 $SIZE2 $FASTSSIM2)
+CIEDE_RATE=$($BJONTEGAARD 0 $N1 $AREA1 $SIZE1 $CIEDE1 $N2 $AREA2 $SIZE2 $CIEDE2)
+CIEDE_DSNR=$($BJONTEGAARD 1 $N1 $AREA1 $SIZE1 $CIEDE1 $N2 $AREA2 $SIZE2 $CIEDE2)
 
 echo "           RATE (%) DSNR (dB)"
 echo "    PSNR" $(echo $PSNR_RATE     | cut -d\  -f 3) $(echo $PSNR_DSNR     | cut -d\  -f 3)
 echo " PSNRHVS" $(echo $PSNRHVS_RATE  | cut -d\  -f 3) $(echo $PSNRHVS_DSNR  | cut -d\  -f 3)
 echo "    SSIM" $(echo $SSIM_RATE     | cut -d\  -f 3) $(echo $SSIM_DSNR     | cut -d\  -f 3)
 echo "FASTSSIM" $(echo $FASTSSIM_RATE | cut -d\  -f 3) $(echo $FASTSSIM_DSNR | cut -d\  -f 3)
+echo "   CIEDE" $(echo $CIEDE_RATE    | cut -d\  -f 3) $(echo $CIEDE_DSNR    | cut -d\  -f 3)
index c5707e9..c326482 100755 (executable)
@@ -80,6 +80,7 @@ chdir(pin(1:(length(pin)-length(program_name))));
 [psnrhvs_rate,psnrhvs_dsnr]=bjontegaard([rate1,rd1(:,5)],[rate2,rd2(:,5)],t,min_bpp,max_bpp);
 [ssim_rate,ssim_dsnr]=bjontegaard([rate1,rd1(:,6)],[rate2,rd2(:,6)],t,min_bpp,max_bpp);
 [fastssim_rate,fastssim_dsnr]=bjontegaard([rate1,rd1(:,7)],[rate2,rd2(:,7)],t,min_bpp,max_bpp);
+[ciede_rate,ciede_dsnr]=bjontegaard([rate1,rd1(:,8)],[rate2,rd2(:,8)],t,min_bpp,max_bpp);
 
 if ((min_bpp != 0) || (max_bpp != Inf))
   printf("          DSNR (dB)\n");
@@ -87,10 +88,12 @@ if ((min_bpp != 0) || (max_bpp != Inf))
   printf(" PSNRHVS %0.5f\n",psnrhvs_dsnr);
   printf("    SSIM %0.5f\n",ssim_dsnr);
   printf("FASTSSIM %0.5f\n",fastssim_dsnr);
+  printf("   CIEDE %0.5f\n",ciede_dsnr);
 else 
   printf("           RATE (%%)  DSNR (dB)\n");
   printf("    PSNR %0.5f  %0.5f\n",psnr_rate,psnr_dsnr);
   printf(" PSNRHVS %0.5f  %0.5f\n",psnrhvs_rate,psnrhvs_dsnr);
   printf("    SSIM %0.5f  %0.5f\n",ssim_rate,ssim_dsnr);
   printf("FASTSSIM %0.5f  %0.5f\n",fastssim_rate,fastssim_dsnr);
+  printf("   CIEDE %0.5f  %0.5f\n",ciede_rate,ciede_dsnr);
 endif
index 94e28c9..bc8af81 100755 (executable)
@@ -16,4 +16,4 @@ if [ -e "$TOTAL" ]; then
   exit 1
 fi
 
-awk '{size[$1]+=$2;bytes[$1]+=$3;psnr[$1]+=$2*$4;psnrhvs[$1]+=$2*$5;ssim[$1]+=$2*$6;fastssim[$1]+=$2*$7;}END{for(i in size)print i,size[i],bytes[i],psnr[i]/size[i],psnrhvs[i]/size[i],ssim[i]/size[i],fastssim[i]/size[i];}' $@ | sort -n > $TOTAL
+awk '{size[$1]+=$2;bytes[$1]+=$3;psnr[$1]+=$2*$4;psnrhvs[$1]+=$2*$5;ssim[$1]+=$2*$6;fastssim[$1]+=$2*$7;ciede[$1]+=$2*$8;}END{for(i in size)print i,size[i],bytes[i],psnr[i]/size[i],psnrhvs[i]/size[i],ssim[i]/size[i],fastssim[i]/size[i],ciede[i]/size[i];}' $@ | sort -n > $TOTAL
index 544a3ec..9a5875f 100755 (executable)
@@ -334,6 +334,10 @@ if [ -z "$DUMP_FASTSSIM" ]; then
   export DUMP_FASTSSIM=$TOOLS_ROOT/tools/dump_fastssim
 fi
 
+if [ -z "$DUMP_CIEDE" ]; then
+  export DUMP_CIEDE=$(dirname $0)/dump_ciede2000.py
+fi
+
 if [ ! -x "$YUV2YUV4MPEG" ]; then
   echo "Executable not found YUV2YUV4MPEG=$YUV2YUV4MPEG"
   echo "Do you have the right TOOLS_ROOT=$TOOLS_ROOT"
index f83eb8a..8e52467 100755 (executable)
@@ -33,7 +33,8 @@ for x in $RANGE; do
   PSNRHVS=$($DUMP_PSNRHVS $FILE $BASENAME.y4m 2> /dev/null | grep Total | tr -s ' ' | cut -d\  -f $((4+$PLANE*2)))
   SSIM=$($DUMP_SSIM $FILE $BASENAME.y4m 2> /dev/null | grep Total | tr -s ' ' | cut -d\  -f $((4+$PLANE*2)))
   FASTSSIM=$($DUMP_FASTSSIM -c $FILE $BASENAME.y4m 2> /dev/null | grep Total | tr -s ' ' | cut -d\  -f $((4+$PLANE*2)))
+  CIEDE=$($DUMP_CIEDE $FILE $BASENAME.y4m 2> /dev/null | grep Total | cut -d' ' -f2-)
   rm $BASENAME.ivf $BASENAME.y4m $BASENAME-$x-enc.out $BASENAME-$x-psnr.out
-  echo $x $PIXELS $SIZE $PSNR $PSNRHVS $SSIM $FASTSSIM >> $BASENAME.out
+  echo $x $PIXELS $SIZE $PSNR $PSNRHVS $SSIM $FASTSSIM $CIEDE >> $BASENAME.out
   #tail -1 $BASENAME.out
 done
index 5ceeaf2..1272c91 100755 (executable)
@@ -26,8 +26,9 @@ for x in $(seq 1 51); do
   PSNRHVS=$($DUMP_PSNRHVS $FILE $BASENAME.y4m 2> /dev/null | grep Total | tr -s ' ' | cut -d\  -f $((4+$PLANE*2)))
   SSIM=$($DUMP_SSIM $FILE $BASENAME.y4m 2> /dev/null | grep Total | tr -s ' ' | cut -d\  -f $((4+$PLANE*2)))
   FASTSSIM=$($DUMP_FASTSSIM -c $FILE $BASENAME.y4m 2> /dev/null | grep Total | tr -s ' ' | cut -d\  -f $((4+$PLANE*2)))
+  CIEDE=$($DUMP_CIEDE $FILE $BASENAME.y4m 2> /dev/null | grep Total | cut -d' ' -f2-)
   rm $BASENAME.bpg $BASENAME-out.png $BASENAME.y4m
-  echo $x $PIXELS $SIZE $PSNR $PSNRHVS $SSIM $FASTSSIM >> $BASENAME.out
+  echo $x $PIXELS $SIZE $PSNR $PSNRHVS $SSIM $FASTSSIM $CIEDE >> $BASENAME.out
   #tail -1 $BASENAME.out
 done
 
index 23503cb..2f52007 100755 (executable)
@@ -29,7 +29,8 @@ for x in $RANGE; do
   PSNRHVS=$($DUMP_PSNRHVS $FILE $BASENAME.y4m 2> /dev/null | grep Total | tr -s ' ' | cut -d\  -f $((4+$PLANE*2)))
   SSIM=$($DUMP_SSIM $FILE $BASENAME.y4m 2> /dev/null | grep Total | tr -s ' ' | cut -d\  -f $((4+$PLANE*2)))
   FASTSSIM=$($DUMP_FASTSSIM -c $FILE $BASENAME.y4m 2> /dev/null | grep Total | tr -s ' ' | cut -d\  -f $((4+$PLANE*2)))
+  CIEDE=$($DUMP_CIEDE $FILE $BASENAME.y4m 2> /dev/null | grep Total | cut -d' ' -f2-)
   rm $BASENAME.y4m $BASENAME.ogv $BASENAME-$x-enc.out $BASENAME-psnr.out
-  echo $x $PIXELS $SIZE $PSNR $PSNRHVS $SSIM $FASTSSIM >> $BASENAME.out
+  echo $x $PIXELS $SIZE $PSNR $PSNRHVS $SSIM $FASTSSIM $CIEDE >> $BASENAME.out
   #tail -1 $BASENAME.out
 done
index e327a9a..f70ab60 100755 (executable)
@@ -26,8 +26,9 @@ for x in $(seq 100 -1 0); do
   PSNRHVS=$($DUMP_PSNRHVS $FILE $BASENAME.y4m 2> /dev/null | grep Total | tr -s ' ' | cut -d\  -f $((4+$PLANE*2)))
   SSIM=$($DUMP_SSIM $FILE $BASENAME.y4m 2> /dev/null | grep Total | tr -s ' ' | cut -d\  -f $((4+$PLANE*2)))
   FASTSSIM=$($DUMP_FASTSSIM -c $FILE $BASENAME.y4m 2> /dev/null | grep Total | tr -s ' ' | cut -d\  -f $((4+$PLANE*2)))
+  CIEDE=$($DUMP_CIEDE $FILE $BASENAME.y4m 2> /dev/null | grep Total | cut -d' ' -f2-)
   rm $BASENAME.jpeg $BASENAME.yuv $BASENAME.y4m
-  echo -$x $PIXELS $SIZE $PSNR $PSNRHVS $SSIM $FASTSSIM >> $BASENAME.out
+  echo -$x $PIXELS $SIZE $PSNR $PSNRHVS $SSIM $FASTSSIM $CIEDE >> $BASENAME.out
   #tail -1 $BASENAME.out
 done
 
index ad025d9..360e299 100755 (executable)
@@ -36,7 +36,8 @@ for x in $RANGE; do
   PSNRHVS=$($DUMP_PSNRHVS $FILE $BASENAME.y4m 2> /dev/null | grep Total | tr -s ' ' | cut -d\  -f $((4+$PLANE*2)))
   SSIM=$($DUMP_SSIM $FILE $BASENAME.y4m 2> /dev/null | grep Total | tr -s ' ' | cut -d\  -f $((4+$PLANE*2)))
   FASTSSIM=$($DUMP_FASTSSIM -c $FILE $BASENAME.y4m 2> /dev/null | grep Total | tr -s ' ' | cut -d\  -f $((4+$PLANE*2)))
+  CIEDE=$($DUMP_CIEDE $FILE $BASENAME.y4m 2> /dev/null | grep Total | cut -d' ' -f2-)
   rm $BASENAME.ivf $BASENAME.y4m $BASENAME-$x-enc.out $BASENAME-$x-psnr.out
-  echo $x $PIXELS $SIZE $PSNR $PSNRHVS $SSIM $FASTSSIM >> $BASENAME.out
+  echo $x $PIXELS $SIZE $PSNR $PSNRHVS $SSIM $FASTSSIM $CIEDE >> $BASENAME.out
   #tail -1 $BASENAME.out
 done
index b75c999..9926f71 100755 (executable)
@@ -27,7 +27,8 @@ for x in $(seq 63 -1 0); do
     PSNRHVS=$($DUMP_PSNRHVS $FILE $BASENAME.y4m 2> /dev/null | grep Total | tr -s ' ' | cut -d\  -f $((4+$PLANE*2)))
     SSIM=$($DUMP_SSIM $FILE $BASENAME.y4m 2> /dev/null | grep Total | tr -s ' ' | cut -d\  -f $((4+$PLANE*2)))
     FASTSSIM=$($DUMP_FASTSSIM -c $FILE $BASENAME.y4m 2> /dev/null | grep Total | tr -s ' ' | cut -d\  -f $((4+$PLANE*2)))
+    CIEDE=$($DUMP_CIEDE $FILE $BASENAME.y4m 2> /dev/null | grep Total | cut -d' ' -f2-)
     rm $BASENAME.ogv $BASENAME.y4m  $BASENAME-$x-enc.err $BASENAME-$x-psnr.out
-    echo -$x $PIXELS $SIZE $PSNR $PSNRHVS $SSIM $FASTSSIM >> $BASENAME.out
+    echo -$x $PIXELS $SIZE $PSNR $PSNRHVS $SSIM $FASTSSIM $CIEDE >> $BASENAME.out
     #tail -1 $BASENAME.out
 done
index f2500a1..98f267c 100755 (executable)
@@ -26,8 +26,9 @@ for x in $(seq 100 -1 0); do
   PSNRHVS=$($DUMP_PSNRHVS $FILE $BASENAME.y4m 2> /dev/null | grep Total | tr -s ' ' | cut -d\  -f $((4+$PLANE*2)))
   SSIM=$($DUMP_SSIM $FILE $BASENAME.y4m 2> /dev/null | grep Total | tr -s ' ' | cut -d\  -f $((4+$PLANE*2)))
   FASTSSIM=$($DUMP_FASTSSIM -c $FILE $BASENAME.y4m 2> /dev/null | grep Total | tr -s ' ' | cut -d\  -f $((4+$PLANE*2)))
+  CIEDE=$($DUMP_CIEDE $FILE $BASENAME.y4m 2> /dev/null | grep Total | cut -d' ' -f2-)
   rm $BASENAME.webp $BASENAME.yuv $BASENAME.y4m
-  echo -$x $PIXELS $SIZE $PSNR $PSNRHVS $SSIM $FASTSSIM >> $BASENAME.out
+  echo -$x $PIXELS $SIZE $PSNR $PSNRHVS $SSIM $FASTSSIM $CIEDE >> $BASENAME.out
   #tail -1 $BASENAME.out
 done
 
index 278de28..16f3962 100755 (executable)
@@ -29,7 +29,8 @@ for x in $RANGE; do
   PSNRHVS=$($DUMP_PSNRHVS $FILE $BASENAME.y4m 2> /dev/null | grep Total | tr -s ' ' | cut -d\  -f $((4+$PLANE*2)))
   SSIM=$($DUMP_SSIM $FILE $BASENAME.y4m 2> /dev/null | grep Total | tr -s ' ' | cut -d\  -f $((4+$PLANE*2)))
   FASTSSIM=$($DUMP_FASTSSIM -c $FILE $BASENAME.y4m 2> /dev/null | grep Total | tr -s ' ' | cut -d\  -f $((4+$PLANE*2)))
+  CIEDE=$($DUMP_CIEDE $FILE $BASENAME.y4m 2> /dev/null | grep Total | cut -d' ' -f2-)
   rm $BASENAME.x264 $BASENAME.y4m $BASENAME.yuv $BASENAME-$x-enc.out $BASENAME-$x-psnr.out
-  echo $x $PIXELS $SIZE $PSNR $PSNRHVS $SSIM $FASTSSIM >> $BASENAME.out
+  echo $x $PIXELS $SIZE $PSNR $PSNRHVS $SSIM $FASTSSIM $CIEDE >> $BASENAME.out
   #tail -1 $BASENAME.out
 done
index 0ae194a..cddbfbc 100755 (executable)
@@ -28,7 +28,8 @@ for x in $RANGE; do
   PSNRHVS=$($DUMP_PSNRHVS $FILE $BASENAME.y4m 2> /dev/null | grep Total | tr -s ' ' | cut -d\  -f $((4+$PLANE*2)))
   SSIM=$($DUMP_SSIM $FILE $BASENAME.y4m 2> /dev/null | grep Total | tr -s ' ' | cut -d\  -f $((4+$PLANE*2)))
   FASTSSIM=$($DUMP_FASTSSIM -c $FILE $BASENAME.y4m 2> /dev/null | grep Total | tr -s ' ' | cut -d\  -f $((4+$PLANE*2)))
+  CIEDE=$($DUMP_CIEDE $FILE $BASENAME.y4m 2> /dev/null | grep Total | cut -d' ' -f2-)
   rm $BASENAME.x265 $BASENAME.y4m $BASENAME-$x-enc.out $BASENAME-$x-psnr.out
-  echo $x $PIXELS $SIZE $PSNR $PSNRHVS $SSIM $FASTSSIM >> $BASENAME.out
+  echo $x $PIXELS $SIZE $PSNR $PSNRHVS $SSIM $FASTSSIM $CIEDE >> $BASENAME.out
   #tail -1 $BASENAME.out
 done
index 6ecd2db..de06524 100755 (executable)
@@ -36,6 +36,7 @@ for FILE in "$@"; do
   PSNRHVS="$PSNRHVS $PREFIX '$FILE' using (\$3*8/\$2):5 with lines title '${BASENAME%.*} (PSNR-HVS)'"
   SSIM="$SSIM $PREFIX '$FILE' using (\$3*8/\$2):6 with lines title '${BASENAME%.*} (SSIM)'"
   FASTSSIM="$FASTSSIM $PREFIX '$FILE' using (\$3*8/\$2):7 with lines title '${BASENAME%.*} (FAST SSIM)'"
+  CIEDE="$CIEDE $PREFIX '$FILE' using (\$3*8/\$2):8 with lines title '${BASENAME%.*} (CIEDE2000)'"
   PREFIX=","
 done
 
@@ -47,3 +48,5 @@ SUFFIX="ssim.png"
 $GNUPLOT -e "$CMDS set output \"$IMAGE$SUFFIX\"; plot $SSIM;"     2> /dev/null
 SUFFIX="fastssim.png"
 $GNUPLOT -e "$CMDS set output \"$IMAGE$SUFFIX\"; plot $FASTSSIM;" 2> /dev/null
+SUFFIX="ciede2000.png"
+$GNUPLOT -e "$CMDS set output \"$IMAGE$SUFFIX\"; plot $CIEDE;" 2> /dev/null