数字图像处理—— Lab、YCbCr、HSV、RGB之间互转

数字图像处理—— Lab、YCbCr、HSV、RGB之间互转本文介绍了 CIELAB 色彩空间 它模拟人眼对颜色的感知 YCbCr 色彩空间在图像压缩中的应用 以及 HSV 色彩模型 其直观表示颜色的色相 饱和度和亮度

大家好,欢迎来到IT知识分享网。

Lab

YCbCr

HSV

  1. 色相(Hue):色相表示颜色的基本属性,即我们常说的颜色名称,如红色、绿色、蓝色等。色相的取值范围通常为 0 到 360
    度,将整个颜色环划分为不同的颜色。
  2. 饱和度(Saturation):饱和度表示颜色的纯度或鲜艳程度。饱和度较低的颜色会更加灰暗或淡化,而高饱和度的颜色更加鲜艳。饱和度的取值范围通常为0%(灰色)到 100%(完全饱和)。
  3. 亮度(Value):亮度表示颜色的明暗程度。较高的亮度值表示颜色较亮,而较低的值表示颜色较暗。亮度的取值范围通常为 0%(黑色)到100%(白色)。
    HSV 色彩空间通常在图像处理和计算机图形学中使用,因为它提供了更直观的控制颜色外观的方式。与 RGB 色彩空间相比,HSV 更适合用于调整颜色的饱和度和明暗程度,而不必考虑颜色之间的复杂交互影响。
    在这里插入图片描述

代码

首先先定义这些颜色空间的数据结构,为了方便读写图像,这里使用OpenCV来读入图像,读入之后把BGR转成RGB。

#pragma once #include <iostream> #include <algorithm> #include <opencv2/opencv.hpp> struct Lab { 
    float L; float a; float b; }; struct YCbCr { 
    float Y; float Cb; float Cr; }; struct HSV { 
    int h; double s; double v; }; struct BGR { 
    float b; float g; float r; }; 

实现代码

void BGR_YCbCr(BGR &bgr, YCbCr& y) { 
    y.Y = 0.257 * bgr.r + 0.564 * bgr.g + 0.098 * bgr.b + 16; y.Cb = -0.148 * bgr.r - 0.291 * bgr.g + 0.439 * bgr.b + 128; y.Cr = 0.439 * bgr.r - 0.368 * bgr.g - 0.071 * bgr.b + 128; } void BGR_Lab(BGR &bgr, Lab& lab) { 
    double X, Y, Z; double Fx = 0, Fy = 0, Fz = 0; double b = bgr.b / 255.00; double g = bgr.g / 255.00; double r = bgr.r / 255.00; // gamma 2.2 if (r > 0.04045) r = pow((r + 0.055) / 1.055, 2.4); else r = r / 12.92; if (g > 0.04045) g = pow((g + 0.055) / 1.055, 2.4); else g = g / 12.92; if (b > 0.04045) b = pow((b + 0.055) / 1.055, 2.4); else b = b / 12.92; // sRGB X = r * 0. + g * 0. + b * 0.; Y = r * 0. + g * 0. + b * 0.0; Z = r * 0.0 + g * 0.0 + b * 0.; // XYZ range: 0~100 X = X * 100.000; Y = Y * 100.000; Z = Z * 100.000; // Reference White Point //2度视场 D50光源三刺激值 double ref_X = 96.4221; double ref_Y = 100.000; double ref_Z = 82.5211; X = X / ref_X; Y = Y / ref_Y; Z = Z / ref_Z; // Lab if (X > 0.008856) Fx = pow(X, 1 / 3.000); else Fx = (7.787 * X) + (16 / 116.000); if (Z > 0.008856) Fz = pow(Z, 1 / 3.000); else Fz = (7.787 * Z) + (16 / 116.000); if (Y > 0.008856) { 
    Fy = pow(Y, 1 / 3.000); lab.L = (116.000 * Fy) - 16.0 + 0.5; } else { 
    Fy = (7.787 * Y) + (16 / 116.000); lab.L = 903.3 * Y; } lab.a = 500.000 * (Fx - Fy) + 0.5; lab.b = 200.000 * (Fy - Fz) + 0.5; } bool IsEquals(double val1, double val2) { 
    return fabs(val1 - val2) < 0.001; } void BGR_HSV(BGR& bgr, HSV& hsv) { 
    double b, g, r; double h, s, v; double min, max; double delta; b = bgr.b / 255.0; g = bgr.g / 255.0; r = bgr.r / 255.0; if (r > g) { 
    max = std::max(r, b); min = std::min(g, b); } else { 
    max = std::max(g, b); min = std::min(r, b); } v = max; delta = max - min; if (IsEquals(max, 0)) s = 0.0; else s = delta / max; if (max == min) h = 0.0; else { 
    if (IsEquals(r, max) && g >= b) { 
    h = 60 * (g - b) / delta + 0; } else if (IsEquals(r, max) && g < b) { 
    h = 60 * (g - b) / delta + 360; } else if (IsEquals(g, max)) { 
    h = 60 * (b - r) / delta + 120; } else if (IsEquals(b, max)) { 
    h = 60 * (r - g) / delta + 240; } } hsv.h = (int)(h + 0.5); hsv.h = (hsv.h > 359) ? (hsv.h - 360) : hsv.h; hsv.h = (hsv.h < 0) ? (hsv.h + 360) : hsv.h; hsv.s = s; hsv.v = v; } BGR BGR_value(cv::Mat& cv_src) { 
    cv::Scalar s = cv::mean(cv_src); BGR bgr; bgr.b = s[0]; bgr.g = s[1]; bgr.r = s[2]; return bgr; } 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/118420.html

(0)
上一篇 2025-11-13 10:45
下一篇 2025-11-13 11:10

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信