如何使用Python實現圖像融合及加法運算?

語言: CN / TW / HK
摘要:本篇文章主要講解Python調用OpenCV實現圖像融合及加法運算,包括三部分知識:圖像融合、圖像加法運算、圖像類型轉換。

本文分享自華為雲社區《[Python圖像處理] 五.圖像融合、加法運算及圖像類型轉換》,作者:eastmount。

一.圖像加法運算

1.Numpy庫加法

其運算方法是:目標圖像 = 圖像1 + 圖像2,運算結果進行取模運算。

  1. 當像素值<=255時,結果為“圖像1+圖像2”,例如:120+48=168
  2. 當像素值>255時,結果為對255取模的結果,例如:(255+64)%255=64

2.OpenCV加法運算

另一種方法是直接調用OpenCV庫實現圖像加法運算,方法如下:
目標圖像 = cv2.add(圖像1, 圖像2)

此時結果是飽和運算,即:

  1. 當像素值<=255時,結果為“圖像1+圖像2”,例如:120+48=168
  2. 當像素值>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. 圖像加法:目標圖像 = 圖像1 + 圖像2
  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)

圖像處理通常需要將彩色圖像轉換為灰度圖像再進行後續的操作,更多知識後續將繼續分享,希望對着喜歡,尤其是做圖像識別、圖像處理的同學。

 

點擊關注,第一時間瞭解華為雲新鮮技術~