【数字图像处理】颜色空间的转换

颜色空间的转换

在这里插入图片描述

CMY 空间
CMY 颜色空间正好与 RGB 颜色空间互补, 即用白色减去 RGB 颜色空间中的某一颜色值就等于这种颜色在 CMY 颜色空间中的值。

{ C = 1 − R M = 1 − G Y = 1 − B \begin{cases}C=1-R\\M=1-G\\Y=1-B\end{cases} C=1RM=1GY=1B

HSV 空间
HSI/ HSV 颜色空间模型是从人的视觉系统出发, 用 H (Hue)、 S(Saturation)、 I(Intensity) 或 V(Value) 分别代表色调、 色饱和度、 亮度三种独立的颜色特征。
对于[0,1]的 R、G、B 值,HSV 各个分量计算如下

V = R + G + B 3 V=\frac{R+G+B}{3} V=3R+G+B

S = 1 − 3 R + G + B min ⁡ ( R , G , B ) S=1-\frac{3}{R+G+B}\min(R,G,B) S=1R+G+B3min(R,G,B)

H = { θ , B ≤ G 36 0 ∘ − θ , B > G H=\begin{cases}\theta,&B\le G\\360^\circ-\theta,&B>G\end{cases} H={θ,360θ,BGB>G
其中
θ = arccos ⁡ { ( R − G ) + ( R − B ) 2 [ ( R − G ) 2 + ( R − B ) ( G − B ) ] 1 2 } \theta=\arccos\left\{\frac{(R-G)+(R-B)}{2\Big[(R-G)^2+(R-B)(G-B)\Big]^{\frac{1}{2}}}\right\} θ=arccos 2[(RG)2+(RB)(GB)]21(RG)+(RB)

YCbCr 空间
YCbCr 颜色空间采用一个亮度信号 (Y) 和两个色差信号 (Cb , Cr ) 来表示。
对于[0,1]的 R、G、B,Y、Cr、Cb 计算如下:

[ Y C r C b ] = [ 0.2990 0.5870 0.1140 0.5000 − 0.4187 − 0.0813 − 0.1687 − 0.3313 0.5000 ] [ R G B ] + [ 6 128 128 ] \begin{bmatrix}Y\\C_\mathrm{r}\\C_\mathrm{b}\end{bmatrix}=\begin{bmatrix}0.2990&0.5870&0.1140\\0.5000&-0.4187&-0.0813\\-0.1687&-0.3313&0.5000\end{bmatrix}\begin{bmatrix}R\\G\\B\end{bmatrix}+\begin{bmatrix}6\\128\\128\end{bmatrix} YCrCb = 0.29900.50000.16870.58700.41870.33130.11400.08130.5000 RGB + 6128128


import cv2
import numpy as np
import matplotlib.pyplot as plt


def read_show_image(img, flag=0):
    img = np.squeeze(img)
    if np.ndim(img) == 2:
        plt.imshow(img, 'gray'), plt.title('灰度图'), plt.xticks([]), plt.yticks([])
        plt.show()
    elif np.ndim(img) == 3:
        R = img[..., 0]
        G = img[..., 1]
        B = img[..., 2]
        if flag == 1:
            plt.subplot(221), plt.imshow(img, 'gray'), plt.title('彩色图'), plt.xticks([]), plt.yticks([])
            plt.subplot(222), plt.imshow(R, 'gray'), plt.title('通道1'), plt.xticks([]), plt.yticks([])
            plt.subplot(223), plt.imshow(G, 'gray'), plt.title('通道2'), plt.xticks([]), plt.yticks([])
            plt.subplot(224), plt.imshow(B, 'gray'), plt.title('通道3'), plt.xticks([]), plt.yticks([])
            plt.show()
        else:
            zeros = np.zeros(img.shape[:2], dtype='uint8')
            plt.subplot(221), plt.imshow(img), plt.title('彩色图'), plt.xticks([]), plt.yticks([])
            plt.subplot(222), plt.imshow(cv2.merge([R, zeros, zeros])), plt.title('通道1'), plt.xticks([]), plt.yticks([])
            plt.subplot(223), plt.imshow(cv2.merge([zeros, G, zeros])), plt.title('通道2'), plt.xticks([]), plt.yticks([])
            plt.subplot(224), plt.imshow(cv2.merge([zeros, zeros, B])), plt.title('通道3'), plt.xticks([]), plt.yticks([])
            plt.show()
    else:
        print('Input error')



def RGB2CMY(img):
    '''青 (Cyan)、 品红(Magenta) 和黄 (Yellow)'''
    r, g, b = cv2.split(img)  # split the channels
    # normalization [0,1]
    r = r / 255.0
    g = g / 255.0
    b = b / 255.0
    c = 1 - r
    m = 1 - g
    y = 1 - b
    result = cv2.merge((c, m, y))* 255  # merge the channels
    return np.array(result).astype(np.uint8)


def RGB2HSV(rgb_Img):
    ''' 用 H(Hue)、 S(Saturation)、 I(Intensity) 或 V(Value) 分别代表色调、 色饱和度、 亮度'''
    img_rows = int(rgb_Img.shape[0])
    img_cols = int(rgb_Img.shape[1])
    b, g, r = cv2.split(rgb_Img)
    # normalization[0,1]
    r = r / 255.0
    g = g / 255.0
    b = b / 255.0
    hsv_Img = rgb_Img.copy()
    for i in range(img_rows):
        for j in range(img_cols):
            num = 0.5 * ((r[i, j] - g[i, j]) + (r[i, j] - b[i, j]))
            den = np.sqrt((r[i, j] - g[i, j]) ** 2 + (r[i, j] - b[i, j]) * (g[i, j] - b[i, j]))
            theta = float(np.arccos(num / den))
            if den == 0:
                H = 0
            elif b[i, j] <= g[i, j]:
                H = theta
            else:
                H = np.pi - theta

            min_RGB = min(min(b[i, j], g[i, j]), r[i, j])
            sum = b[i, j] + g[i, j] + r[i, j]
            if sum == 0:
                S = 0
            else:
                S = 1 - 3 * min_RGB / sum
            H = H / (np.pi)
            V = sum / 3.0
            # 输出HSI图像,扩充到255以方便显示,一般H分量在[0,2pi]之间,S和I在[0,1]之间
            hsv_Img[i, j, 0] = H * 255
            hsv_Img[i, j, 1] = S * 255
            hsv_Img[i, j, 2] = V * 255
    return hsv_Img


def RGB2YCbCr(rgb_image):
    """Y:亮度 Cb:色差 Cr:色差"""
    if len(rgb_image.shape) != 3 or rgb_image.shape[2] != 3:
        raise ValueError("input image is not a rgb image")
    rgb_image = rgb_image.astype(np.float32)
    transform_matrix = np.array([[0.299, 0.587, 0.114],
                                 [0.5, 0.4187, -0.0813],
                                 [-0.1687, -0.3313, 0.5]])
    shift_matrix = np.array([16, 128, 128])
    ycbcr_image = np.zeros(shape=rgb_image.shape)
    w, h, _ = rgb_image.shape
    for i in range(w):
        for j in range(h):
            ycbcr_image[i, j, :] = np.dot(transform_matrix, rgb_image[i, j, :]) + shift_matrix
    return np.array(ycbcr_image).astype(np.uint8)


if __name__ == '__main__':
    lena = cv2.imread('lena_std.bmp')
    lena = np.array(lena)[..., ::-1]
    cmy = RGB2CMY(lena)
    hsv = RGB2HSV(lena)
    ycbcr = RGB2YCbCr(lena)
    
    plt.figure('RGB')
    read_show_image(lena)
    
    plt.figure('cmy')
    read_show_image(cmy)
    
    plt.figure('hsv')
    read_show_image(hsv,flag=1)
    
    plt.figure('ycbcr')
    read_show_image(ycbcr,flag=1)

参考:
https://cloud.tencent.com/developer/article/1784017

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

非关系型数据库(缓存数据库)redis的基础认知与安装

目录 一.关系型数据库和非关系型数据库 关系型数据库 非关系型数据库 关系数据库与非关系型数据库的区别 ①非关系数据 关系型数据库 非关系型数据库产生背景 数据存储流向 非关系型数据库 关系数据库 二.redis的简介 1.概念 2.Redis 具有以下几个优点: 3.Redi…

数据结构二叉树顺序存储——堆

堆 1.堆的概念2.堆的实现 &#xff08;建小堆为例&#xff09;2.1 初始化和销毁2.2 判空2.3 获得堆顶元素和堆的大小2.4 插入2.5 删除 3.堆的构建&#xff08;建小堆为例&#xff09; 1.堆的概念 将若干数据或元素按照完全二叉树的存储方式顺序存储到一个一维数组中&#xff0…

LiDAR和Camera融合的BEV感知算法-BEVFusion

0. 简述 本次给大家讲解一篇非常经典的融合工作叫 BEVFusion&#xff0c;我们依旧从算法动机&开创性思路、主体结构、损失函数以及性能对比四个方面展开 BEVFusion 有两篇文章&#xff0c;本次主要讲解的是阿里和北大的&#xff1a;BEVFusion: A Simple and Robust LiDAR-…

Node | Node.js 版本升级

目录 Step1&#xff1a;下载 Step2&#xff1a;安装 Step3&#xff1a;换源 发现其他博客说的 n 模块不太行&#xff0c;所以老老实实地手动安装 Step1&#xff1a;下载 Node 中文官网&#xff1a;https://nodejs.cn/download 点击后&#xff0c;将会下载得到一个 .msi 文件…

打断点调试代码的思路(找bug的思路)二分法

现象&#xff1a; 当断点运行到此处&#xff0c;卡死 二分法&#xff1a; 用断点把程序切段&#xff0c;前一段&#xff0c;后一段 **前一段&#xff1a;检查变量值&#xff0c;如无问题&#xff0c;则说明没有任何问题 问题必然出在后一段 后一段&#xff1a;人为检查&…

了解游戏相关知识

个人笔记&#xff08;整理不易&#xff0c;有帮助点个赞&#xff09; 笔记目录&#xff1a;学习笔记目录_pytest和unittest、airtest_weixin_42717928的博客-CSDN博客 个人随笔&#xff1a;工作总结随笔_8、以前工作中都接触过哪些类型的测试文档-CSDN博客 目录 一&#xff1a…

鸿蒙TypeScript学习第7天:【TypeScript 循环】

1、TypeScript 循环 有的时候&#xff0c;我们可能需要多次执行同一块代码。一般情况下&#xff0c;语句是按顺序执行的&#xff1a;函数中的第一个语句先执行&#xff0c;接着是第二个语句&#xff0c;依此类推。 编程语言提供了更为复杂执行路径的多种控制结构。 循环语句…

Polardb代理介绍

代理位于数据库和应用程序之间的网络代理服务&#xff0c;转发客户端的请求到DB&#xff0c;收到DB回包在转发到客户端&#xff0c;提供多种能力&#xff0c;支持&#xff1a;读写分离、负载均衡、一致性级别、连接池、过载保护功能。对外提供地址&#xff1a;主地址和集群地址…

Halcon3D倾斜平面矫正至水平面

前言 在相当多的3d检测中&#xff0c;由于各种因素的干扰&#xff0c;我们所检测的平面通常并不是一个水平面&#xff0c;或者被检测的面不是水平面的情况。尤其是在倾斜面的缺陷检测和平面度检测中&#xff0c;使用被测面与拟合基准面进行计算很难做到准确的定位到缺陷的情况…

全数字化病理,“根深”才能“叶茂”

现代医学之父William Osler曾言&#xff1a;病理学乃医学之本。 作为研究人体疾病发生的原因、发病机制、病理变化以及疾病过程中机体的形态结构、功能代谢变化和病变转归的一门基础医学科学&#xff0c;病理学一直被视为基础医学与临床医学之间的“桥梁学科”&#xff0c;在医…

分类预测 | Matlab实现TCN-BiGRU-Mutilhead-Attention时间卷积双向门控循环单元多头注意力机制多特征分类预测/故障识别

分类预测 | Matlab实现TCN-BiGRU-Mutilhead-Attention时间卷积双向门控循环单元多头注意力机制多特征分类预测/故障识别 目录 分类预测 | Matlab实现TCN-BiGRU-Mutilhead-Attention时间卷积双向门控循环单元多头注意力机制多特征分类预测/故障识别分类效果基本介绍模型描述程序…

Linux文件与进程交互的窥探者lsof

lsof 是一个 Linux 和 UNIX 系统中的实用工具&#xff0c;用于列出系统中打开文件的所有信息。这个名字代表 “List Open Files”&#xff0c;但它也可以显示进程相关的其他信息&#xff0c;如&#xff1a; 打开的文件描述符列表 打开网络连接的列表 被进程使用的信号和内核对…

HarmonyOS实战开发-为应用添加运行时权限

介绍 通过AbilityAccessCtrl动态向用户申请“允许不同设备间的数据交换”的权限&#xff0c;使用设备管理实例获取周边不可信设备列表。 说明&#xff1a; 查询周边不可信设备之前&#xff0c;请确保本设备与周边设备未进行配对。如果已配对&#xff0c;则恢复出厂设置之后重新…

Python中的全栈开发前端与后端的完美融合【第160篇—全栈开发】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Python中的全栈开发&#xff1a;前端与后端的完美融合 全栈开发已成为当今软件开发领域中的…

Linux权限提升总结

几个信息收集的项目推荐 运行这几个项目就会在目标主机上收集一些敏感信息供我们参考和使用 一个综合探针&#xff1a;traitor 一个自动化提权&#xff1a;BeRoot(gtfo3bins&lolbas) 使用python2运行beroot.py就可以运行程序&#xff0c;然后就可以收集到系统中的大量信…

景顺长城:《重塑与创造——2024 ai+洞察报告》

近期&#xff0c;景顺长城发布了《重塑与创造——2024 ai洞察报告》,报告深入探讨了人工智能&#xff08;AI&#xff09;产业的发展现状、未来趋势以及对各行业的潜在影响。报告认为&#xff0c;AI产业发展是多层次、多浪潮的&#xff0c;目前我们处于第二阶段但未来将持续伴随…

企业案例:金蝶云星空集成钉钉,帆软BI

正文&#xff1a;在数字化转型的大潮中&#xff0c;众多企业开始探索并实践高效的数据流转与集成&#xff0c;以提升内部管理效率和决策质量。本文将以某企业为例&#xff0c;详细介绍如何通过将钉钉审批流程的数据实时同步至金蝶云星空&#xff0c;并进一步在帆软报表平台上实…

缺省参数

缺省参数 缺省参数概念 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时&#xff0c;如果没有指定实 参则采用该形参的缺省值&#xff0c;否则使用指定的实参。 void Func(int a 0) {cout<<a<<endl; } int main() {Func(); // 没有传…

力扣刷题Days31-2.两数相关(js)

1&#xff0c;题目 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;…

基于ssm的企业销售人员培训系统(java项目+文档+源码)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的企业销售人员培训系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 企业销售人员培训系统主要…