目錄
零、寫在前面的話
一、圖像色彩空間轉換
1.1 RGB顏色空間
1.1.1 RGB顏色空間概念
1.1.2 RGB顏色模型?編輯
1.1.3 關于顏色加法
1.1.4 顏色加權加法
1.2 HSV顏色空間
1.2.1 HSV顏色空間概念
1.2.2 HSV顏色模型
1.2.3 應用意義
1.3 顏色轉換
1.3.1 轉換方法
1.3.2?RGB轉Gray, RGB轉HSV
二、圖像灰度化處理
2.1 概念基礎
2.1.1 灰度圖
2.1.2 轉化為彩色圖
2.1.3 兩個極端的灰度值
2.2 灰度化處理方法
2.2.1 最大值法
2.2.2 平均值法
2.2.3 加權均值法
零、寫在前面的話
????????在這個階段的學習里,初學者們應該持著正確的學習心態,注重基礎操作、多敲代碼;遇到搞不懂的原理和難題可以先跳過,先把基礎概念以及方法的使用弄明白,待度過“黑盒階段”后再補理論也是可以的。還有一點,要善用社區資源,可以多看技術文檔與相關文章。
????????學習圖像處理道阻且艱,都說圖像預處理是“臟活累活”,但其直接影響后續高級任務的性能,打好基礎很重要。那么我們現在就一起開始學習吧。
一、圖像色彩空間轉換
- OpenCV中,圖像色彩空間轉換是一個非常基礎且重要的操作,就是將圖像從一種顏色表示形式轉換為另一種表示形式的過程。
- 通過將圖像從一個色彩空間轉換到另一個色彩空間,可以更好地進行特定類型的圖像處理和分析任務。
- 常見的顏色空間包括RGB、HSV、YUV等。
1.1 RGB顏色空間
1.1.1 RGB顏色空間概念
- RGB代表紅色(Red)、綠色(Green)和藍色(Blue),這三種顏色通過不同強度的光的組合來創建其他顏色。
- RGB顏色空間是我們接觸最多的顏色空間,是一種用于表示和顯示彩色圖像的一種顏色模型。
1.1.2 RGB顏色模型
RGB顏色模型基于笛卡爾坐標系,RGB顏色空間可以產生大約1600萬種顏色,幾乎包括了世界上的所有顏色,也就是說可以使用RGB顏色空間來生成任意一種顏色。
注意:
- 在OpenCV中,顏色是以BGR的方式進行存儲的,而不是RGB,這也是上面紅色的像素值是(0,0,255)而不是(255,0,0)的原因。
1.1.3 關于顏色加法
(1)注意點:兩個圖像應該具有相同的大小和類型。
(2)方法:
- 使用OpenCV的 cv.add() 函數。
- 通過numpy操作添加兩個圖像,如res = img1 + img2。
(3)區別:OpenCV加法和Numpy加法之間存在差異。OpenCV的加法是飽和操作,而Numpy添加是模運算。
1.1.4 顏色加權加法
(1)方法:
cv2.addWeighted(src1,alpha,src2,deta,gamma)
(2)參數解釋:
-
src1
、src2
:輸入圖像。 -
alpha
、beta
:兩張圖象權重。 -
gamma
:亮度調整值。-
gamma > 0
,圖像會變亮。 -
gamma < 0
,圖像會變暗。 -
gamma = 0
,則沒有額外的亮度調整。
-
(3)代碼演示:
仍沿用之前的圖片文件夾位置
import cv2 as cv
import numpy as npcao = cv.imread("../images/cao.png")
pig = cv.imread("../images/pig.png")# 飽和操作
add1 = cv.add(cao, pig)# print(cao)
# print(pig)
# print(add)# numpy是取模運算
add2 = cao + pig
# 一樣大小的圖片可以進行加法運算
x = np.uint8([[250]])
y = np.uint8([[10]])
xy1 = cv.add(x, y)
xy2 = x + y
print(xy1)
print(xy2)# 加權加法 cv.addWeighted(img1, a, img2, b, c) c是亮度調節
add3 = cv.addWeighted(cao, 0.3, pig, 0.7, -20)cv.imshow("add", add1)
cv.imshow("add2", add2)
cv.imshow("add3", add3)
# cv.imshow("cao", cao)
# cv.imshow("pig", pig)
cv.waitKey(0)
cv.destroyAllWindows()
1.2 HSV顏色空間
1.2.1 HSV顏色空間概念
- HSV顏色空間指的是HSV顏色模型,這是一種與RGB顏色模型并列的顏色空間表示法。
- HSV顏色空間使用色調(Hue)、飽和度(Saturation)和亮度(Value)三個參數來表示顏色,色調H表示顏色的種類,如紅色、綠色、藍色等;飽和度表示顏色的純度或強度,如紅色越純,飽和度就越高;亮度表示顏色的明暗程度,如黑色比白色亮度低。
1.2.2 HSV顏色模型
HSV顏色模型是一種六角錐體模型:
附圖:HSV顏色模型
色調 H: 0 ~ 180
飽和度 S: 0 ~ 255
亮度 V: 0 ~?255
附圖:顏色對照表
1.2.3 應用意義
- 使用HSV空間處理圖像可以更直觀地調整顏色和進行色彩平衡等操作,更符合人類的感知習慣。
- 在HSV顏色空間中,色調、飽和度和亮度的調整都是直觀的,而在RGB顏色空間中調整顏色不那么直觀。
- 在圖像處理中,降維處理可以減少計算的復雜性和計算量。HSV顏色空間相對于RGB顏色空間,減少了兩個維度(紅、綠、藍),這有利于進行一些計算和處理任務,比如色彩分割、匹配等。
因此,在進行圖片顏色識別時,我們會將RGB圖像轉換到HSV顏色空間,然后根據顏色區間來識別目標顏色。
1.3 顏色轉換
1.3.1 轉換方法
方法:cv2.cvtColor(img,code)
-
img
:輸入圖像,可以是一個Numpy數組繪著一個OpenCV的Mat對象-
Mat
是一個核心的數據結構,主要用于存儲圖像和矩陣數據。在 Python 中使用 OpenCV 時,通常直接處理的是 NumPy 數組,cv2
模塊自動將Mat
對象轉換為 NumPy 數組。二者之間的轉換是透明且自動完成的。例如,當你使用cv2.imread()
函數讀取圖像時,返回的是一個 NumPy 數組,但在C++中則是Mat
對象。
-
-
code
:指定轉換的類型,可以使用預定義的轉換代碼。-
例如
cv2.COLOR_RGB2GRAY
表示從rgb到灰度圖像的轉換。
-
1.3.2?RGB轉Gray, RGB轉HSV
代碼演示:
import cv2 as cv# 讀取圖片
img = cv.imread("../images/1.jpg")# 轉換為HSV cv.cvtColor(img, code)
hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
rgb = cv.cvtColor(img, cv.COLOR_BGR2RGB)cv.imshow("hsv", hsv)
cv.imshow("gray", gray)
cv.imshow("rgb", rgb)cv.waitKey(0)
cv.destroyAllWindows()
二、圖像灰度化處理
將彩色圖像轉換為灰度圖像的過程稱為灰度化,這種做法在圖像處理和計算機視覺領域非常常見。
2.1 概念基礎
2.1.1 灰度圖
- 灰度圖像與黑白圖像不同,在計算機圖像領域中黑白圖像只有黑色與白色兩種顏色;但是,灰度圖像在黑色與白色之間還有許多級的顏色深度。
- 灰度圖像經常是在單個電磁波頻譜如可見光內測量每個像素的亮度得到的,用于顯示的灰度圖像通常用每個采樣像素8位的非線性尺度來保存,這樣可以有256級灰度。
2.1.2 轉化為彩色圖
灰度圖與彩色圖最大的不同就是:彩色圖是由R、G、B三個通道組成,而灰度圖只有一個通道,也稱為單通道圖像,所以彩色圖轉成灰度圖的過程本質上就是將R、G、B三通道合并成一個通道的過程。
2.1.3 兩個極端的灰度值
在灰度圖像中,“極端”的灰度值指的是亮度的兩個極端:最暗和最亮的值。
-
最暗的灰度值:0。這代表完全黑色,在灰度圖像中沒有任何亮度。
-
最亮的灰度值:255。這代表完全白色,在灰度圖像中具有最大亮度。
2.2 灰度化處理方法
2.2.1 最大值法
對彩色圖像的每個像素,從R、G、B三個通道的值中選出最大的一個,并將其作為灰度圖像中對應位置的像素值。
import cv2 as cv
import numpy as nppig = cv.imread("../images/pig.png")
shape = pig.shape# 創建一張和原圖大小一樣的全零圖片
gray = np.zeros((shape[0], shape[1]), dtype=np.uint8)# 灰度化,循環遍歷每行的每一列
for i in range(shape[0]):for j in range(shape[1]):gray[i, j,] = max(pig[i, j, 0], pig[i, j, 1], pig[i, j, 2])cv.imshow("gray", gray)
cv.waitKey(0)
cv.destroyAllWindows()
2.2.2 平均值法
對彩色圖像的每個像素,將其R、G、B三個通道的像素值全部加起來,然后再除以三,得到的平均值就是灰度圖像中對應位置的像素值。
import cv2 as cv
import numpy as nppig = cv.imread("../images/pig.png")
shape = pig.shape# 創建一張和原圖大小一樣的全零圖片
gray = np.zeros((shape[0], shape[1]), dtype=np.uint8)# 灰度化,循環遍歷每行的每一列
for i in range(shape[0]):for j in range(shape[1]):gray[i, j] = np.uint8((int(pig[i, j, 0]) + int(pig[i, j, 1]) + int(pig[i, j, 2]))//3)cv.imshow("gray", gray)
cv.waitKey(0)
cv.destroyAllWindows()
2.2.3 加權均值法
- 對于彩色圖像的每個像素,按照一定的權重去乘以每個通道的像素值,并將其相加,得到最后的值就是灰度圖像中對應位置的像素值。
- 對于彩色圖像的每個像素,它會按照一定的權重去乘以每個通道的像素值,并將其相加,得到最后的值就是灰度圖像中對應位置的像素值。
將上面的代碼改一下即可:
import cv2 as cv
import numpy as nppig = cv.imread("../images/pig.png")
shape = pig.shape# 創建一張和原圖大小一樣的全零圖片
gray = np.zeros((shape[0], shape[1]), dtype=np.uint8)# 灰度化,循環遍歷每行的每一列
# for i in range(shape[0]):
# for j in range(shape[1]):
# gray[i, j] = np.uint8((int(pig[i, j, 0]) + int(pig[i, j, 1]) + int(pig[i, j, 2]))//3)# 加權均值法
wb, wg, wr = 0.35, 0.59, 0.6
for i in range(shape[0]):for j in range(shape[1]):gray[i, j] = np.uint8((int(pig[i, j, 0]) * wb + int(pig[i, j, 1]) * wg + int(pig[i, j, 2]) * wr)//3)cv.imshow("gray", gray)
cv.waitKey(0)
cv.destroyAllWindows()
補充說明:
在OpenCV中,內置的灰度化處理函數是:
gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
默認的加權系數(BT.601標準)為:
Gray = 0.114 * B + 0.587 * G + 0.299 * R
這是基于人眼視覺特性制定的加權標準:
- 人眼對 綠色最敏感,因此 G 權重大;
- 對 藍色最不敏感,因此 B 權重最小;
- 紅色則居中。
這個標準來自ITU-R BT.601視頻色彩轉換標準。