我只想用另一個 png 影像覆寫一個 png 影像,cv2.imshow得到正確的結果,cv2.imwrite得到奇怪的結果。
coverImg = cv2.imread('./images/cover.png', cv2.IMREAD_UNCHANGED)
back = cv2.imread('./images/back.png', cv2.IMREAD_UNCHANGED)
x_offset = y_offset = 0
y1, y2 = y_offset, y_offset coverImg.shape[0]
x1, x2 = x_offset, x_offset coverImg.shape[1]
alpha_s = coverImg[:, :, 3] / 255.0
alpha_l = 1.0 - alpha_s
result = back.copy()
for c in range(0, 3):
result[y1:y2, x1:x2, c] = (alpha_s * coverImg[y1:y2, x1:x2, c]
alpha_l * result[y1:y2, x1:x2, c])
cv2.imshow("result", result)
res2 = cv2.imwrite("./result.png", result)
result.dtype是uint8
顯示:

輸入:

我的背.png

我的封面.png

uj5u.com熱心網友回復:
出現此問題是因為您正在修改作為 BGRA 加載的原始背景影像的副本,但不修改結果的 alpha 通道。由于背景影像大部分是透明的(除了陰影),所以當通過支持 alpha 的東西查看時,結果也是如此。
要解決此問題并保持結果部分透明(在適當的情況下),您還需要合并 alpha 通道。由于alpha=0意味著完全透明,alpha=255意味著完全不透明,我們的目標是保留兩個影像的不透明部分,讓我們max(foreground_alpha, background_alpha)對每個像素進行處理。這可以通過以下方式完成np.maximum:
result[y1:y2, x1:x2, 3] = np.maximum(coverImg[y1:y2, x1:x2, 3], back[y1:y2, x1:x2, 3])
完整的腳本(添加了匯入和呼叫cv2.waitKey):
import cv2
import numpy as np
coverImg = cv2.imread('front.png', cv2.IMREAD_UNCHANGED)
back = cv2.imread('back.png', cv2.IMREAD_UNCHANGED)
x_offset = y_offset = 0
y1, y2 = y_offset, y_offset coverImg.shape[0]
x1, x2 = x_offset, x_offset coverImg.shape[1]
alpha_s = coverImg[:, :, 3] / 255.0
alpha_l = 1.0 - alpha_s
result = back.copy()
for c in range(0, 3):
result[y1:y2, x1:x2, c] = (alpha_s * coverImg[y1:y2, x1:x2, c]
alpha_l * result[y1:y2, x1:x2, c])
result[y1:y2, x1:x2, 3] = np.maximum(coverImg[y1:y2, x1:x2, 3], back[y1:y2, x1:x2, 3])
cv2.imshow("result", result)
cv2.waitKey()
res2 = cv2.imwrite("result.png", result)
這會產生:

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/535513.html
標籤:Python打开简历
