iT邦幫忙

2024 iThome 鐵人賽

DAY 26
0
Python

探索 Python 世界:從語法基礎到圖像魔法系列 第 26

探索 Python 世界:從語法基礎到圖像魔法 Day26

  • 分享至 

  • xImage
  •  

OpenCV 影像疊加

影像疊加

影像疊加在圖像處理中非常實用,可以用於圖像融合、添加水印、背景替換等

常用函數介紹

  • cv2.addWeighted(scr1, alpha, src2, beta, gamma)
    對兩幅圖像進行加權和,適用於混合和合成圖片

    1. scr1 為第一幅圖像輸入,alqha 為第一幅圖像權重
    2. scr2 為第二幅圖像輸入,必須與 src1 尺寸和類型相同;beta 為第二幅圖像權重
    3. gamma 為加到每個像素上的一個標量值,這可以調整整個圖像的亮度或對比度(若設為正值可以使圖像變亮,設為負值則會使圖像變暗)
  • cv2.add(src1, src2)
    兩圖像逐象素相加(將兩幅圖像中對應位置的像素值相加,形成一個新的圖像)

  • cv2.subtract(src1, src2)
    兩圖像逐象素相減(用來強調圖像之間的差異,或是去除背景圖像等)

函數應用

cv2.addWeighted()

使用 addWeighted 疊加影像,需要大小一致的兩圖,因此這邊我做了一個判斷,確認兩圖大小是否一致,若一致才會使用 addWeighted 否則會先使用 cv2.resize 使兩圖大小相同

程式內容:

import cv2

img1 = cv2.imread('bird.jpg')
img2 = cv2.imread('sea.jpg')

# 取得兩圖片大小
height1, width1 = img1.shape[:2]
height2, width2 = img2.shape[:2]

# 判斷兩張圖片的尺寸是否一致
if (height1, width1) != (height2, width2):
    # 將小圖片調整與大圖大小相符
    if width1 * height1 > width2 * height2:
        img2 = cv2.resize(img2, (width1, height1))
    else:
        img1 = cv2.resize(img1, (width2, height2))

# 判斷條件(兩圖大小是否相同)是否為真,若不為真顯示圖片大小不同
assert img1.shape[:2] == img2.shape[:2], "Images sizes do not match."

# 設定兩圖加權值,並將疊加結果存入 blended_img
alpha = 0.5 
beta = 0.5   
blended_img = cv2.addWeighted(img1, alpha, img2, beta, 0)

cv2.imshow('Blended Image', blended_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

執行結果:
https://ithelp.ithome.com.tw/upload/images/20241004/20168687pHkMgPpEGC.png

cv2.add()

將兩幅圖像中對應位置的像素值相加,形成一個新的圖像

程式內容:

import cv2
import numpy as np

img1 = cv2.imread('bird.jpg')
img2 = cv2.imread('sea.jpg')

img1 = cv2.resize(img1, (300, 300))
img2 = cv2.resize(img2, (300, 300))

a = cv2.add(img1, img2)

cv2.imshow('Image 1', img1)
cv2.imshow('Image 2', img2)
cv2.imshow('Image 3', a)
cv2.waitKey(0)

執行結果:
https://ithelp.ithome.com.tw/upload/images/20241003/20168687sAfzlWejIg.png

cv2.subtract()

程式內容:

import cv2
import numpy as np

img1 = cv2.imread('bird.jpg')
img2 = cv2.imread('difference.jpg')

# 將兩圖大小直接指定成 300x300 避免不必要的錯誤產生
img1 = cv2.resize(img1, (300, 300))
img2 = cv2.resize(img2, (300, 300))

difference = cv2.subtract(img2, img1)

cv2.imshow('Image 1', img1)
cv2.imshow('Image 2', img2)
cv2.imshow('Difference', difference)
cv2.waitKey(0)

執行結果:
https://ithelp.ithome.com.tw/upload/images/20241003/20168687QHyXD5sxjX.png

圖片來源:
https://pixabay.com/

參考資料:
https://docs.opencv.org/4.x/index.html

https://steam.oxxostudio.tw/category/python/ai/opencv-add.html#google_vignette


上一篇
探索 Python 世界:從語法基礎到圖像魔法 Day25
下一篇
探索 Python 世界:從語法基礎到圖像魔法 Day27
系列文
探索 Python 世界:從語法基礎到圖像魔法30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言