数字图像处理(c++ opencv):彩色图像处理-彩色基础与彩色模型

news/2024/11/20 16:27:37/

彩色图像基础

颜色特性:亮度、色调、饱和度

  • (1)亮度:即强度,如灰度值

  • (2)色调:混合光波中的主导光波属性,即被观察者感知的主导色。如描述一个物体为红色,就是这个物体的色调为红色。

  • (3)饱和度:指相对的纯度,或与一种色调混合的白光量。比如深红色(红色+白色)和淡紫色(紫色+白色)是不饱和的,白色越多,越不饱和。

色度:色调+饱和度,颜色可以由亮度+色度来表征

彩色图像模型

常见的彩色图像模型有:

  • (1)RGB(红、绿、蓝):一般用于彩色显示器和彩色摄像机;

  • (2)CMY(青、深红、黄)和CMYK(青、深红、黄、黑):一般用于彩色打印;

  • (3)HSI(色调、饱和度、亮度):描述和解释颜色;

RGB和HSI之间的相互转换

从RGB到HSI

H色调分量的计算:
在这里插入图片描述
S饱和度分量计算:在这里插入图片描述
I 亮度分量计算:
在这里插入图片描述
备注:上面的转换公式假设图像的RGB值归一化到[0, 1]区间,得到的HSI结果值也在区间[0, 1]。

python">def RGB2HSI(img1):img1 = img1.astype('float32')b, g, r = img1[:, :, 0]/255.0, img1[:, :, 1]/255.0, img1[:, :, 2]/255.0I = (r+g+b)/3.0tem = np.where(b >= g, g, b)minValue = np.where(tem >= r, r, tem)S = 1 - (3 / (r + g + b)) * minValuenum1 = 2*r - g - bnum2 = 2*np.sqrt(((r - g) ** 2) + (r-b)*(g-b))deg = np.arccos(num1/num2)H = np.where(g >= b, deg, 2*np.pi - deg)resImg = np.zeros((img1.shape[0], img1.shape[1],img1.shape[2]), dtype=np.float)resImg[:, :, 0], resImg[:, :, 1], resImg[:, :, 2] = H*255, S*255, I*255resImg = resImg.astype('uint8')return resImg
从HSI到RGB(值区间与(1)相同[0, 1])

前提:在将HSI转换为RGB时,需要先通过H色调值进行判断,然后使用不同的公式:

  • 即将H值乘360°,将值从[0, 1]转换到[0, 360],然后进行分类:

  • RG扇区(H在[0, 120]):

B蓝色分量计算:
在这里插入图片描述
R红色分量计算:
在这里插入图片描述
G绿分量计算:
在这里插入图片描述

GB扇区(H在[120, 240]):

首先将H减去120:
在这里插入图片描述
然后转换到RGB:
在这里插入图片描述
BR扇区(H在[240, 360]):

首先将H减去240:
在这里插入图片描述
然后计算RGB值:
在这里插入图片描述

python">def HSI2RGB(img):H1, S1, I1 = img[:,:,0]/255.0, img[:,:,1]/255.0, img[:,:,2]/255.0B = np.zeros((H1.shape[0], H1.shape[1]), dtype='float32')G = np.zeros((S1.shape[0], S1.shape[1]), dtype='float32')R = np.zeros((I1.shape[0], I1.shape[1]), dtype='float32')H = np.zeros((H1.shape[0], H1.shape[1]), dtype='float32')for i in range(H1.shape[0]):for j in range(H1.shape[1]):H = H1[i][j]S = S1[i][j]I = I1[i][j]   if (H >=0) & (H < (np.pi * (2/3))):B[i][j] = I*(1-S)R[i][j] = I * (1 + ((S*np.cos(H))/np.cos(np.pi * (1/3) - H)))G[i][j] = 3*I - (B[i][j]+R[i][j])elif (H >= (np.pi * (2/3))) & (H < np.pi * (4/3)):R[i][j] = I*(1-S)G[i][j] = I * (1 + ((S*np.cos(H - np.pi * (2/3)))/np.cos(np.pi * (1/2) - H)))B[i][j] = 3*I - (G[i][j]+R[i][j])elif (H >= (np.pi * (2/3))) & (H < (np.pi * 2)):G[i][j] = I*(1-S)B[i][j] = I * (1 + ((S*np.cos(H - np.pi * (4/3)))/np.cos(np.pi * (10/9) - H)))R[i][j] = 3*I - (G[i][j]+B[i][j])img = cv2.merge((B*255, G*255, R*255))img = img.astype('uint8')return img

http://www.ppmy.cn/news/1548522.html

相关文章

C函数从lua中读取数据接口常用接口

读取基本数据类型的接口 lua_tonumber和lua_tointeger 用途&#xff1a;用于从Lua栈中获取数字类型的数据。lua_tonumber用于获取浮点数&#xff0c;lua_tointeger用于获取整数。示例&#xff1a;假设在Lua中调用一个C函数并传入一个数字&#xff0c;在C函数中可以这样获取这个…

多目标优化算法:多目标黑翅鸢算法(MOBKA)求解UF1-UF10,提供完整MATLAB代码

一、黑翅鸢算法介绍 黑翅鸢优化算法&#xff08;Black-winged Kite Algorithm, BKA&#xff09;是2024年提出的一种元启发式优化算法&#xff0c;其灵感来源于黑翅鸢的迁徙和捕食行为。这种算法通过模拟黑翅鸢在捕食过程中的飞行和搜索策略&#xff0c;被用来解决优化问题&…

【Java】ArrayList与LinkedList详解!!!

目录 一&#x1f31e;、List 1&#x1f345;.什么是List&#xff1f; 2&#x1f345;.List中的常用方法 二&#x1f31e;、ArrayList 1&#x1f34d;.什么是ArrayList? 2&#x1f34d;.ArrayList的实例化 3&#x1f34d;.ArrayList的使用 4&#x1f34d;.ArrayList的遍…

Gin路由深入

路由(Routing )是由一个 URI (或者叫路径)和一个特定的 HTTP 方法( GET 、 POST 等) 组成的,涉及到应用如何响应客户端对某个网站节点的访问。 1、GET POST

ssm117网络教学平台的设计与实现+vue(论文+源码)_kaic

毕业论文(设计) 题 目: 网络教学平台的设计与实现的设计与实现 院(系): 专业年级: 姓 名: 学 号: 指导教师: 2021年…

基于EEMD变换的ECG心电信号去噪和心率估计matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1EMD 基本原理 4.2 R波检测 4.3 心率检测 5.完整工程文件 1.课题概述 基于EEMD变换的ECG心电信号去噪和心率估计matlab仿真&#xff0c;并分析不同大小噪声干扰下&#xff0c;ECG信号心率的估计结果…

Amazon Linux 搭建Zookeeper+Kafka集群

Zookeeper集群搭建 Kafka集群是把状态保存在Zookeeper中的&#xff0c;首先要搭建Zookeeper集群。 Zookeeper 集群模式一共有三种类型的角色 Leader: 处理所有的事务请求&#xff08;写请求&#xff09;&#xff0c;可以处理读请求&#xff0c;集群中只能有一个Leader。 Follo…

数据结构(二)线性表

线性表&#xff0c;也称为线性结构&#xff0c;是数据结构中的一种基本类型&#xff0c;其特点是数据元素之间存在一对一的线性关系。线性表通常可以用数组&#xff08;顺序存储&#xff09;或链表&#xff08;链式存储&#xff09;来实现。线性表的特点是数据元素的排列呈现线…