09 图像混合

09 图像混合

image

9.0 目标

9.1 图片相加

例 9.1.1 图片相加

x = np.uint8([250])
y = np.uint8([10])
print(cv2.add(x, y))  # 250+10 = 260 => 255
print(x + y)  # 250+10 = 260 % 256 = 4

说明 9.1.1

cv2.add() 叠加两张图片, 相加两幅图片的形状 (高度 / 宽度 / 通道数) 必须相同. numpy 中可以直接用 res = img + img1 相加, 但这两者结果并不相同.

如果是二值化图片, 两者结果是一样的 (用 numpy 的方式更简洁一些) .

9.2 图像混合

例 9.2.1

img1 = cv2.imread('lena_small.jpg')
img2 = cv2.imread('opencv-logo-white.png')
res = cv2.addWeighted(img1, 0.6, img2, 0.4, 0)

说明 9.2.1

图像混合 cv2.addWeighted() 也是一种图片相加的操作, 只不过两幅图片的权重不一样, \gamma 相当于一个修正值:
dst = \alpha \times img1 + \beta \times img2+ \gamma
\alpha\beta 都等于 1 时, 就相当于图片相加.

9.3 按位操作

如果将两幅图片直接相加会改变图片的颜色, 如果用图像混合, 则会改变图片的透明度, 所以我们需要用 按位操作 .

例 9.3.1 按位操作

img1 = cv2.imread('lena.jpg')
img2 = cv2.imread('opencv-logo-white.png')

# We only care the upper left corner because we will put the logo in this area
rows, cols = img2.shape[:2]
roi = img1[:rows, :cols]

# Create mask
img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 10, 255, cv2.THRESH_BINARY)
mask_inv = cv2.bitwise_not(mask)

# Keep background except logo
img1_bg = cv2.bitwise_and(roi, roi, mask=mask_inv)
dst = cv2.add(img1_bg, img2)  # Intergration
img1[:rows, :cols] = dst  # Put it on the original image after intergration

说明 9.3.1

按位操作包括按位 与 / 或 / 非 / 异或 操作.

首先了解一下 掩膜 (mask) 的概念: 掩膜是用一副二值化图片对另外一幅图片进行局部的遮挡

掩膜概念

就是把原图中要放目标图片的区域抠出来, 再把目标图片放进去.

TIPS: 掩膜的概念在图像 混合 / 叠加 的场景下使用较多, 多多练习

9.4 小结

  • 叠加图片 cv2.add() , 权重不一样 cv2.addWeighted()
  • 按位操作 与cv2.bitwise_and()cv2.bitwise_not()cv2.bitwise_or() 异或cv2.bitwise_xor() . 掩膜就是用来对图片进行全局或局部的遮挡.
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。