about summary refs log tree commit diff
path: root/analyzer
diff options
context:
space:
mode:
authorgiraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8>2015-06-03 02:00:10 +0000
committergiraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8>2015-06-03 02:00:10 +0000
commitf74c5db37d344da9ec1509965f1a752ba36a1c10 (patch)
tree8c82cf44601ec96b0ff39c90ead2b8a3e97a7e7f /analyzer
parent17f4ca83489797f75a9afc1ed3f7d18f1403cf46 (diff)
downloadnetpbm-mirror-f74c5db37d344da9ec1509965f1a752ba36a1c10.tar.gz
netpbm-mirror-f74c5db37d344da9ec1509965f1a752ba36a1c10.tar.xz
netpbm-mirror-f74c5db37d344da9ec1509965f1a752ba36a1c10.zip
Add -rgb
git-svn-id: http://svn.code.sf.net/p/netpbm/code/trunk@2544 9d0c8265-081b-0410-96cb-a4ca84ce46f8
Diffstat (limited to 'analyzer')
-rw-r--r--analyzer/pnmpsnr.c161
1 files changed, 109 insertions, 52 deletions
diff --git a/analyzer/pnmpsnr.c b/analyzer/pnmpsnr.c
index 56b12685..af74e8c8 100644
--- a/analyzer/pnmpsnr.c
+++ b/analyzer/pnmpsnr.c
@@ -27,6 +27,7 @@ struct CmdlineInfo {
     */
     const char * inputFile1Name;  /* Name of first input file */
     const char * inputFile2Name;  /* Name of second input file */
+    unsigned int rgb;
 };
 
 
@@ -48,6 +49,7 @@ parseCommandLine(int argc, const char ** argv,
     MALLOCARRAY_NOFAIL(option_def, 100);
     
     option_def_index = 0;   /* incremented by OPTENT3 */
+    OPTENT3(0,   "rgb",      OPT_FLAG,  NULL, &cmdlineP->rgb,       0);
 
     opt.opt_table     = option_def;
     opt.short_allowed = FALSE; /* We have no short (old-fashioned) options */
@@ -124,7 +126,11 @@ validateInput(struct pam const pam1,
 }
 
 
-enum ColorSpaceId { COLORSPACE_YCBCR, COLORSPACE_GRAYSCALE };
+enum ColorSpaceId {
+    COLORSPACE_GRAYSCALE,
+    COLORSPACE_YCBCR,
+    COLORSPACE_RGB
+};
 
 typedef struct {
 
@@ -138,46 +144,6 @@ typedef struct {
 } ColorSpace;
 
 
-#define Y_INDEX  0
-#define CR_INDEX 1
-#define CB_INDEX 2
-
-
-
-static ColorSpace
-yCbCrColorSpace() {
-
-    ColorSpace retval;
-
-    retval.id = COLORSPACE_YCBCR;
-
-    retval.componentCt = 3;
-
-    retval.componentName[Y_INDEX]  = "Y";
-    retval.componentName[CR_INDEX] = "CR";
-    retval.componentName[CB_INDEX] = "CB";
-
-    return retval;
-}
-
-
-
-static ColorSpace
-grayscaleColorSpace() {
-
-    ColorSpace retval;
-
-    retval.id = COLORSPACE_GRAYSCALE;
-
-    retval.componentCt = 1;
-
-    retval.componentName[Y_INDEX]  = "luminance";
-
-    return retval;
-}
-
-
-
 struct SqDiff {
 /*----------------------------------------------------------------------------
    The square-differences of the components of two pixels, for some
@@ -218,6 +184,28 @@ sqDiffSum(ColorSpace    const colorSpace,
 
 
 
+#define Y_INDEX  0
+#define CB_INDEX 1
+#define CR_INDEX 2
+
+static ColorSpace
+yCbCrColorSpace() {
+
+    ColorSpace retval;
+
+    retval.id = COLORSPACE_YCBCR;
+
+    retval.componentCt = 3;
+
+    retval.componentName[Y_INDEX]  = "Y";
+    retval.componentName[CR_INDEX] = "CR";
+    retval.componentName[CB_INDEX] = "CB";
+
+    return retval;
+}
+
+
+
 static struct SqDiff
 sqDiffYCbCr(tuple    const tuple1,
             tuple    const tuple2) {
@@ -238,6 +226,64 @@ sqDiffYCbCr(tuple    const tuple1,
 
 
 
+#define R_INDEX 0
+#define G_INDEX 1
+#define B_INDEX 2
+
+
+
+static ColorSpace
+rgbColorSpace() {
+
+    ColorSpace retval;
+
+    retval.id = COLORSPACE_RGB;
+
+    retval.componentCt = 3;
+
+    retval.componentName[R_INDEX] = "Red";
+    retval.componentName[G_INDEX] = "Green";
+    retval.componentName[B_INDEX] = "Blue";
+
+    return retval;
+}
+
+
+
+static struct SqDiff
+sqDiffRgb(tuple    const tuple1,
+          tuple    const tuple2) {
+
+    struct SqDiff retval;
+
+    retval.sqDiff[R_INDEX] =
+        square((int)tuple1[PAM_RED_PLANE]  - (int)tuple2[PAM_RED_PLANE]);
+    retval.sqDiff[G_INDEX] =
+        square((int)tuple1[PAM_GRN_PLANE]  - (int)tuple2[PAM_GRN_PLANE]);
+    retval.sqDiff[B_INDEX] =
+        square((int)tuple1[PAM_BLU_PLANE]  - (int)tuple2[PAM_BLU_PLANE]);
+
+    return retval;
+}
+
+
+
+static ColorSpace
+grayscaleColorSpace() {
+
+    ColorSpace retval;
+
+    retval.id = COLORSPACE_GRAYSCALE;
+
+    retval.componentCt = 1;
+
+    retval.componentName[Y_INDEX]  = "luminance";
+
+    return retval;
+}
+
+
+
 static struct SqDiff
 sqDiffGrayscale(tuple    const tuple1,
                 tuple    const tuple2) {
@@ -277,11 +323,14 @@ sumSqDiffFromRaster(struct pam * const pam1P,
             struct SqDiff sqDiff;
 
             switch (colorSpace.id) {
+            case COLORSPACE_GRAYSCALE:
+                sqDiff = sqDiffGrayscale(tuplerow1[col], tuplerow2[col]);
+                break;
             case COLORSPACE_YCBCR:
                 sqDiff = sqDiffYCbCr(tuplerow1[col], tuplerow2[col]);
                 break;
-            case COLORSPACE_GRAYSCALE:
-                sqDiff = sqDiffGrayscale(tuplerow1[col], tuplerow2[col]);
+            case COLORSPACE_RGB:
+                sqDiff = sqDiffRgb(tuplerow1[col], tuplerow2[col]);
                 break;
             }
             sumSqDiff = sqDiffSum(colorSpace, sumSqDiff, sqDiff);
@@ -325,12 +374,18 @@ reportPsnr(struct pam    const pam,
     pm_message("PSNR between '%s' and '%s':", fileName1, fileName2);
 
     for (i = 0; i < colorSpace.componentCt; ++i) {
+        const char * label;
+
+        pm_asprintf(&label, "%s:", colorSpace.componentName[i]);
+
         if (sumSqDiff.sqDiff[i] > 0)
-            pm_message("  %s: %.2f dB",
-                       colorSpace.componentName[i],
+            pm_message("  %-6.6s %.2f dB",
+                       label,
                        10 * log10(maxSumSqDiff/sumSqDiff.sqDiff[i]));
         else
-            pm_message("  %s: no difference", colorSpace.componentName[i]);
+            pm_message("  %-6.6s no difference", label);
+
+        pm_strfree(label);
     }
 }
 
@@ -338,8 +393,6 @@ reportPsnr(struct pam    const pam,
 
 int
 main (int argc, const char **argv) {
-    const char * fileName1;  /* name of first file to compare */
-    const char * fileName2;  /* name of second file to compare */
     FILE * if1P;
     FILE * if2P;
     struct pam pam1, pam2;
@@ -359,16 +412,20 @@ main (int argc, const char **argv) {
 
     validateInput(pam1, pam2);
 
-    if (streq(pam1.tuple_type, PAM_PPM_TUPLETYPE)) 
-        colorSpace = yCbCrColorSpace();
-    else
+    if (streq(pam1.tuple_type, PAM_PPM_TUPLETYPE)) {
+        if (cmdline.rgb)
+            colorSpace = rgbColorSpace();
+        else
+            colorSpace = yCbCrColorSpace();
+    } else
         colorSpace = grayscaleColorSpace();
 
     {
         struct SqDiff const sumSqDiff =
             sumSqDiffFromRaster(&pam1, &pam2, colorSpace);
 
-        reportPsnr(pam1, sumSqDiff, colorSpace, fileName1, fileName2);
+        reportPsnr(pam1, sumSqDiff, colorSpace,
+                   cmdline.inputFile1Name, cmdline.inputFile2Name);
     }
     pm_close(if2P);
     pm_close(if1P);