如何使用Python實現影象融合及加法運算?
摘要:本篇文章主要講解Python呼叫OpenCV實現影象融合及加法運算,包括三部分知識:影象融合、影象加法運算、影象型別轉換。
本文分享自華為雲社群《[Python影象處理] 五.影象融合、加法運算及影象型別轉換》,作者:eastmount。
一.影象加法運算
1.Numpy庫加法
其運算方法是:目標影象 = 影象1 + 影象2,運算結果進行取模運算。
- 當畫素值<=255時,結果為“影象1+影象2”,例如:120+48=168
- 當畫素值>255時,結果為對255取模的結果,例如:(255+64)%255=64
2.OpenCV加法運算
另一種方法是直接呼叫OpenCV庫實現影象加法運算,方法如下:
目標影象 = cv2.add(影象1, 影象2)
此時結果是飽和運算,即:
- 當畫素值<=255時,結果為“影象1+影象2”,例如:120+48=168
- 當畫素值>255時,結果為255,例如:(255+64) = 255
兩種方法對應的程式碼如下所示:
#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt
#讀取圖片
img = cv2.imread('picture.bmp')
test = img
#方法一:Numpy加法運算
result1 = img + test
#方法二:OpenCV加法運算
result2 = cv2.add(img, test)
#顯示影象
cv2.imshow("original", img)
cv2.imshow("result1", result1)
cv2.imshow("result2", result2)
#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()
輸出結果如下圖所示,其中result1為第一種方法,result2為第二種方法,白色點255更多。
注意:參與運算的影象大小和型別必須一致。下面是對彩色影象進行加法運算的結果。
二.影象融合
影象融合通常是指將2張或2張以上的影象資訊融合到1張影象上,融合的影象含有更多的資訊,能夠更方便人們觀察或計算機處理。如下圖所示,將兩張不清晰的影象融合得到更清晰的圖。
影象融合是在影象加法的基礎上增加了係數和亮度調節量。
- 影象加法:目標影象 = 影象1 + 影象2
- 影象融合:目標影象 = 影象1 * 係數1 + 影象2 * 係數2 + 亮度調節量
主要呼叫的函式是addWeighted,方法如下:
dst = cv2.addWeighter(scr1, alpha, src2, beta, gamma)
dst = src1 * alpha + src2 * beta + gamma
其中引數gamma不能省略。
程式碼如下:
#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt
#讀取圖片
src1 = cv2.imread('test22.jpg')
src2 = cv2.imread('picture.bmp')
#影象融合
result = cv2.addWeighted(src1, 1, src2, 1, 0)
#顯示影象
cv2.imshow("src1", src1)
cv2.imshow("src2", src2)
cv2.imshow("result", result)
#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()
需要注意的是,兩張融合的影象畫素大小需要一致,如下圖所示,將兩張RGB且畫素410*410的影象融合。
設定不同的比例的融合如下所示:
result = cv2.addWeighted(src1, 0.6, src2, 0.8, 10)
三.影象型別轉換
影象型別轉換是指將一種型別轉換為另一種型別,比如彩色影象轉換為灰度影象、BGR影象轉換為RGB影象。OPenCV提供了200多種不同型別之間的轉換,其中最常用的包括3類,如下:
- cv2.COLOR_BGR2GRAY
- cv2.COLOR_BGR2RGB
- cv2.COLOR_GRAY2BGR
程式碼如下所示:
#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt
#讀取圖片
src = cv2.imread('01.bmp')
#影象型別轉換
result = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
#顯示影象
cv2.imshow("src", src)
cv2.imshow("result", result)
#等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()
輸出結果如下圖所示:
如果使用通道轉化,則結果如下圖所示:
result = cv2.cvtColor(src, cv2.COLOR_BGR2RGB)
影象處理通常需要將彩色影象轉換為灰度影象再進行後續的操作,更多知識後續將繼續分享,希望對著喜歡,尤其是做影象識別、影象處理的同學。
- 帶你掌握 C 中三種類成員初始化方式
- 實踐GoF的設計模式:工廠方法模式
- DCM:一個能夠改善所有應用資料互動場景的中介軟體新秀
- 手繪圖解java類載入原理
- 關於加密通道規範,你真正用的是TLS,而非SSL
- 程式碼重構,真的只有複雜化一條路嗎?
- 解讀分散式排程平臺Airflow在華為雲MRS中的實踐
- 透過例項demo帶你認識gRPC
- 帶你聚焦GaussDB(DWS)儲存時遊標使用
- 傳統到敏捷的轉型中,誰更適合做Scrum Master?
- 輕鬆解決研發知識管理難題
- Java中觀察者模式與委託,還在傻傻分不清
- 如何使用Python實現影象融合及加法運算?
- 什麼是強化學習?
- 探索開源工作流引擎Azkaban在MRS中的實踐
- GaussDB(DWS) NOT IN優化技術解密:排他分析場景400倍效能提升
- Java中觀察者模式與委託,還在傻傻分不清
- Java中的執行緒到底有哪些安全策略
- 一圖詳解java-class類檔案原理
- Java中的執行緒到底有哪些安全策略