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