圖像運算詳解:加法運算與加權運算
在數字圖像處理中,圖像運算是基礎且常用的操作之一。它能夠對兩幅圖像或圖像與常數進行加減乘除,從而實現亮度調整、融合疊加、特效制作等功能。本文將重點介紹 OpenCV 中的圖像加法運算與加權運算,包括它們的底層規則與區別。
?先準備兩張圖片:
1. 圖像加法運算
圖像加法運算可以用兩種方式實現:
直接使用
+
號運算符使用
cv2.add()
函數
雖然它們的寫法類似,但處理結果有差異。
+
號運算規則(NumPy 方式)
當使用 +
對兩個圖像的像素進行加法時,遵循 取模(mod 256)規則:
如果某個像素位置的兩個值相加后 小于 255,則結果等于它們的和;
如果某個像素位置的兩個值相加后 大于 255,結果會被截斷,并對 256 取模,例如:
250 + 10 = 260 → 260 - 256 = 4即:260 → 4
代碼示例:
import cv2a = cv2.imread('penguin.jpg')
c = a + 10 # 整體亮度+10
cv2.imshow('a+10', c)
cv2.waitKey(0)
特點:
會產生“回繞”現象(高亮區域變暗)。
結果:
2?cv2.add()運算
原理:
cv2.add()
是 OpenCV 提供的逐像素加法運算函數,用于將兩幅圖像或圖像與常數進行加法處理。
在數學上,它實現的是:
當使用 cv2.add()
時,規則不同:
如果相加結果 小于 255,則直接為相加之和;
如果相加結果 大于 255,則直接 飽和為 255(不會回繞)。
主要特性
逐像素加法
對圖像中每個像素點分別計算
src1_pixel + src2_pixel
。適用于單通道(灰度)和多通道(BGR、RGBA)圖像。
飽和運算(Saturation Arithmetic)
如果加法結果大于 255,則直接設為 255。
不會出現
+
號運算那種 取模回繞 現象。這保證了圖像亮度不會出現意外變暗。
支持圖像與常數相加
如果要整體調亮,可以加上一個常數矩陣,常數會廣播到每個像素。
基本語法
dst = cv2.add(src1, src2, dtype=None, mask=None)
參數說明:
src1, src2
輸入的兩幅圖像(大小、通道數必須一致),也可以是常數矩陣。dtype
可選,輸出圖像的數據類型;若為None
則和輸入相同。mask
可選掩膜,只在掩膜為非零的區域執行加法,其余區域保持原值。
代碼示例:
d = a[0:500,500:1000]+b[0:500,0:500]
e = cv2.add(a[0:500,500:1000],b[0:500,0:500]) # 使用 cv2.add()
cv2.imshow('a+b',d)
cv2.imshow('add(a,b)',e)
cv2.waitKey(0)
切割:
[0:500, 500:1000]表示數組切片,選取圖像的某個矩形區域。
0:500
→ 高度方向(y 軸):從第 0 行到第 499 行(共 500 行)500:1000
→ 寬度方向(x 軸):從第 500 列到第 999 列(共 500 列)
結果:
解析:([255,255,255]為白色)
a+b的結果圖片像素數值會回繞
add(a,b)則會飽和到255
2. cv2.addWeighted()圖像加權運算
有時我們需要將兩幅圖像按比例融合,而不是簡單相加。這時就可以使用 加權和 公式:
α(alpha):第一幅圖像的權重
β(beta):第二幅圖像的權重
γ(gamma):亮度偏移值(常數)
基本語法
dst = cv2.addWeighted(src1, alpha, src2, beta, gamma)
參數說明
參數 | 說明 |
---|---|
src1 | 第一張輸入圖像(矩陣) |
alpha | 第一張圖像的權重系數 |
src2 | 第二張輸入圖像(矩陣),大小、通道必須與 src1 相同 |
beta | 第二張圖像的權重系數 |
gamma | 亮度調整常數,直接加到最終結果上 |
代碼示例:
a = cv2.resize(a, (800, 600))
b = cv2.resize(b, (800, 600))# α = 0.6, β = 0.4, γ = 10
f = cv2.addWeighted(a, 0.6, b, 0.4, 10)
cv2.imshow('addWeighted', f)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果:
0.6 和 0.4 表示 a 圖像占 60%,b 圖像占 40%。
γ = 10 表示整體亮度提升 10。
3. 三種方式對比
方法 | 溢出處理方式 | 應用場景 |
---|---|---|
+ (NumPy) | 取模(回繞) | 特殊視覺效果、循環色彩變換 |
cv2.add() | 飽和到 255 | 普通加法、避免溢出 |
cv2.addWeighted() | 飽和到 255(帶權重和亮度調節) | 圖像融合、透明度調整 |
4. 注意事項
兩幅圖像必須 大小相同、通道數一致,否則需先使用
cv2.resize()
統一尺寸。如果僅調整亮度,
cv2.convertScaleAbs()
也可以實現,更快更安全。加權運算的 α 與 β 不一定要加起來等于 1,但一般這樣可以避免過度曝光。
5. 應用實例
圖像融合:將兩張風景圖柔和地合成一張。
特效制作:用 NumPy 加法制造像素回繞的炫彩效果。
亮度調節:用
cv2.addWeighted()
調節透明度和亮度。