python opencv 影象邊框(填充)新增及影象混合的實現方法(末尾實現類似幻燈片漸變的效果)
阿新 • • 發佈:2020-03-09
影象邊框的實現
影象邊框設計的主要函式
cv.copyMakeBorder()——實現邊框填充
主要引數如下:
- 引數一:源影象——如:讀取的img
- 引數二——引數五分別是:上下左右邊的寬度——單位:畫素
- 引數六:邊框型別:
- cv.BORDER_CONSTANT——cv.BORDER_REPLICATE——cv.BORDER_REFLECT——cv.BORDER_WRAP——cv.BORDER_REFLECT_101——cv.BORDER_TRANSPARENT——cv.BORDER_REFLECT101——cv.BORDER_DEFAULT——cv.BORDER_ISOLATED
- 引數七——只在邊框型別選擇borderType == BORDER_CONSTANT,才設定,意為邊框值
邊框型別的說明:
- BORDER_CONSTANT:意為新增指定顏色的邊框——由value值確定:為list
- 其它引數:(可根據需要調製,不過一般前兩個用的多一些)
程式碼例項
import cv2 as cv import numpy as np if __name__ == "__main__": img = cv.imread('./imag_in_save/open_class.png') cv.namedWindow('imag',cv.WINDOW_NORMAL) cv.resizeWindow('imag',500,500) img = cv.copyMakeBorder(img,20,cv.BORDER_CONSTANT,value=[2,83,13]) # 新增邊框 cv.imshow('imag',img) cv.waitKey(0) cv.destroyAllWindows()
效果
影象混合的實現
影象混合實現的主要函式
cv.addWeighted()——實現影象的混合
它的工作原理採用的是一個簡單權重公式:g(x)=(1−α)f0(x)+αf1(x)
- 第一個引數為一張圖象,緊跟著第二個引數為第一張圖片的權重(0~1)也就是公式裡的(1 - α)
- 第三個引數為另一張需要混合的圖片,同樣的,第四個引數為這張圖片的權重,也就是公式裡的(α)
- 至於第五個引數:每個對應標量的和值——可以設定混合的高光
- 其它兩個引數:(最後的一個引數單獨用的不是很多,在一些其他處理中用的比較多)
- dst輸出陣列,其大小和通道數與輸入陣列相同(我們一般通過直接返回得到~)
- dtype輸出陣列的可選深度;當兩個輸入陣列的深度相同時,可以將dtype設定為-1,這等效於src1.depth()
程式碼例項
import cv2 as cv import numpy as np if __name__ == "__main__": img1 = cv.imread(r'./2.png',1) # 讀取彩色圖片 img2 = cv.imread(r'./3.png',1) cv.namedWindow('imag',cv.WINDOW_NORMAL) # 窗體 img1 = img1[0: 200,0: 400] # 擷取影象的指定部分——因為影象混合需要等大的影象 img2 = img2[0: 200,0: 400] img = cv.addWeighted(img1,0.7,img2,0.3,0) # 混合圖片——根據權重 while True: cv.imshow('imag',img) # 顯示當前序列號圖片 k = cv.waitKey(0) & 0xFF if k == 27: break cv.destroyAllWindows()
效果
小練習(產生類似幻燈片漸變的效果)
主要思路
- 首先準備好一系列等大的圖片或者擷取一系列相同大小的圖片區域作為我們的影象資料
- 然後將影象資訊,分別拼接到一個list列表中
- 然後,實現一張一張圖片的顯示,在交換的間隙,實現漸變的效果——也就是影象混合。
- 然後就可以欣賞了——不過效果的話,主要看設定的引數吧(當然因為沒有渲染,可能還是有些僵硬)。
程式碼示例
我把主要註釋放在程式碼中,邊看邊理解應該不難~
import cv2 as cv import numpy as np if __name__ == "__main__": img_list = [] # 建立一個空序列裝準備顯示的一系列圖片 counts = 0 # 顯示圖片的序號 cv.namedWindow('imag',cv.WINDOW_NORMAL) # 窗體 cv.resizeWindow('imag',500) for i in range(2,7): # 遍歷圖片,憑藉到空陣列中——一共5張 img = cv.imread(f'./imag_in_save/scr/{i}.png') # 用f""實現引數傳入 img = img[0: 200,0: 400] # 擷取影象的指定部分——因為影象混合需要等大的影象 img_list.append(img) # 實現圖片新增 while True: cv.imshow('imag',img_list[counts]) # 顯示當前序列號圖片 k = cv.waitKey(2000) & 0xFF counts += 1 # 迴圈下一張圖片——0,1,2,3,4有效 if counts == 5: # 迴圈到最後一張圖片後返回到第一張圖片 counts = 0 for i in range(0,10): k_f = cv.addWeighted(img_list[counts - 1],1 - (i * 0.1),img_list[counts],i * 0.1,0) # 做類似漸變的影象合成 # 實現兩張(當前圖片和接下來顯示的圖片)圖片,不同權重的混合——由於照片權重改變來實現漸變 cv.imshow('imag',k_f) # 顯示混合的圖片 k = cv.waitKey(120) & 0xFF # 延時和按鍵讀取 if k == 27: # ESC鍵 break if k == 27: break cv.destroyAllWindows()
效果(圖片可能不是很明顯,如有需要可以自己添置幾張圖片實現看看)
總結
到此這篇關於python opencv 影象邊框(填充)新增及影象混合(末尾實現類似幻燈片漸變的效果)的文章就介紹到這了,更多相關opencv 影象邊框填充混合內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!