Opencv学习(一)按位操作

学习opencv的按位操作时对代码的理解

下面是两张素材
Opencv学习(一)按位操作_第1张图片Opencv学习(一)按位操作_第2张图片
这是最后结果
Opencv学习(一)按位操作_第3张图片

下面是代码

import cv2
import numpy as np

#按位运算 
# Load two images
img2 = cv2.imread('6.jpg')
img1 = cv2.imread('2.jpg')
# 创建大图切割区域roi, 区域大小为logo的大小
rows,cols,channels = img2.shape
roi = img1[0:rows, 0:cols ]
cv2.namedWindow("roi",0)
cv2.imshow("roi",roi)

Opencv学习(一)按位操作_第4张图片

# 创建一个图片,把logo变成灰度图
img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
#固定阈值二值化,把图变成非黑即白的黑白图 mask是得到的黑白掩模
ret, mask = cv2.threshold(img2gray, 200, 255, cv2.THRESH_BINARY)
cv2.namedWindow("mask",0)
cv2.imshow("mask",des)

Opencv学习(一)按位操作_第5张图片
按位与操作, 因为黑色是0 ,白色是255 。所以,掩模mask,roi在与操作以后,新图img1_bg掩模黑色的部分全部变成黑色;白色的部分全部变成roi

#  得到彩色底 黑色logo图
img1_bg = cv2.bitwise_and(roi,roi,mask = mask)
cv2.namedWindow("1+mask=img1_bg",0)
cv2.imshow("1+mask=img1_bg",img1_bg)

Opencv学习(一)按位操作_第6张图片

#得到一张mask_inv 反黑白掩模图
mask_inv = cv2.bitwise_not(des)
cv2.namedWindow("mask_inv",0)
cv2.imshow("mask_inv",mask_inv)

Opencv学习(一)按位操作_第7张图片
logo和inv_mask进行与操作

# 下面得到黑底彩色logo图
cv2.namedWindow("img2",0)
cv2.imshow("img2",img2)
img2_fg = cv2.bitwise_and(img2,img2,mask = mask_inv)
cv2.namedWindow("2+mask_inv=img2_fg",0)
cv2.imshow("2+mask_inv=img2_fg",img2_fg)

Opencv学习(一)按位操作_第8张图片
下面是add操作 。因为黑色是0,所以 img1_bg的黑色部分,全部变成img2_fg相应的部分。img2_fg的黑色部分,全部变成img1_bg相应的部分。
得到的dst 大小是原来roi的大小

dst = cv2.add(img1_bg,img2_fg)
cv2.namedWindow("dst",0)
cv2.imshow('dst',dst)

Opencv学习(一)按位操作_第9张图片
然后,把这张小图替换到大图相应的位置

img1[0:rows, 0:cols ] = dst
cv2.namedWindow("res",0)
cv2.imshow('res',img1)

Opencv学习(一)按位操作_第10张图片
总结一下就是:
掩模mask 与 roi = img1_bg (img2大小,logo部分为黑色的图)
反掩模inv_mask 与 img2 = img2_fg(img2大小,除彩色logo部分外均为黑色的图)
img1_bg + img2_fg = dst(img2大小,有彩色logo的图)
最后,原图中某部分替换为dst得到新图res

你可能感兴趣的:(opencv学习)