文章目錄
- 一、圖像預處理
- 4 邊緣填充
- 4.1 邊界復制(BORDER_REPLICATE)
- 4.2 邊界反射(BORDER_REFLECT)
- 4.3 邊界反射101(BORDER_REFLECT_101)
- 4.4 邊界常數(BORDER_CONSTANT)
- 4.5 邊界包裹(BORDER_WRAP)
- 4.6案例
- 5 圖像矯正(透視變換)
- 6 圖像色彩空間轉換
- 6.1 顏色加法
- 6.2 顏色加權加法
- 6.2 顏色加權加法
一、圖像預處理
4 邊緣填充
填充邊緣?我們以下圖為例。
黑色區域就是需要填充的部分。
4.1 邊界復制(BORDER_REPLICATE)
邊界復制會將邊界處的像素值進行復制,然后作為邊界填充的像素值,如下圖所示,可以看到四周的像素值都一樣。
- 添加屬性 :
borderMode=cv.BORDER_REPLICATE
new_img=cv.warpAffine(img,M,(w,h),cv.INTER_LANCZOS4,
borderMode=cv.BORDER_REPLICATE)
4.2 邊界反射(BORDER_REFLECT)
如下圖所示,會根據原圖的邊緣進行反射。
- 添加屬性 :
borderMode=cv.BORDER_REFLECT)
new_img=cv.warpAffine(img,M,(w,h),cv.INTER_LANCZOS4,borderMode=cv.BORDER_REFLECT)
4.3 邊界反射101(BORDER_REFLECT_101)
與邊界反射不同的是,不再反射邊緣的像素點,如下圖所示。
- 添加屬性 :borderMode=cv.BORDER_REFLECT_101
new_img=cv.warpAffine(img,M,(w,h),cv.INTER_LANCZOS4,borderMode=cv.BORDER_REFLECT_101)
4.4 邊界常數(BORDER_CONSTANT)
當選擇邊界常數時,還要指定常數值是多少,默認的填充常數值為0,如下圖所示。
- 添加屬性 :
- borderMode=cv.BORDER_CONSTANT
- borderValue=(0,0,255) 填充的常數值
new_img=cv.warpAffine(img,M,(w,h),cv.INTER_LANCZOS4,borderMode=cv.BORDER_CONSTANT,
borderValue=(0,0,255))
4.5 邊界包裹(BORDER_WRAP)
無限平移補充。
- 添加屬性 :borderMode=cv.BORDER_WRAP
new_img=cv.warpAffine(img,M,(w,h),cv.INTER_LANCZOS4,borderMode=cv.BORDER_WRAP)
4.6案例
import cv2 as cv
import numpy as np
# 讀取圖片
cat = cv.imread("./images/face.png")
h, w = cat.shape[:2]
center = (w // 2, h // 2)# 旋轉中心
angle = 45# 旋轉角度
M = cv.getRotationMatrix2D(center, angle, 0.5)
# 臨近值插值
cat2 = cv.warpAffine(cat, M, (w, h), flags=cv.INTER_LANCZOS4, borderMode=cv.BORDER_REPLICATE)
# 邊界反射/邊界為軸,進行翻轉插值
cat3 = cv.warpAffine(cat, M, (w, h), flags=cv.INTER_LANCZOS4, borderMode=cv.BORDER_REFLECT)
# 邊界反射101/與上面原理一樣,只是邊界的一排不反射
cat4 = cv.warpAffine(cat, M, (w, h), flags=cv.INTER_LANCZOS4, borderMode=cv.BORDER_REFLECT_101)
# 邊界常數---要填寫填充值
cat5 = cv.warpAffine(cat, M, (w, h), flags=cv.INTER_LANCZOS4, borderMode=cv.BORDER_CONSTANT, borderValue=(255, 0, 0))
# 邊界包裹
cat6 = cv.warpAffine(cat, M, (w, h), flags=cv.INTER_LANCZOS4, borderMode=cv.BORDER_WRAP)cv.imshow("01",cat2)
cv.imshow("02",cat3)
cv.imshow("03", cat4)
cv.imshow("04", cat5)
cv.imshow("05", cat6)
cv.waitKey(0)
cv.destroyAllWindows()
- 結果圖
5 圖像矯正(透視變換)
圖像矯正的原理是透視變換,下面來介紹一下透視變換的概念。
前面的仿射變換是把一個二維坐標系轉換到另一個二維坐標系的過程,轉換過程坐標點的相對位置和屬性不發生變換,是一個線性變換,該過程只發生旋轉和平移過程。因此,一個平行四邊形經過仿射變換后還是一個平行四邊形。
這里的透視變換是把一個三維圖像中的某個區域映射成二維圖片,并且是矩形呈現。
與仿射變換一樣,透視變換也有自己的透視變換矩陣:
[ X Y Z ] = [ a 11 a 12 a 13 a 21 a 22 a 23 a 31 a 32 a 33 ] ? [ x y 1 ] \begin{array}{l l l}{{\left[\begin{array}{c}{{X}}\\{{Y}}\\{Z} \end{array}\right]=\left[\begin{array}{c c c}{{a_{11}}}&{{a_{12}}}&{{a_{13}}}\\ {{a_{21}}}&{{a_{22}}}&{{a_{23}}}\\ {{a_{31}}}&{{a_{32}}}&{{a_{33}}}\end{array}\right]*\left[\begin{array}{c}{{x}}\\{{y}}\\{{1}}\end{array}\right]}}\end{array} ?XYZ? ?= ?a11?a21?a31??a12?a22?a32??a13?a23?a33?? ?? ?xy1? ??
- 矩陣生成方式:
- M=getPerspectiveTransform(np1, np2)
- np1:數據類型為float32的二維矩陣,存放透視區域的四個點坐標
- np2:數據類型為float32的二維矩陣,存放原圖的四個點坐標
該函數會返回一個透視變換矩陣,得到透視變化矩陣之后,使用warpPerspective()函數即可進行透視變化計算,并得到新的圖像。該函
數需要提供如下參數:
-
cv2.warpPerspective(src, M, dsize, flags, borderMode)
src:輸入圖像。
M:透視變換矩陣。這個矩陣可以通過getPerspectiveTransform函數計算得到。
dsize:輸出圖像的大小。它可以是一個Size對象,也可以是一個二元組。
flags:插值方法的標記。
borderMode:邊界填充的模式。
- 示例:
import cv2 as cv
import numpy as np
img = cv.imread("./images/3.png")
h, w = img.shape[:2]
# 透視變換
# 待取區域的4個坐標
zs, ys, zx, yx = (182, 133), (500, 171), (133, 264), (490, 308)
pts1 = np.float32([zs, ys, zx, yx])
# 原圖4個點 (0,0) (w,0) (0,h) (w,h)
pts2 = np.float32([[0, 0], [w, 0], [0, h], [w, h]])
# 獲取透視矩陣
M = cv.getPerspectiveTransform(pts1, pts2)
# 計算出新圖片(透視處理后的圖片)
dst = cv.warpPerspective(img, M, (w, h), flags=cv.INTER_LINEAR, borderMode=cv.BORDER_CONSTANT)
cv.imshow("dst", dst)
cv.waitKey(0)
cv.destroyAllWindows()
6 圖像色彩空間轉換
OpenCV中,圖像色彩空間轉換是一個非常基礎且重要的操作,就是將圖像從一種顏色表示形式轉換為另一種表示形式的過程。通過將圖像從一個色彩空間轉換到另一個色彩空間,可以更好地進行特定類型的圖像處理和分析任務。常見的顏色空間包括RGB、HSV、YUV等。
-
色彩空間轉換的作用
-
提高圖像處理效果
-
節省計算資源
-
6.1 顏色加法
將兩個圖片的每個像素點進行相加。
- 方法1:OpenCV的cv.add()函數
- 飽和操作,例如:10+250 = 255
- 方法2:numpy的+運算
- 取模操作,例如:10+250 = 256 % 260 = 4
6.2 顏色加權加法
img = cv2.addWeighted(src1,alpha,src2,deta,gamma)
src1
、src2
:輸入圖像。alpha
、beta
:兩張圖象權重,累加=1gamma
:亮度調整值。gamma > 0
,圖像會變亮。gamma < 0
,圖像會變暗。
- 取模操作,例如:10+250 = 256 % 260 = 4
6.2 顏色加權加法
img = cv2.addWeighted(src1,alpha,src2,deta,gamma)
src1
、src2
:輸入圖像。alpha
、beta
:兩張圖象權重,累加=1gamma
:亮度調整值。gamma > 0
,圖像會變亮。gamma < 0
,圖像會變暗。gamma = 0
,則沒有額外的亮度調整。