OpenCV实验(2):图像合成

实验要求:
1)现有一张4通道透明图像a.png:
2)从其中提取出alpha通道并显示;
3)用alpha混合,为a.png替换一张新的背景(bg.png)。
实验思路:
1.提4通道的图像要使用cv.imread(’’, cv.IMREAD_UNCHANGED),通过设置后面的这个参数就可以提取4通道,否则只有3通道。
2.显示时,直接将alpha通道的值赋给RGB三通道即可,因为等量混合是黑白的(256种灰度),这也就反映了alpha通道。
3.采用alpha混合算法就很简单了。如果只是根据alpha值,大于0显示a.png,等于0显示bg.png,那么效果不是很好,因为a.png中人物边缘的像素的alpha值很小,这样显示看起来会很粗糙。

实验效果:
OpenCV实验(2):图像合成
OpenCV实验(2):图像合成

OpenCV实验(2):图像合成

实验代码:

import cv2 as cv
import numpy as np

imgSrcA = cv.imread('../images/images1_2/a.png', cv.IMREAD_UNCHANGED)
imgSrcBg = cv.imread('../images/images1_2/bg.png', cv.IMREAD_UNCHANGED)
cv.imshow('alpha src', imgSrcA)

rows, cols, channels = imgSrcA.shape
B, G, R, A = cv.split(imgSrcA)
imgAlpha = np.zeros([rows, cols, 3], dtype='uint8')

for k in range(3):
    imgAlpha[:, :, k] = A[:, :]

cv.imshow('alpha channel', imgAlpha)

# 不包含alpha通道
imgSrcA = cv.imread('../images/images1_2/a.png')

imgMix = np.zeros([rows, cols, 3], dtype='uint8')
for i in range(rows):
    for j in range(cols):
        alpha = A[i][j] / 255
        beta = 1 - alpha
        for k in range(3):
            temp = int(imgSrcA[i, j, k]*alpha + imgSrcBg[i, j, k]*beta)
            if temp > 255:
                imgMix[i, j, k] = 255
            elif temp < 0:
                imgMix[i, j, k] = 0
            else:
                imgMix[i, j, k] = temp

cv.imshow('mixed image', imgMix)
cv.waitKey(0)
cv.destroyAllWindows()
匿名

发表评论

匿名网友