函數內容接上文:OpenCV day4-CSDN博客
目錄
9.cv2.adaptiveThreshold():
10.cv2.split():
11.cv2.merge():
12.cv2.add():
13.cv2.subtract():
14.cv2.multiply():
15.cv2.divide():
16.cv2.bitwise_and():
17.cv2.bitwise_or():
18.cv2.inRange():
19.cv2.getRotationMatrix2D():
21.cv2.flip():
22.cv2.resize():
23.cv2.getPerspectiveTransform():
24.cv2.warpPerspective():
透視變換練習1:
透視變換練習2:
9.cv2.adaptiveThreshold():
功能 | 對圖像進行局部自適應閾值化,解決光照不均問題,生成二值圖像。 |
參數 | 1.?src :輸入灰度圖像(單通道)。2.? maxValue :滿足條件時賦予的像素值(如255)。3.? adaptiveMethod :閾值計算方式(ADAPTIVE_THRESH_MEAN_C ?或?ADAPTIVE_THRESH_GAUSSIAN_C )。4.? thresholdType :二值化類型(THRESH_BINARY ?或?THRESH_BINARY_INV )。5.? blockSize :局部鄰域大小(奇數,如11)。6.? C :從均值/高斯均值中減去的常數(用于微調閾值)。 |
返回值 | 二值化后的圖像(numpy.ndarray )。 |
關鍵區別:
-
普通閾值(如
cv2.threshold
):全局統一閾值。 -
自適應閾值:每個像素的閾值根據周圍像素動態計算,適合光照不均的圖像。
10.cv2.split():
功能 | 將多通道圖像(如BGR)拆分為單通道數組。 |
參數 | src :輸入的多通道圖像(numpy.ndarray ,如BGR格式的3通道圖像)。 |
返回值 | 返回單通道數組的元組(如BGR圖像返回(B, G, R) 三個通道)。 |
11.
cv2.merge():
功能 | 將多個單通道數組合并成一個多通道圖像(如合并 B、G、R 通道成彩色圖像)。 |
參數 | mv :一個包含單通道數組的列表或元組(如?[B, G, R] )。 |
返回值 | 合并后的多通道圖像(numpy.ndarray )。 |
關鍵點:
-
通常與?
cv2.split()
?配合使用,用于通道分離后的重新合并。 -
輸入的通道順序決定輸出圖像的格式(如?
[R, G, B]
?會生成 RGB 圖像,而 OpenCV 默認是 BGR)。
12.cv2.add():
功能 | 對兩張圖像(或圖像與標量)進行飽和加法運算(像素值超過最大值時截斷)。 |
參數 | 1.?src1 :第一張輸入圖像或標量值。2.? src2 :第二張輸入圖像或標量值。3.? mask (可選):掩膜,指定操作區域。4.? dtype (可選):輸出數據類型(如?cv2.CV_8U )。 |
返回值 | 加法結果圖像(numpy.ndarray )。 |
關鍵特性:
-
飽和運算:結果超出范圍時自動截斷(如?
uint8
?超過 255 則取 255)。 -
與?
numpy.add()
?區別:NumPy 是模運算(256 → 0),而 OpenCV 是截斷(256 → 255)。
13.cv2.subtract():
功能 | 對兩張圖像(或圖像與標量)進行飽和減法運算(像素值低于最小值時截斷為0)。 |
參數 | 1.?src1 :被減圖像或標量值。2.? src2 :減數圖像或標量值。3.? mask (可選):掩膜,指定操作區域。4.? dtype (可選):輸出數據類型(如?cv2.CV_8U )。 |
返回值 | 減法結果圖像(numpy.ndarray )。 |
14.cv2.multiply():
功能 | 對兩張圖像(或圖像與標量)進行飽和乘法運算(像素值超過最大值時截斷)。 |
參數 | 1.?src1 :第一張輸入圖像或標量值。2.? src2 :第二張輸入圖像或標量值。3.? scale (可選):縮放因子(默認1.0)。4.? dtype (可選):輸出數據類型(如?cv2.CV_32F )。 |
返回值 | 乘法結果圖像(numpy.ndarray )。 |
15.cv2.divide():
功能 | 對兩張圖像(或圖像與標量)進行除法運算(支持飽和處理和類型轉換)。 |
參數 | 1.?src1 :被除數圖像或標量值。2.? src2 :除數圖像或標量值。3.? scale (可選):縮放因子(默認1.0)。4.? dtype (可選):輸出數據類型(如?cv2.CV_32F )。 |
返回值 | 除法結果圖像(numpy.ndarray )。 |
16.cv2.bitwise_and():
功能 | 對兩張圖像(或圖像與標量)進行按位與運算(像素級二進制AND操作)。 |
參數 | 1.?src1 :第一張輸入圖像或標量值。2.? src2 :第二張輸入圖像或標量值。3.? mask (可選):掩膜,指定操作區域(僅對掩膜非零區域操作)。4.? dst (可選):輸出數組。 |
返回值 | 按位與結果圖像(numpy.ndarray )。 |
關鍵特性:
-
二進制操作:對每個像素的二進制值逐位進行AND運算(同1得1,否則得0)。
-
掩膜應用:可通過?
mask
?參數限定操作區域(非掩膜區域輸出為0)。 -
典型用途:圖像掩膜提取、ROI操作、位平面分析。
17.cv2.bitwise_or():
功能 | 對兩張圖像(或圖像與標量)進行按位或運算(像素級二進制OR操作)。 |
參數 | 1.?src1 :第一張輸入圖像或標量值。2.? src2 :第二張輸入圖像或標量值。3.? mask (可選):掩膜,指定操作區域(僅對掩膜非零區域操作)。4.? dst (可選):輸出數組。 |
返回值 | 按位或結果圖像(numpy.ndarray )。 |
對比其他位操作:
-
cv2.bitwise_and()
:邏輯與(交集) -
cv2.bitwise_or()
:邏輯或(并集) -
cv2.bitwise_xor()
:邏輯異或(差異) -
cv2.bitwise_not()
:邏輯非(取反)
18.cv2.inRange():
功能 | 檢查圖像中像素值是否位于指定范圍內,生成二值掩膜(符合范圍=255,否則=0)。 |
參數 | 1.?src :輸入圖像(單通道或多通道)。2.? lowerb :范圍下限(標量或數組,如?[min_B, min_G, min_R] )。3.? upperb :范圍上限(標量或數組,如?[max_B, max_G, max_R] )。 |
返回值 | 二值掩膜圖像(numpy.ndarray ,符合范圍=255,否則=0)。 |
關鍵特性:
-
多通道支持:可直接處理彩色圖像(需為?
lowerb
?和?upperb
?提供每個通道的閾值)。 -
典型用途:顏色過濾、背景分割、對象檢測(如提取綠色區域)。
19.cv2.getRotationMatrix2D():
功能 | 生成一個?2D旋轉矩陣,用于圖像的旋轉操作(圍繞指定中心點旋轉)。 |
參數 | 1.?center :旋轉中心坐標?(x, y) 。2.? angle :旋轉角度(順時針為正,單位:度)。3.? scale :縮放因子(1.0表示不縮放)。 |
返回值 | 2×3的仿射變換矩陣(numpy.ndarray ,可直接用于?cv2.warpAffine() )。 |
關鍵特性:
-
旋轉方向:角度為正值時順時針旋轉,負值逆時針旋轉。
-
中心點:旋轉圍繞該點進行,若設為圖像中心則保持旋轉后內容在視野內。
-
縮放:可同時縮放圖像(如?
scale=0.5
?旋轉并縮小一半)。
功能 | 對圖像應用仿射變換(旋轉、平移、縮放、傾斜等線性變換)。 |
參數 | 1.?src :輸入圖像。2.? M :2×3仿射變換矩陣(如?cv2.getRotationMatrix2D() ?生成的矩陣)。3.? dsize :輸出圖像尺寸?(width, height) 。4.? flags (可選):插值方法(如?cv2.INTER_LINEAR )。5.? borderMode (可選):邊界填充方式(如?cv2.BORDER_CONSTANT )。6.? borderValue (可選):填充邊界時的顏色(默認為黑色)。 |
返回值 | 變換后的圖像(numpy.ndarray )。 |
關鍵特性:
-
仿射變換:保持直線和平行性,適用于旋轉、平移、縮放等操作。
-
插值方法:推薦?
cv2.INTER_LINEAR
(平衡速度與質量)或?cv2.INTER_CUBIC
(高質量)。 -
邊界處理:超出原圖范圍的區域默認填充黑色,可通過?
borderValue
?修改(如填充白色)。
21.cv2.flip():
功能 | 對圖像進行翻轉操作(水平、垂直或雙向翻轉)。 |
參數 | 1.?src :輸入圖像。2.? flipCode :翻轉方向控制:?? 0 :垂直翻轉(沿X軸)?? 1 :水平翻轉(沿Y軸)?? -1 :雙向翻轉(先水平后垂直) |
返回值 | 翻轉后的圖像(numpy.ndarray )。 |
關鍵特性:
-
原地操作:不修改原圖,返回新圖像。
-
無插值:直接像素映射,速度極快。
-
多通道支持:彩色圖像(BGR/RGB)也可直接翻轉。
22.cv2.resize():
項目 | 說明 |
---|---|
功能 | 調整圖像尺寸(放大或縮小)。 |
參數 | 1.?src :輸入圖像。2.? dsize :目標尺寸?(width, height) 。3.? fx ,?fy (可選):沿x/y軸的縮放因子(與dsize 二選一)。4.? interpolation (可選):插值方法(默認cv2.INTER_LINEAR )。 |
返回值 | 縮放后的圖像(numpy.ndarray )。 |
常用插值方法:
-
cv2.INTER_NEAREST
:最近鄰(速度快,質量低)。 -
cv2.INTER_LINEAR
:雙線性(默認,平衡速度與質量)。 -
cv2.INTER_CUBIC
:雙三次(高質量,適合放大)。 -
cv2.INTER_AREA
:區域插值(適合縮小)。
注意:
-
dsize
?參數格式為?(寬度, 高度)
,與 numpy 的?(行, 列)
?相反。 -
同時指定?
dsize
?和?fx/fy
?時,dsize
?優先生效。
23.cv2.getPerspectiveTransform():
功能 | 計算?透視變換矩陣(從4個源點映射到4個目標點的3×3變換矩陣)。 |
參數 | 1.?src :源圖像中4個點的坐標(np.float32 格式,形如[[x1,y1],...,[x4,y4]] )。2.? dst :目標圖像中對應的4個點坐標(格式同src )。 |
返回值 | 3×3透視變換矩陣(numpy.ndarray ,用于cv2.warpPerspective() )。 |
關鍵特性
-
點對要求:
-
需要?精確4組對應點(不能多或少)。
-
點順序需一致(如左上、右上、左下、右下)。
-
注意事項
-
輸入點類型:必須是
np.float32
,否則報錯。 -
點順序一致性:若源點與目標點順序不匹配,會導致扭曲異常。
-
與仿射變換區別:透視變換需要4個點(仿射變換僅需3個點)。
24.cv2.warpPerspective():
功能 | 對圖像應用透視變換(將圖像投影到新的視角平面,如傾斜矯正、視角轉換)。 |
參數 | 1.?src :輸入圖像。2.? M :3×3透視變換矩陣(來自cv2.getPerspectiveTransform() )。3.? dsize :輸出圖像尺寸?(width, height) 。4.? flags (可選):插值方法(如?cv2.INTER_LINEAR )。5.? borderMode (可選):邊界填充方式(如?cv2.BORDER_CONSTANT )。6.? borderValue (可選):填充顏色(默認為黑色)。 |
返回值 | 透視變換后的圖像(numpy.ndarray )。 |
核心特性
-
透視變換矩陣
-
需通過?
cv2.getPerspectiveTransform()
?或手動計算得到3×3矩陣。
-
-
插值方法
-
cv2.INTER_LINEAR
(默認):平衡速度與質量。 -
cv2.INTER_CUBIC
:高質量,適合放大。 -
cv2.INTER_NEAREST
:速度快但鋸齒明顯。
-
-
邊界處理
-
默認填充黑色(
borderValue=(0, 0, 0)
),可設置為白色或其他顏色。
-
透視變換練習1:
import cv2
import numpy as npimg = cv2.imread('../images/youhua.png')
cv2.imshow("original image", img)
h, w, _ = img.shape# 源圖像中四個角點
src = np.array([[170, 140],[630, 40],[80, 500],[660, 560]], dtype="float32")# 目標圖像中四個點
dst = np.array([[50, 10],[700, 10],[50, 550],[700, 550]], dtype="float32")# 計算透視變換矩陣
M = cv2.getPerspectiveTransform(src, dst)# 指定背景為白色
per_img = cv2.warpPerspective(img, M, (w, h), borderValue=(255, 255, 255))cv2.imshow("perspective image", per_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
透視變換練習2:
import cv2
import numpy as npimg = cv2.imread('../images/hello.png')
cv2.imshow("original image", img)
h, w, _ = img.shape# 源圖像中四個角點
src = np.float32([[80, 240],[350, 120],[200, 430],[450, 258]])# 目標圖像中四個點
dst = np.float32([[0, 0],[450, 0],[0, 330],[450, 330]
])# 計算透視變換矩陣
M = cv2.getPerspectiveTransform(src, dst)# 指定背景為白色
per_img = cv2.warpPerspective(img, M, (450, 330), borderValue=(255, 255, 255))cv2.imshow("perspective image", per_img)
cv2.waitKey(0)
cv2.destroyAllWindows()