webpack4.0各個擊破(3)—— Assets篇
1694
2025-04-02
今天的學習的內容是:通過 Python OpenCV 對圖像實現疊加操作,本文只涉及一個函數,即cv2.addWeighted。
cv2.addWeighted
該函數的完整表述為:Python-OpenCV 圖像疊加 or 圖像混合加權實現。
函數原型如下:
dst = cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]])
參數說明(哈哈,這是官方的,點擊打開官方說明):
src1 – first input array.
alpha – weight of the first array elements.
src2 – second input array of the same size and channel number as src1.
beta – weight of the second array elements.
dst – output array that has the same size and number of channels as the input arrays.
gamma – scalar added to each sum.
dtype – optional depth of the output array; when both input arrays have the same depth, dtype can be set to -1, which will be equivalent to src1.depth().
參數翻譯如下:
src1, src2:需要融合疊加的兩副圖像,要求大小和通道數相等
alpha:src1 的權重
beta:src2 的權重
gamma:gamma 修正系數,不需要修正設置為 0
dst:可選參數,輸出結果保存的變量,默認值為 None
dtype:可選參數,輸出圖像數組的深度,即圖像單個像素值的位數(如 RGB 用三個字節表示,則為 24 位),選默認值 None 表示與源圖像保持一致。
返回值:融合疊加的結果圖像
官方手冊也給出了最終的結果:
dst = src1 × alpha + src2 × beta + gamma;
上面的式子理解為,結果圖像 = 圖像 1× 系數 1+圖像 2× 系數 2+亮度調節量
測試代碼如下:
import cv2 as cv src1 = cv.imread("./123.jpg") src2 = cv.imread("./456.png") c = cv.addWeighted(src1, 0.4, src2, 0.6, 0) cv.imshow("addWeighted", c) cv.waitKey(0)
運行之后疊加出的效果圖如下:
如果兩個圖片的尺寸不同,可以手動調整,也可以通過 resize 進行調整。
img2 = cv2.resize(img, (w,h), interpolation=cv2.INTER_AREA)
在檢索資料的時候發現了另一個好玩的函數,即 createTrackbar,可以創建一個滾動條,我們也同時學習一下吧。
cv2.createTrackbar
該函數的作用是在 opencv 使用滑動條,函數原型如下:
cv2.createTrackbar(trackbarName, windowName, value, count, onChange)
參數說明:
trackbarName:滑動條的名字;
windowName:滑動條被放置的窗口的名字;
value:滑動條默認值;
count:滑動條的調節的范圍(0~count);
onChange:調節滑動條時調用的回調函數名。
與此對應的還有一個獲取滑動條值的函數,原型是:
value = cv2.getTrackbarPos(trackbarName, windowName)
參數說明:
trackbarName:滑動條的名字;
windowName:滑動條被放置窗口的名字。
返回值:滑動條的數值
測試代碼如下(拖動滑動條,實現圖片的漸變):
import cv2 as cv import numpy as np src1 = cv.imread("./123.jpg") src2 = cv.imread("./456.png") # 滾動條拖動 def on_change(x): pass # 創建一個黑色背景的窗口,大小任意,后面會被修改 img = np.zeros((100, 100, 3), np.uint8) cv.namedWindow("img") cv.createTrackbar("a", "img", 0, 100, on_change) while(1): cv.imshow("img", img) # 按鍵盤上的 esc 退出。 k = cv.waitKey(1) & 0xFF if k == 27: break # 獲取滑動條的值 r = cv.getTrackbarPos('a', "img") # 設置系數 print(r) r = float(r)/100.0 # 默認情況下 src1 完全展示,逐步過渡到 src2 img = cv.addWeighted(src1, r, src2, 1.0-r, 0) cv.destroyAllWindows()
運行效果如下圖所示。
還找到了一個漸變效果,不需要拖動滑動條也可以實現圖片切換。
import cv2 import numpy as np step_list = [float(0.02 * x) for x in range(0, 51)] print(step_list) img1 = cv2.imread("./123.jpg") img2 = cv2.imread("./456.png") cv2.imshow("show", img1) for i in step_list: res = cv2.addWeighted(img1, i, img2, (1-i), 0) cv2.imshow("show", res) cv2.waitKey(60) if cv2.waitKey(0) == 27: cv2.destroyAllWindows()
運行結果自行找兩張相同大小的圖片進行嘗試吧。
OpenCV 尾聲
1 個小時又過去了,對 Python OpenCV 相關的知識點,你掌握了嗎?
空閑之余,可以訂閱橡皮擦的爬蟲百例課程學習爬蟲知識。
今天是持續寫作的第
55
/ 100 天。
如果你有想要交流的想法、技術,歡迎在評論區留言。
博主 ID:夢想橡皮擦,希望大家
、
評論
、
。
【百變AI秀】有獎征文火熱進行中:https://bbs.huaweicloud.com/blogs/296704
OpenCV Python 圖像處理
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。