目錄
一、邊界填充(Border Padding)
1. 常見填充類型及效果
2.代碼示例
(1)constant邊界填充,填充指定寬度的像素
(2)REFLECT鏡像邊界填充
(3)REFLECT_101鏡像邊界填充改進
(4)?REPLICATE使用最邊界的像素值代替
?(5)WRAP上下左右邊依次替換
二、閾值處理
1. 常見閾值類型
2. 代碼示例
3.結果分析與參數調整技巧
在 OpenCV 圖像處理中,邊界填充和閾值處理是基礎且常用的操作。邊界填充用于擴展圖像邊緣,閾值處理則通過設定閾值將圖像轉化為二值圖像,便于后續分析。下面詳細介紹這兩項技術。
一、邊界填充(Border Padding)
邊界填充指在圖像邊緣添加像素,常用于卷積操作、圖像拼接等場景,避免邊緣信息丟失。OpenCV 通過cv2.copyMakeBorder()
實現,語法如下:
cv2.copyMakeBorder(src, top, bottom, left, right, borderType, value)
- src:輸入圖像
- top/bottom/left/right:上下左右填充的像素數
- borderType:填充類型(核心參數)
- value:當
borderType=cv2.BORDER_CONSTANT
時的填充值
1. 常見填充類型及效果
2.代碼示例
(1)constant邊界填充,填充指定寬度的像素
import cv2ys = cv2.imread('a.png') # 讀取原圖,每個邊界填充都需要在原圖的基礎上完成,所以在使用時要先讀取原圖,把原圖作為參數傳入下面的方法中
ys = cv2.resize(ys,(300,300)) # 圖片縮放
top, bottom, left, right = 50, 50, 50, 50
constant = cv2.copyMakeBorder(ys, top, bottom, left, right, borderType=cv2.BORDER_CONSTANT, value=(229, 25, 80))
cv2.imshow('yuantu', ys)
cv2.waitKey(0)
cv2.imshow('CONSTANT', constant)
cv2.waitKey(0)
運行效果如下:
(2)REFLECT鏡像邊界填充
原圖代碼與上述相同不再展示,只展示變化部分
reflect = cv2.copyMakeBorder(ys,top,bottom,left,right,borderType=cv2.BORDER_REFLECT)
cv2.imshow('REFLECT', reflect)
cv2.waitKey(0)
運行效果:
(3)REFLECT_101鏡像邊界填充改進
reflect101 = cv2.copyMakeBorder(ys,top,bottom,left,right,borderType=cv2.BORDER_REFLECT101)
cv2.imshow('REFLECT_101', reflect101)
cv2.waitKey(0)
效果:
(4)?REPLICATE使用最邊界的像素值代替
replicate = cv2.copyMakeBorder(ys,top,bottom,left,right,borderType=cv2.BORDER_REPLICATE)
cv2.imshow('REPLICATE', replicate)
cv2.waitKey(0)
效果:
?(5)WRAP上下左右邊依次替換
wrap = cv2.copyMakeBorder(ys,top,bottom,left,right,borderType=cv2.BORDER_WRAP)
cv2.imshow('WRAP', wrap)
cv2.waitKey(0)
效果:
邊界填充是 OpenCV 圖像處理中的基礎操作,掌握不同填充方式的特點和適用場景,有助于提升后續圖像處理(如卷積、特征提取)的效果。本文介紹的 5 種填充方式各有優劣,實際使用時需結合具體業務場景靈活選擇。
二、閾值處理
閾值處理是將灰度圖像轉化為二值圖像的過程:通過設定閾值thresh
,將像素值大于thresh
的設為一個值(如 255),小于的設為另一個值(如 0)。OpenCV 中cv2.threshold()
是核心函數:
ret, dst = cv2.threshold(src, thresh, maxval, type)
- src:輸入圖像(需為單通道灰度圖)
- thresh:閾值(如 127)
- maxval:最大值(當像素超過閾值時賦予的值)
- type:閾值類型(核心參數)
- ret:返回的閾值(與輸入 thresh 一致)
- dst:處理后的圖像
1. 常見閾值類型
圖像通道及表示知識補充:
一張灰色圖片上有許許多多的像素塊,每個像素塊都有一個數值,這個數值的取值范圍時[0 ~ 255],數值越小顏色越暗越黑,數值越大顏色越亮表現為越白。
彩色圖片則有三個通道RGB,針對每一個通道都有一個對應的值,以上面介紹邊界填充的value為例,value=(229,25,80),需要注意,在opencv中通道的順序為BGR,也就是B=229,G=25,R=80.分別是英文的縮寫,藍色(blue)綠色(green)紅色(red).
上面的閾值也是指一個在0~255之間的值。
2. 代碼示例
1.二進制閾值處理
import cv2# 讀取圖像并調整大小
img = cv2.imread('a.png')
img = cv2.resize(img, (400, 400))# 二進制閾值處理: 像素值 > 175 設為255,否則設為0
ret, result = cv2.threshold(img, 175, 255, cv2.THRESH_BINARY)# 顯示原圖和處理結果
cv2.imshow('original', img)
cv2.waitKey(0)
cv2.imshow('binary', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果如下:
2.反二進制閾值處理
import cv2# 讀取圖像并調整大小
img = cv2.imread('a.png')
img = cv2.resize(img, (400, 400))# 反二進制閾值處理: 像素值 > 175 設為0,否則設為255
ret, result = cv2.threshold(img, 175, 255, cv2.THRESH_BINARY_INV)# 顯示原圖和處理結果
cv2.imshow('original', img)
cv2.waitKey(0)
cv2.imshow('binary_inv', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果如下:
3.零閾值處理
import cv2# 讀取圖像并調整大小
img = cv2.imread('a.png')
img = cv2.resize(img, (400, 400))# 零閾值處理: 像素值 > 175 保持原值,否則設為0
ret, result = cv2.threshold(img, 175, 255, cv2.THRESH_TOZERO)# 顯示原圖和處理結果
cv2.imshow('original', img)
cv2.waitKey(0)
cv2.imshow('tozero', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果如下:
4.反零閾值處理
import cv2# 讀取圖像并調整大小
img = cv2.imread('a.png')
img = cv2.resize(img, (400, 400))# 反零閾值處理: 像素值 > 175 設為0,否則保持原值
ret, result = cv2.threshold(img, 175, 255, cv2.THRESH_TOZERO_INV)# 顯示原圖和處理結果
cv2.imshow('original', img)
cv2.waitKey(0)
cv2.imshow('tozero_inv', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果如下:
5.截斷閾值處理
import cv2# 讀取圖像并調整大小
img = cv2.imread('input.png')
img = cv2.resize(img, (400, 400))# 截斷閾值處理: 像素值 > 175 設為175,否則保持原值
ret, result = cv2.threshold(img, 175, 255, cv2.THRESH_TRUNC)# 顯示原圖和處理結果
cv2.imshow('original', img)
cv2.waitKey(0)
cv2.imshow('trunc', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果如下:
3.結果分析與參數調整技巧
-
閾值選擇的影響:
- 閾值過高(如 180):可能丟失目標細節,暗區域過大
- 閾值過低(如 50):可能保留過多噪聲,目標與背景混淆
- 建議:通過觀察圖像直方圖(
cv2.calcHist()
)確定合適閾值
-
彩色圖 vs 灰度圖:
- 直接對彩色圖處理時,閾值會分別作用于 B、G、R 三個通道,可能導致顏色失真
- 推薦先轉為灰度圖(
cv2.COLOR_BGR2GRAY
),再進行閾值處理,效果更穩定
? ? ?3.適用場景總結:
閾值處理是圖像處理中的基礎工具,掌握 5 種常用閾值類型的特點和適用場景,能幫助我們快速簡化圖像、突出目標。實際應用中,需根據圖像特點(如光照、對比度)選擇合適的閾值類型和參數,必要時結合自適應閾值提升效果。