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

颜色空间的转换

在这里插入图片描述

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 pltdef 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.0g = g / 255.0b = b / 255.0c = 1 - rm = 1 - gy = 1 - bresult = cv2.merge((c, m, y))* 255  # merge the channelsreturn 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.0g = g / 255.0b = b / 255.0hsv_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 = 0elif b[i, j] <= g[i, j]:H = thetaelse:H = np.pi - thetamin_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 = 0else:S = 1 - 3 * min_RGB / sumH = H / (np.pi)V = sum / 3.0# 输出HSI图像,扩充到255以方便显示,一般H分量在[0,2pi]之间,S和I在[0,1]之间hsv_Img[i, j, 0] = H * 255hsv_Img[i, j, 1] = S * 255hsv_Img[i, j, 2] = V * 255return hsv_Imgdef 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.shapefor i in range(w):for j in range(h):ycbcr_image[i, j, :] = np.dot(transform_matrix, rgb_image[i, j, :]) + shift_matrixreturn 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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go项目结构整洁实现|GitHub 3.5k

一、前言 hi&#xff0c;大家好&#xff0c;这里是白泽。今天给大家分享一个GitHub &#x1f31f; 3.5k 的 Go项目&#xff1a;go-backend-clean-arch https://github.com/amitshekhariitbhu/go-backend-clean-architecture 这个项目是一位老外写的&#xff0c;通过一个 HTT…

读书笔记之人生算法(5)

算法十八关7-9 跨越出身和运气&#xff0c;实现富足与自由&#xff0c;用概率思维做好决策 7非理性 非理性&#xff1a;如何管住你的动物精神什么是理性&#xff1f;理性就是非条件反射。本杰明富兰克林曾说过如何有效说服别人&#xff1a;要诉诸利益&#xff0c;而非诉诸理性…

leetcode721. 合并账户【两种方法;并查集;dfs】

文章目录 并查集&#xff08;方法一&#xff09;dfs&#xff08;方法二&#xff09;dfs换一种写法 并查集&#xff08;方法一&#xff09; class Solution {unordered_map<string, int> index; // 每个邮箱都有一个唯一编号int root[10010]; // 并查集…

穿什么有这么重要?--装饰模式

1.1 穿什么有这么重要&#xff1f; 约会穿什么&#xff1f; "那要看你想给人家什么印象&#xff1f;是比较年轻&#xff0c;还是比较干练&#xff1b;是比较颓废&#xff0c;还是要比较阳光&#xff1b;也有可能你想给人家一种极其难忘的印象&#xff0c;那穿法又大不一样…

Vue3_2024_7天【回顾上篇watch常见的后两种场景】完

随笔&#xff1a;这年头工作不好找咯&#xff0c;大家有学历提升的赶快了&#xff0c;还有外出人多注意身体&#xff0c;没错我在深圳这边阳了&#xff0c;真的绝啊&#xff0c;最尴尬的还给朋友传染了&#xff01;&#xff01;&#xff01; 之前三种的监听情况&#xff0c;监听…

【高校科研动态】贵州师大博士生封清为一作在J. Clean. Prod.发文:中国扶贫搬迁对生态影响的量化研究——以贵州省为例

目录 1.文章简介 2.主要研究内容 3.文章引用 1.文章简介 论文名称&#xff1a;Quantifying the extent of ecological impact from Chinas poverty alleviation relocation program: A case study in Guizhou Province 第一作者及通讯作者&#xff1a;封清&#…

一文教你如何使用sngrep跟踪分析sip信令

sngrep是一个用于分析SIP信令的工具&#xff0c;它可以捕获和解码SIP信令也是一款专业的sip抓包工具&#xff0c;且可以解析tcpdump抓出来的包。 sip协议&#xff08;会话初始协议&#xff09;&#xff0c;是一种多媒体通信协议&#xff1b; sip协议的消息主体&#xff08;报文…

联系媒体要有方法莫让投稿发文章只剩一声长叹相见恨晚

曾有一位饱经世事的前辈以一句至理名言警醒世人:“人之所以领悟道理,往往不是源于抽象的道理本身,而是生活给予的实实在在的挫折教训,如同撞南墙一般的痛彻觉醒;同样,让人豁然开朗的,也不是空洞的说教,而是实实在在的人生磨砺。”这一哲理,放在我们日常工作中亦有深刻的启示作用…

ISELED氛围灯方案简介

ISELED目录 一、ISELED 介绍二、ISELED联盟三、ISELED的应用方向四、NXP在ISELED上的贡献一、ISELED 介绍 在当今汽车行业疯狂内卷的时代,各车企把更多精力花费在了车辆内部座舱的设计上,氛围灯出现其实已经有好多年,从最开始的单色氛围灯,到64色、128氛围灯,再到现在的2…

Linux系统----------探索mysql数据库MHA高可用

目录 一、MHA概述 1.1 什么是 MHA 1.2MHA 的组成 1.2.1MHA Node&#xff08;数据节点&#xff09; 1.2.2MHA Manager&#xff08;管理节点&#xff09; 1.3MHA 的特点 1.4MHA工作原理 1.5数据同步的方式 1.5.1同步复制 1.5.2异步复制 1.5.3半同步复制 二、搭建 MySQ…

CTK插件框架学习-信号槽(05)

CTK插件框架学习-事件监听(04)https://mp.csdn.net/mp_blog/creation/editor/137171155 一、主要流程 信号发送者告诉服务要发送的信号信号发送者发送信号信号接收者告诉服务当触发某个订阅的主题时通知槽函数信号接收者处理槽函数信号槽参数类型必须为&#xff08;const ctk…

redis数据类型介绍

字符串string&#xff1a; 字符串类型是Redis中最为基础的数据存储类型&#xff0c;是一个由字节组成的序列&#xff0c;他在Redis中是二进制安全的&#xff0c;这便意味着该类型可以接受任何格式的数据&#xff0c;如JPEG图像数据货Json对象描述信息等&#xff0c;是标准的key…