iT邦幫忙

2021 iThome 鐵人賽

DAY 19
0
AI & Data

資料三十-那些最基本的資料處理與分析技能系列 第 19

【Day19-顏色】眼前的黑不是黑,你說的白是什麼白?——淺談圖片資料的色彩空間

  • 分享至 

  • xImage
  •  

在經過了文字和聲音的章節,今天終於到了圖片的進度
我們會從人類對視覺的認知方式出發,以及談一下那些不同的色彩空間對於儲存一張圖片有什麼優勢

顏色與視覺

人類是怎麼感受視覺的?

讓我們複習一下國中生物,人類的視覺是由對明暗比較敏感的視桿細胞(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


上一篇
【Day18-音調】我們怎麼聽出來不同音高的差別?——python中對於聲音頻率的處理
下一篇
【Day20-填充】二維圖片資料要怎麼做填充?
系列文
資料三十-那些最基本的資料處理與分析技能30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言