Gonzalez R. C. and Woods R. E. Digital Image Processing (Forth Edition)

除了我们熟悉的RGB模式来表示图片, 还有其他很多种图片表示方式. 其实我现在很想要知道的一点是, 神经网络会对不同的表示会有不同的反应吗?

定义

RGB

普通的彩色图片, 每个像素点是一个三维的值\((x, y, z) \in [0, 1]^3\),

CMY

RGB是以Red, Green, Blue为坐标轴的坐标系, 而CMY是以Cyan, Magenta, Yellow为坐标轴(这些颜色成为second colors), 以White为原点的坐标系.

CMYK

CMY因为不是以black为原点, 所以在实际中难以表示true black? 所以特意引入第四个颜色K表示黑色.

HSI

HSI, 即hue, saturation, identisity.

Hue: 即表示某种颜色, 正如上图所示, 以H, 点与红色(标准)之间的角度(相当于指定某种颜色).

Saturation: 饱和度, 顾名思义, 表示该颜色是有多少的纯色和白色混合在一起的.

Identisity: 灰度值, 将一个图像变成一个灰度图就是根据这个指标, 其相当于\((x, y, z)\)在black-white这个轴上的投影.

注: HSI的值也是归一化为\([0, 1]\)之间.

相互的转换

RGB <=> CMY

\[\left [
\begin{array}{l}
C \\
M \\
Y \\
\end{array}
\right ] =
\left [
\begin{array}{l}
1 \\
1 \\
1 \\
\end{array}
\right ] -
\left [
\begin{array}{l}
R \\
G \\
B
\end{array}
\right ] .
\]

CMY <=> CMYK

CMY > CMYK

\[K = \min (C, M, Y), \\
C = (C - K) / (1 - K), \\
M = (M - K) / (1 - K), \\
Y = (Y - K) / (1 - K). \\
\]

CMYK > CMY

\[C = C * (1 - K) + K, \\
M = M * (1 - K) + K, \\
Y = Y * (1 - K) + K. \\
\]

RGB <=> HSI

hsi-to-rgb-conversion.pdf (tau.ac.il)

RGB > HSI

注意RGB > HSI并非直接的坐标变换, 具体的推导可以看上面的参考文献.

\[\theta = \cos^{-1}
\{
\frac{\frac{1}{2}[(R-G) + (R-B)]}{[(R-G)^2 + (R-B)(G-B)]^{1/2}}
\}, \\
H =
\left \{
\begin{array}{ll}
\theta / 2\pi & \text{if} \: B \le G, \\
1 - \theta/2\pi & \text{if} \: B > G.
\end{array}
\right . \\
S = 1 - \frac{3}{R + G + B}[\min (R, G, B)]. \\
I = \frac{1}{3}(R + G + B).
\]

注: 原文使用的是角度制, 这里我改成弧度制, 另外我这里直接将\(H\)归一化了.

HSI > RGB

HSI > RGB 需要根据\(H\)的不同改变策略:

首先令\(H = H \cdot 2\pi \in [0, 2\pi)\).

  1. \(H \in [0, \frac{2}{3}\pi]\):
\[B = I(1-S), \\
R = I[1 + \frac{S\cos H}{\cos (\frac{1}{3}\pi - H)}], \\
G = 3I - (R + B).
\]
  1. \(H \in [\frac{2}{3}\pi, \frac{4}{3}\pi)\):
\[H = H - \frac{2}{3}\pi, \\
R = I(1-S), \\
G = I[1 + \frac{S\cos H}{\cos (\frac{1}{3}\pi - H)}], \\
B = 3I - (R + G).
\]
  1. \(H \in [\frac{4}{3}\pi, 2\pi)\):
\[H = H - \frac{4}{3}\pi, \\
G = I(1-S), \\
B = I[1 + \frac{S\cos H}{\cos (\frac{1}{3}\pi - H)}], \\
R = 3I - (G + B).
\]

代码示例

import cv2
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
img = np.random.randint(0, 256, (10, 10, 3), dtype=np.uint8)
# rgb -> hsi
def calcH(v):
r, g, b = v
val = (2 * r - g - b) / np.sqrt((r - g) ** 2 + (r - b) * (g - b))
val /= 2
theta = np.arccos(val)
h = theta / (2 * np.pi) if b <= g else (1 - theta / (2 * np.pi))
return h def calcS(v):
return 1 - 3 * v.min() / v.sum() def calcI(v):
return v.mean() def rgb2hsi(img: np.ndarray) -> np.ndarray:
img = img.astype(np.float) / 255.
def unit(v):
h = calcH(v)
s = calcS(v)
i = calcI(v)
return np.array([h, s, i])
img = np.apply_along_axis(unit, 2, img)
return img
# hsi -> rgb

def unit(v):
h, s, i = v
idx = np.arange(3)
h = h * np.pi * 2
if h >= 2 * np.pi / 3:
if h >= 4 * np.pi / 3:
h = h - 4 * np.pi / 3
idx = (idx - 2) % 3
else:
h = h - 2 * np.pi / 3
idx = (idx - 1) % 3
b = i * (1 - s)
r = i * (1 + s * np.cos(h) / np.cos(np.pi / 3 - h))
g = 3 * i - b - r
v = np.array([r, g, b])
return v[idx] def hsi2rgb(img: np.ndarray):
img = img.astype(np.float) / 255.
img = np.apply_along_axis(unit, 2, img) * 255
return img.astype(np.uint8)

在opencv库中, 可以通过如下手段变化:

rgb2hsi_cv = cv2.cvtColor(img[..., [2, 1, 0]], cv2.COLOR_BGR2HLS)
hsi2rgb_cv = cv2.cvtColor(rgb2hsi_cv, cv2.COLOR_HLS2BGR)[..., [2, 1, 0]]

opencv采用BGR格式是由于历史原因.

另外, 其出来的结果和我所实现的结果并不一致, 其I值也并非\(\frac{1}{3}(R + G + B)\)​, 所以我怀疑可能用的是另外一套变换公式(虽然网上说, HLS就是HSI).

在PIL库中, 我没找到RGB2HSI的函数, 不过PIL一般采用如下方式进行变换:

rgb2what = Image.fromarray(img).convert('RGB').convert('...')

注: '...'部分表示mode, 具体参考: Concepts — Pillow (PIL Fork) 8.3.1 documentation

Color Models (RGB, CMY, HSI)的更多相关文章

  1. RGB to HSI, HSI to RGB Conversion Calculator

    The RGB color model is an additive system in which each color is defined by the amount of red, green ...

  2. 常用icon以及color颜色RGB值和对应颜色效果图

    Android谷歌官方扁平化设计常用icon集合   Android谷歌官方扁平化设计color颜色RGB值和对应颜色效果图.

  3. 基于RGB与HSI颜色模型的图像提取法

    现实中我们要处理的往往是RGB彩色图像.对其主要通过HSI转换.分量色差等技术来提出目标. RGB分量灰度化: RGB可以分为R.G.B三分量.当R=G=B即为灰度图像,很多时候为了方便,会直接利用某 ...

  4. 【转载】颜色空间-RGB、HSI、HSV、YUV、YCbCr的简介

    转载自缘佳荟的博客. 颜色通常用三个相对独立的属性来描述,三个独立变量综合作用,自然就构成一个空间坐标,这就是颜色空间.而颜色可以由不同的角度,用三个一组的不同属性加以描述,就产生了不同的颜色空间.但 ...

  5. QT 实现彩色图亮度均衡,RGB和HSI空间互相转换

    从昨天折腾到今天.再折腾下去我都要上主楼了  大致和灰度图均衡是一样的,主要是不能像平滑什么的直接对R,G,B三个分量进行.这样出来的图像时没法看的.因此我们要对亮度进行均衡.而HSI彩色空间中的分量 ...

  6. COLORREF和COLOR和RGB的总结

    一.COLORREF与RGB的相互转化 RGB(r,g,b)是一个宏 实际上它做得事是((COLORREF)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((D ...

  7. 实现RGB,CMY(K),YUV,YIQ,YCbCr颜色的转换算法

    源:http://blog.sina.com.cn/s/blog_4d80055a01000atu.html import java.lang.Math; import java.awt.*; pub ...

  8. 颜色color转为rgb格式

    function convertHexToRGB(color) {       if (color.length === 4) {             let extendedColor = &q ...

  9. RGB,CMYK,HSB各种颜色表示的转换 C#语言

    Introduction Why an article on "colors"? It's the same question I asked myself before writ ...

随机推荐

  1. Linux启动初始化配置文件

    Linux启动初始化配置文件(1)/etc/profile 登录时,会执行. 全局(公有)配置,不管是哪个用户,登录时都会读取该文件. (2)/ect/bashrc Ubuntu没有此文件,与之对应的 ...

  2. Output of C++ Program | Set 15

    Predict the output of following C++ programs. Question 1 1 #include <iostream> 2 using namespa ...

  3. 如何设置eclipse下查看java源码

    windows--preferences--java--installed jres --选中jre6--点击右边的edit--选中jre6/lib/rt.jar --点击右边的 source att ...

  4. Spring Cloud集成RabbitMQ的使用

    同步 or 异步 前言:我们现在有一个用微服务架构模式开发的系统,系统里有一个商品服务和订单服务,且它们都是同步通信的. 目前我们商品服务和订单服务之间的通信方式是同步的,当业务扩大之后,如果还继续使 ...

  5. Zookeeper客户端链接

    一.zkCli.sh ./zkCli.sh -server 39.97.176.160:2182 39.97.176.160 : zookeeper服务器Ip 2182:zookeeper端口 二.Z ...

  6. 【Linux】【Basis】CentOS启动流程

    1. 基础概念       1.1 Linux系统的组成部分:内核+根文件系统         内核:进程管理.内存管理.网络协议栈.文件系统.驱动程序.安全功能             IPC:In ...

  7. Apache设置虚拟机端口

    Apache虚拟机设置端口,以45184端口为例httpd-vhosts.conf文件NameVirtualHost *:45184<VirtualHost *:45184>    Doc ...

  8. 转:KVC 与 KVO 理解

    KVC 与 KVO 理解 On 2012 年 6 月 7 日, in iPhone, by donly KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲 ...

  9. OpenGL ES2 缩放移动

    OpenGL ES Transformations with Gestures Ricardo Rendon Cepeda on December 10, 2013 Tweet Gestures: I ...

  10. [BUUCTF]REVERSE——[SUCTF2019]SignIn

    [SUCTF2019]SignIn 附件 步骤: 无壳,64位ida载入 程序调用了 __gmpz_init_set_str 函数,这是一个 GNU 高精度算法库,在RSA加密中见过几次,加上6553 ...