【Day19-颜色】眼前的黑不是黑,你说的白是什麽白?——浅谈图片资料的色彩空间

在经过了文字和声音的章节,今天终於到了图片的进度
我们会从人类对视觉的认知方式出发,以及谈一下那些不同的色彩空间对於储存一张图片有什麽优势

颜色与视觉

人类是怎麽感受视觉的?

让我们复习一下国中生物,人类的视觉是由对明暗比较敏感的视杆细胞(rods)和各自对不同颜色敏感的视锥细胞(cones)所构成的。而我们看到不同的形状和影响也就是由这些细胞所接受到的讯号强弱所产生的感受。

电脑是怎麽储存图像的?

以未压缩的图片来说,电脑将图像作为一个二维的阵列储存起来(考虑到颜色会再多一维),即可用来记录一组平面上的数据点——称作像素(pixel),而显示则也一样是将每个点上显示不同比例的RGB光线来表示那个像素点的颜色。

RGB三原色?

然而这边要注意的是,虽然很常会听到所谓的RGB三原色,但其实不论是发光的元件亦或是人类的感知,对於这些颜色都不会是单一频率的——所以这边提到的RGB其实都是一个范围


小补充:因为光线的能量(不论接受或发出)是对强度随波长变化面积的积分,因此如果是理想单一频率(或波长)的话其实它所能传递的能量就为0,自然也谈不上什麽後续的感受了。


常见可见光谱颜色对应波长范围,资料来源:颜色-维基百科

一些常见储存图像的色彩空间

RGB

虽然前面讲的对於我们三种颜色的感受都不是单一的频率,但用三种定义好的频率的光相加所能组合出来的颜色却也是十分方便,因此最常用的储存方式就是将这三个颜色的资讯储存(通常称作通道)下来与读取,这边我们以cv2为范例

使用cv2读取图片

import numpy as np
import cv2
img = cv2.imread("sample.png")
img.shape

输出:

(1047, 1080, 3)
使用cv2显示图片
cv2.imshow('Sample', img)
cv2.waitKey(0) # 因会弹窗显示,需要设定结束按键
cv2.destroyAllWindows() # 关闭视窗

使用matplotlib显示图片
from matplotlib import pyplot as plt
plt.imshow(img[:,:,::-1]) # opencv是用BGR的顺序,因此需要调换
plt.show() # 记得输出显示

灰阶图像

在彩色电视普及以前,我们仍然可以透过黑白电视来认得出不同的事物,这就依靠着我们对灰阶图像也能辨识物体的能力。而灰阶图像在电脑里的储存方式是将该点的像素值亮度储存下来(8bits常用0~255来表示)

使用cv2转换

img_gray = cv2.cvtColor(img, cv2.IMREAD_GRAYSCALE)

使用RGB转换公式

img_gray2 = np.array((img[:,:,0]*0.299 + img[:,:,0]*0.587 + img[:,:,0]*0.114), dtype="uint8")

比较一下两个灰阶的方式

fig, (ax1, ax2) = plt.subplots(1, 2)

fig.suptitle('Gray scale using cv2 vs. formula')
ax1.imshow(img_gray, cmap = 'gray')
ax2.imshow(img_gray2, cmap = 'gray')
plt.show()

HSV色彩空间

然而,虽然用三种不同的单色光表示颜色很方便,但因为人类对於这些颜色的变化却不是直接线性相关的,因此各种针对颜色感受度设计的色彩空间开始被提出来。而在做颜色分析的时候很常使用到的一个就是根据色相饱和度亮度三个维度重新表示颜色的空间。

使用cv2转换并提出HSV图层

hsv=cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 转换成HSV格式
h,s,v = cv2.split(hsv) # 分割成三个通道

fig, (ax1, ax2,ax3) = plt.subplots(1, 3)

fig.suptitle('HSV')
ax1.imshow(h)
ax1.set_title("H")
ax2.imshow(s)
ax2.set_title("S")
ax3.imshow(v,cmap="gray")
ax3.set_title("V")
plt.show()

输出:

嗯...我真的在做之前没有预料到它嘴巴那边的色相会有那一块XDDD


<<:  DAY 19 - 上传档案的相关概念:上传进度条、checksum、大档分片上传

>>:  [Day26] Vue 3 - Hello Vue

【第七天 - Bubble Sort 题目分析】

先简单回顾一下,今天预计分析的题目: 如何利用 Bubble sort 进行排序? 我们要将下图六个...

产品成长策略 - 安索夫矩阵

一家公司很难单靠一个产品来获利,就像 原来产品也有自己的生命历程 Product Life Cycl...

(31) 试着学 Hexo - 番外篇之常见问题

前言 这一篇是完赛後的总结篇,虽然说是总结篇,但其实还是要讲一些 Hexo 常见的问题。 小心关键字...

虹语岚访仲夏夜-23(专业的小四篇)

万里无云时 总觉得喘不过气 要问为什麽 一定是 无云天空下 只有我问我    该往那去 寂静夜深时...

Day 14 - Arrow Function Expression & this

this 在 JavaScript 里,this 指向 window,在 function 中, t...