OpenCV copyMakeBorder()
圖像邊界擴展詳解與實戰
在圖像處理和計算機視覺中,有時需要在原始圖像的四周增加邊界(Padding)。這種操作在很多場景中都有應用,比如:
卷積神經網絡(CNN)中的圖像預處理
為圖像添加裝飾性邊框
保證濾波、卷積等操作不會丟失邊緣信息
OpenCV 提供了一個非常方便的函數 cv2.copyMakeBorder()
來實現邊界擴展。
1. copyMakeBorder()
函數原型
cv2.copyMakeBorder()是OpenCV庫中的一個函數,用于給圖像添加額外的邊界(padding)。
dst = cv2.copyMakeBorder(src, top, bottom, left, right, borderType[, value])
參數說明
參數 | 含義 |
---|---|
src | 原始圖像 |
top, bottom, left, right | 上、下、左、右四個方向的邊界寬度(單位:像素) |
borderType | 邊界類型(見下文詳解) |
value | 當 borderType=cv2.BORDER_CONSTANT 時,需要指定填充的顏色(BGR 格式) |
2. 常用 borderType
類型
OpenCV 提供了多種擴展方式,不同方式在邊緣處理時會有不同效果。
cv2.BORDER_CONSTANT
用固定顏色填充邊界。
需要額外指定
value
參數,例如(0, 0, 255)
代表紅色。適合純色邊框的效果。
cv2.BORDER_REFLECT
鏡像反射邊界,邊界像素會被復制。
模式類似:
321|123456789|987
cv2.BORDER_REFLECT_101
或cv2.BORDER_REFLECT101
也是鏡像反射,但不復制邊界像素本身。
模式類似:
432|123456789|876
cv2.BORDER_REPLICATE
使用邊界像素重復填充。
模式類似:
111|123456789|999
cv2.BORDER_WRAP
邊界使用圖像另一側的像素包裹。
模式類似:
789|123456789|123
3. 示例代碼
下面的示例會分別展示 5 種 borderType
效果,方便直觀對比。
import cv2# 讀取圖片
img = cv2.imread('lyf.jpg')# 調整圖片大小
img = cv2.resize(img, (500, 500))# 設置邊界寬度
top, bottom, left, right = 100, 100, 100, 100# 1. 設置顏色邊界(紅色)
constant = cv2.copyMakeBorder(img, top, bottom, left, right,borderType=cv2.BORDER_CONSTANT, value=(0, 0, 255))# 2. 鏡像反射(復制邊界像素)
reflect = cv2.copyMakeBorder(img, top, bottom, left, right, borderType=cv2.BORDER_REFLECT)# 3. 鏡像反射(不復制邊界像素)
reflect101 = cv2.copyMakeBorder(img, top, bottom, left, right, borderType=cv2.BORDER_REFLECT101)# 4. 重復邊界像素
replicate = cv2.copyMakeBorder(img, top, bottom, left, right, borderType=cv2.BORDER_REPLICATE)# 5. 包裹方式
wrap = cv2.copyMakeBorder(img, top, bottom, left, right, borderType=cv2.BORDER_WRAP)# 顯示結果
cv2.imshow('Original', img)
cv2.imshow('BORDER_CONSTANT', constant)
cv2.imshow('BORDER_REFLECT', reflect)
cv2.imshow('BORDER_REFLECT101', reflect101)
cv2.imshow('BORDER_REPLICATE', replicate)
cv2.imshow('BORDER_WRAP', wrap)cv2.waitKey(0)
cv2.destroyAllWindows()
4. 運行效果示意
原圖:lyf.jpg
BORDER_CONSTANT
BORDER_REFLECT
BORDER_REFLECT101
BORDER_REPLICATE
BORDER_WRAP
類型 | 效果描述 |
---|---|
BORDER_CONSTANT | 邊界為純紅色(示例中是 (0,0,255) ) |
BORDER_REFLECT | 邊界為鏡像反射,邊緣處像素被復制 |
BORDER_REFLECT101 | 邊界為鏡像反射,去掉邊緣像素自身 |
BORDER_REPLICATE | 邊界像素直接復制填充 |
BORDER_WRAP | 邊界使用對面邊的像素包裹 |
5.應用場景案例
多給幾個真實案例,讀者會立刻想到怎么用:
圖像邊框美化 → 用
BORDER_CONSTANT
做彩色相框。深度學習數據增強 → 隨機 padding 后再裁剪。
全景圖拼接 → 避免拼接縫隙處出現黑邊。
濾波降噪 → 用鏡像 padding 防止邊緣模糊不均。
6. 小結
cv2.copyMakeBorder()
是一個簡單而強大的函數,可以在圖像四周添加不同類型的邊界。
在實際應用中:
圖像卷積/濾波前 → 推薦
BORDER_REFLECT
或BORDER_REFLECT101
,能保留邊緣信息。美化圖片 → 推薦
BORDER_CONSTANT
,可指定任意顏色作為相框。特殊視覺效果 → 可嘗試
BORDER_WRAP
。
掌握它之后,你不僅能做圖像邊界填充,還能理解很多計算機視覺算法在“邊緣處理”時的邏輯。