From 2051b48381501025522d990cea4e7e2694e34bc0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9tro?= <yann.roberge@polymtl.ca>
Date: Fri, 28 May 2021 18:53:14 -0400
Subject: [PATCH] =?UTF-8?q?Impl=C3=A9mentation=20de=20la=20conversion=20RG?=
 =?UTF-8?q?B->HSV=20avec=20la=20m=C3=A9thode=20d=C3=A9crite=20dans=20Baile?=
 =?UTF-8?q?y=20p.187?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 main.c    | 23 ++++++++++++++---
 main.h    | 25 ++++++++++++------
 rgb2hsv.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 rgb2hsv.h | 27 +++++++++++++++++++
 4 files changed, 141 insertions(+), 11 deletions(-)

diff --git a/main.c b/main.c
index 545020f..6643c0d 100644
--- a/main.c
+++ b/main.c
@@ -10,9 +10,10 @@
 #include <stdio.h>
 #include <stdint.h>
 #include <string.h>
+#include <math.h>
 
 // Load raw image to memory. Images should be in
-int loadFrameFromDisk(const PixelRGB8* imageRGB, int index) {
+int loadFrameFromDisk(PixelRGB8* imageRGB, int index) {
     char filepath[100];
     sprintf(filepath, "%s%s%d", FRAME_IN_DIRECTORY, FRAME_IN_FILENAME, index);
     FILE* fd = fopen(filepath, "r");
@@ -48,24 +49,40 @@ int writeFrameToDisk(const PixelRGB8* imageRGB, int index) {
     return 0;
 }
 
-int correctPixelColor(const PixelRGB8* pixel, int deltaHue, int deltaSaturation, int deltaValue) {
+int correctPixelColor(PixelRGB8* pixel, int deltaHue, float deltaSaturation, int deltaValue) {
+    static PixelHSV tempHSV[1];
+
     // TODO: Implémenter
     printf("Pixel: %d %d %d\n", pixel->red, pixel->green, pixel->blue);
 
     // Convert to HSV
+    rgb2hsv(tempHSV, pixel);
+
+    // DEBUG
+    printf("PixelHSV: %d %.4f %d\n", tempHSV->hue, tempHSV->sat, tempHSV->value);
 
     // Add corrections
+    tempHSV->hue = (tempHSV->hue + deltaHue) % 384; // max hue where 64 = 60degrees
+    tempHSV->sat = tempHSV->sat + deltaSaturation > 1.0 ?
+                    1.0 : tempHSV->sat + deltaSaturation;
+    tempHSV->value = (int)tempHSV->value + deltaValue > 255 ?
+                    255 : tempHSV->value + deltaValue;
+
+    // DEBUG
+    //printf("PixelHSV: %d %.4f %d\n", tempHSV->hue, tempHSV->sat, tempHSV->value);
 
     // Convert back to RGB
+    hsv2rgb(pixel, tempHSV);
 
     return 0;
 }
 
 // Pass hue, saturation and value (lightness / 2) corrections to args
+// FIXME: Take args into account
 int main(int argc, char* argv) {
     // Start timing
     // TODO: Mesurer le nombre d'image par secondes traitées. Objectif 30fps
-    const PixelRGB8 imageRGB[IMG_AREA];
+    PixelRGB8 imageRGB[IMG_AREA];
 
     int i, j;
     for (i=0; i<N_IMAGES; i++) {
diff --git a/main.h b/main.h
index c31c66c..5ea6fad 100644
--- a/main.h
+++ b/main.h
@@ -4,12 +4,18 @@
 * Auteur: Yann Roberge
 *********************************************************/
 
+#ifndef MAIN_H
+#define MAIN_H
+
 #include <stdint.h>
 
 // Image definition
-#define N_IMAGES        100
-#define IMG_WIDTH       640
-#define IMG_HEIGHT      360
+#define N_IMAGES        1
+#define IMG_WIDTH       15
+#define IMG_HEIGHT      11
+
+//#define IMG_WIDTH       640
+//#define IMG_HEIGHT      360
 #define IMG_AREA        (IMG_WIDTH * IMG_HEIGHT)
 #define IMG_DEPTH       8 // bits
 #define IMG_N_CHANNELS  3 // RGB
@@ -21,12 +27,13 @@
 #define FRAME_IN_DIRECTORY "/run/user/1000/gvfs/sftp:host=odroid,user=nas/media/raid/frames/"
 #define FRAME_OUT_DIRECTORY "/run/user/1000/gvfs/sftp:host=odroid,user=nas/media/raid/frames_out/"
 
-#define FRAME_IN_FILENAME "frame"
-#define FRAME_OUT_FILENAME "frameout"
+//#define FRAME_IN_FILENAME "frame"
+#define FRAME_IN_FILENAME "color_test_pattern"
+#define FRAME_OUT_FILENAME "color_test_pattern_out"
 
 // Corrections to apply
 #define DELTA_HUE           50
-#define DELTA_SATURATION    50
+#define DELTA_SATURATION    0.2
 #define DELTA_VALUE         50
 
 // Pixel struct unpacked for processing
@@ -38,8 +45,10 @@ typedef struct {
 } PixelRGB8;
 
 // Functions
-int loadFrameFromDisk(const PixelRGB8* imageRGB, int index);
+int loadFrameFromDisk(PixelRGB8* imageRGB, int index);
 int writeFrameToDisk(const PixelRGB8* imageRGB, int index);
-int correctPixelColor(const PixelRGB8* pixel, int deltaHue, int deltaSaturation,
+int correctPixelColor(PixelRGB8* pixel, int deltaHue, float deltaSaturation,
                                         int deltaValue);
 
+#endif
+
diff --git a/rgb2hsv.c b/rgb2hsv.c
index b85fc78..20a9bcb 100644
--- a/rgb2hsv.c
+++ b/rgb2hsv.c
@@ -16,3 +16,80 @@
 
 // Pass hue, saturation and value (lightness / 2) corrections to args
 
+void rgb2hsv(PixelHSV* hsv, PixelRGB8* rgb) {
+    //TODO: Implémenter
+    int r = (int) rgb->red;
+    int g = (int) rgb->green;
+    int b = (int) rgb->blue;
+    int minComp, maxComp;
+
+    int tempSubtract, offset, ampl;
+
+    // Min and Max color components
+    if (r == 0 && g == 0 && b == 0) {
+        hsv->hue = 0;
+        hsv->sat = 0;
+        hsv->value = 0;
+        return;
+    }
+    else if (r >= g && r >= b) {
+        maxComp = r;
+        if (g < b) {
+            minComp = g;
+        }
+        else {
+            minComp = b;
+        }
+        tempSubtract = g - b;
+        offset = 64;
+    }
+    else if (g >= b) {
+        maxComp = g;
+        if (r >= b) {
+            minComp = b;
+        }
+        else {
+            minComp = r;
+        }
+        tempSubtract = b - r;
+        offset = 128;
+    }
+    else {
+        maxComp = b;
+        if (r >= g) {
+            minComp = g;
+        }
+        else {
+            minComp = r;
+        }
+        tempSubtract = r - g;
+        offset = 256;
+    }
+
+    //H
+    ampl = maxComp - minComp;
+    if (ampl == 0) {
+        // Grayscale color, hue doesn't matter
+        hsv->hue = 0;
+    }
+    else {
+        hsv->hue = (tempSubtract*64 / ampl) + offset;
+    }
+
+    //S
+    if (maxComp == 0) {
+        // Pitch black, saturation doesn't matter
+        hsv->sat = 0;
+    }
+    else {
+        hsv->sat = 1.0*ampl / maxComp;
+    }
+
+    //V
+    hsv->value = maxComp;
+}
+
+void hsv2rgb(PixelRGB8* rgb, PixelHSV* hsv) {
+    //TODO: Implémenter
+}
+
diff --git a/rgb2hsv.h b/rgb2hsv.h
index e69de29..4bde927 100644
--- a/rgb2hsv.h
+++ b/rgb2hsv.h
@@ -0,0 +1,27 @@
+/*********************************************************
+* Conversion d'image RGB­> HSV > RGB
+* Date: 24-Mai-2021
+* Auteur: Yann Roberge
+*********************************************************/
+
+#ifndef RGB2HSV_H
+#define RGB2HSV_H
+
+#include "main.h"
+#include <stdint.h>
+
+// Image definition
+
+// Pixel struct unpacked for processing
+typedef struct {
+    uint16_t hue;
+    float sat;
+    uint8_t value;
+} PixelHSV;
+
+// Functions
+void rgb2hsv(PixelHSV* hsv, PixelRGB8* rgb);
+void hsv2rgb(PixelRGB8* rgb, PixelHSV* hsv);
+
+#endif
+
-- 
GitLab