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

news2024/12/25 8:59:09

Lab

“Lab” 图像格式通常指的是 CIELAB 色彩空间,也称为 Lab 色彩空间。它是一种用于描述人类视觉感知的颜色的设备无关色彩空间,与常见的 RGB 和 CMYK 色彩空间不同。CIELAB 由国际照明委员会(CIE)于1976年定义,用于更准确地表示人眼对色彩的感知。
CIELAB 包括三个通道:L(亮度)、a(从绿色到红色的颜色分量)和b(从蓝色到黄色的颜色分量)。这种色彩空间的主要优势在于,它试图模拟人眼对色彩的感知方式,使得在 Lab 空间中更接近的颜色在视觉上也更相似。这使得 Lab 色彩空间在许多颜色相关的应用中很有用,如图像处理、颜色校正和颜色匹配等。
然而,需要注意的是,Lab 图像格式本身并不是一种常见的图像文件格式,如 JPEG、PNG 或 GIF。相反,Lab 色彩空间通常是用于图像处理中的中间色彩空间,以帮助进行颜色校正、色彩调整和其他颜色相关的操作。要在计算机上表示 Lab 色彩空间,通常会使用浮点数值表示 L、a 和 b 通道的值。
在这里插入图片描述

YCbCr

YCbCr 是一种用于数字图像和视频编码的颜色空间,它与 RGB 颜色空间不同。YCbCr 通常用于图像和视频压缩、传输以及数字媒体处理中,因为它具有对人眼感知不同的颜色和亮度信息分离的特性,这样可以在保持视觉质量的前提下减少数据传输量。
YCbCr 由三个分量组成:
Y(亮度):表示图像的明亮度分量。这个分量对应于人眼对图像的亮度感知。
Cb 和 Cr(色差):这两个分量表示颜色信息中的色度或色差分量。Cb 表示蓝色和亮度之间的差异,而 Cr 表示红色和亮度之间的差异。这种分离允许将色彩信息与亮度信息分开,从而在不显著影响视觉感知的情况下进行压缩。
YCbCr 被广泛用于数字媒体技术中,例如 JPEG 图像压缩、视频编码(如 MPEG 和 H.264)以及数字电视广播中。许多图像和视频格式都使用 YCbCr 色彩空间来存储数据,因为它在保留图像质量的同时可以减少存储和传输的数据量。在这些格式中,图像的颜色信息被映射到 Cb 和 Cr 通道,而亮度信息保留在 Y 通道中。
在这里插入图片描述

HSV

它基于人类视觉系统对颜色的感知方式,与 RGB 和 CMYK 色彩空间不同。HSV 代表色相(Hue)、饱和度(Saturation)和亮度(Value),它提供了一种直观的方式来描述颜色的不同方面。
以下是 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.436052025 + g * 0.385081593 + b * 0.143087414;
    Y = r * 0.222491598 + g * 0.716886060 + b * 0.060621486;
    Z = r * 0.013929122 + g * 0.097097002 + b * 0.714185470;
    // 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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/911518.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

工业生产全面感知!工业感知云来了

面向工业企业数字化转型需求&#xff0c;天翼物联基于感知云平台创新能力和5G工业物联数采能力&#xff0c;为客户提供工业感知云服务&#xff0c;包括工业泛协议接入、感知云工业超轻数采平台、工业感知数据治理、工业数据看板四大服务&#xff0c;构建工业感知神经系统新型数…

MySQL分页查询-性能优化

MySQL分页查询优化 一、背景二、原因三、原理分析 https://blog.csdn.net/hollis_chuang/article/details/130570281 一、背景 业务背景&#xff1a;给C端10万级别的用户&#xff0c;同时发送活动消息&#xff0c;活动消息分为6类。数据背景&#xff1a;mysql表有百万级别的数…

学习微服务必推荐的天花板级别微服务架构笔记

有没有一本讲微服务架构比较不错的书&#xff1f; 貌似关于架构设计的书没有人推荐&#xff1f;有没有人推荐一本&#xff0c;最好是有关架构演变的也有相关介绍 小编就在这里推荐一份Chris Richardson写的《微服务架构设计模式》&#xff0c;他本人是微服务领域的专家&#xf…

常见前端面试之VUE面试题汇总二

4. slot 是什么&#xff1f;有什么作用&#xff1f;原理是什么&#xff1f; slot 又名插槽&#xff0c;是 Vue 的内容分发机制&#xff0c;组件内部的模板引擎使用 slot 元素作为承载分发内容的出口。插槽 slot 是子组件的一个模板 标签元素&#xff0c;而这一个标签元素是否显…

【Linux】网络层协议:IP

一片赤胆平乱世&#xff0c;手中长枪定江山 文章目录 一、IP和TCP之间的关系&#xff08;提供策略 和 提供能力&#xff09;二、IP报头的理解&#xff08;再次理解面向数据报&#xff09;三、网段划分1.为什么要进行网段划分&#xff1f;&#xff08;方便定位目标主机&#xff…

21 移动测试神器:带你玩转Appium

Appium特点 Appium 作为目前主流的移动应用自动化测试框架&#xff0c;具有极强的灵活性&#xff0c;主要体现在以下 5 个方面&#xff1a; 测试用例的实现支持多种编程语言&#xff0c;比如 Java、Ruby、Python 等&#xff1b; Appium Server 支持多平台&#xff0c;既…

ChatGPT帮助提升工作效率和质量:完成时间下降40%,质量评分上升 18%

自ChatGPT去年11月发布以来&#xff0c;人们就开始使用它来协助工作&#xff0c;热心的用户利用它帮助撰写各种内容&#xff0c;从宣传材料到沟通话术再到调研报告。 两名MIT经济学研究生近日在《科学》杂志上发表的一项新研究表明&#xff0c;ChatGPT可能有助于减少员工之…

【三维重建】【深度学习】NeuS代码Pytorch实现--测试阶段代码解析(上)

【三维重建】【深度学习】NeuS代码Pytorch实现–测试阶段代码解析(上) 论文提出了一种新颖的神经表面重建方法&#xff0c;称为NeuS&#xff0c;用于从2D图像输入以高保真度重建对象和场景。在NeuS中建议将曲面表示为有符号距离函数(SDF)的零级集&#xff0c;并开发一种新的体绘…

前馈神经网络解密:深入理解人工智能的基石

目录 一、前馈神经网络概述什么是前馈神经网络前馈神经网络的工作原理应用场景及优缺点 二、前馈神经网络的基本结构输入层、隐藏层和输出层激活函数的选择与作用网络权重和偏置 三、前馈神经网络的训练方法损失函数与优化算法反向传播算法详解避免过拟合的策略 四、使用Python…

SVM详解

公式太多了&#xff0c;就用图片用笔记呈现&#xff0c;SVM虽然算法本质一目了然&#xff0c;但其中用到的数学推导还是挺多的&#xff0c;其中拉格朗日约束关于α>0这块证明我看了很长时间&#xff0c;到底是因为悟性不够。对偶问题也是&#xff0c;用了一个简单的例子才明…

超级计算机

超级计算机是一种高性能计算机&#xff0c;它能够以极高的速度执行大规模的计算任务。超级计算机通常由数千个甚至数百万个处理器组成&#xff0c;这些处理器能够同时处理大量的数据&#xff0c;从而实现高效的计算。超级计算机广泛应用于科学、工程、金融、天气预报等领域&…

shell的变量

一、什么是变量 二、变量的命名 三、查看变量的值 env显示全局变量&#xff0c;刚刚定义的root_mess是局部变量 四、变量的定义 旧版本&#xff08;7、8四个文件都加载&#xff09;和新版本&#xff08;9只加载两个etc&#xff09;不一样&#xff0c;所以su - 现在要永久生效在…

IIS缺少MIME类型配置导致404错误

最近程序准备发布到测试服务器供用户端测试&#xff0c;公司提供的测试环境竟是Windows Server 2008 R2 Enterprise IIS 7.5 由于程序引用了fontawesome字体库&#xff0c;发布后浏览发现库中引用的woff、woff2均返回404错误&#xff1a; 前期本地测试以及本地IIS 10并无出现该…

Java“牵手”拼多多产品详情接口API-产品SKU,价格,优惠券,图文介绍,拼多多API接口实现海量商品采集

拼多多是中国的一家电子商务平台&#xff0c;以团购模式为主&#xff0c;成立于2015年。拼多多的宝贝详情页是指在商品页面上展示商品信息和图片的区域&#xff0c;是用户了解和购买商品的重要窗口。下面就让我们来全面解析拼多多宝贝详情页&#xff0c;帮助你更好地了解商品信…

2023-08-21 LeetCode每日一题(移动片段得到字符串)

2023-08-21每日一题 一、题目编号 2337. 移动片段得到字符串二、题目链接 点击跳转到题目位置 三、题目描述 给你两个字符串 start 和 target &#xff0c;长度均为 n 。每个字符串 仅 由字符 ‘L’、‘R’ 和 ‘_’ 组成&#xff0c;其中&#xff1a; 字符 ‘L’ 和 ‘R…

电脑运行缓慢?4个方法,加速电脑运行!

“我电脑才用了没多久哎&#xff01;怎么突然就变得运行很缓慢了呢&#xff1f;有什么方法可以加速电脑运行速度吗&#xff1f;真的很需要&#xff0c;看看我吧&#xff01;” 电脑的运行速度快会让用户在使用电脑时感觉愉悦&#xff0c;而电脑运行缓慢可能会影响我们的工作效率…

ASP.NET实验室信息管理系统源码 LIMS成品源码

实验室信息管理系统&#xff08;Laboratory Information Management System&#xff09;简称LIMS系统&#xff0c;是指通过计算机对实验室的各种信息进行管理的计算机软、硬件系统&#xff0c;并将实验室的设备各种信息通过计算机网络连接起来&#xff0c;采用科学的管理思想和…

Python爬取斗罗大陆全集

打开网址http://www.luoxu.cc/dmplay/C888H-1-265.html F12打开Fetch/XHR&#xff0c;看到m3u8&#xff0c;ts&#xff0c;一眼顶真&#xff0c;打开index.m3u8 由第一个包含第二个index.m3u8的地址&#xff0c;ctrlf在源代码中一查index&#xff0c;果然有&#xff0c;不过/…

Hadoop集群搭建(hadoop-3.3.5)

一、修改服务器配置文件 1、配置环境变量 vim /etc/profile #java环境变量 export JAVA_HOME/usr/local/jdk/jdk8 export JRE_HOME$JAVA_HOME/jre export CLASSPATH$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH export PATH$JAVA_HOME/bin:$JRE_HOME/bin:$PATH #hadoop环境变量 …

ssm实验中心管理系统的设计与实现

ssm实验中心管理系统的设计与实现040 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 研究目的与意义&#xff1a; 随着高校硬件水平的提高和教学改革的深入&#xff0c;实验教学所占的地位越来越重要&#x…