根据 mask 标签(跟原图一样大小的二值图),1)把 mask(cv2.addWeighted
) 画在原图上,2)把 mask 轮廓(cv2.findContours
)画在原图上
【1】 cv2.addWeighted
来自 Python-OpenCV 图像叠加or图像混合加权(cv2.addWeighted)
import numpy as np
img1 = cv2.imread("/home/Downloads/cat.jpg")
img2 = cv2.imread("/home/Downloads/1.bmp") # 颜色通道顺序为 BGR
img2[:,:,0] *= 0 # 蓝色通道为0
img2[:,:,1] *= 0 # 绿色通道为0
img2[:,:,2] *= 1 # 保留红色通道
imgadd = cv2.addWeighted(img1,1,img2,0.5,0) # 原图权重1,mask 权重 0.5(调透明度)
cv2.imshow("image",imgadd)
cv2.waitKey(3000)
1.bmp
cat.jpg
效果图如下
【2】cv2.findContours
import cv2
import numpy as np
img1 = cv2.imread("/home/yanmeng/Downloads/cat.jpg")
img2 = cv2.imread("/home/yanmeng/Downloads/1.bmp") # BGR
gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) # 彩色图变灰度图
_,binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY) # 灰度图变二值图
_, contours, _ = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 根据二值图找轮廓
cv2.drawContours(img1,contours,-1,(0,0,255),3) # 把轮廓画在原图上(0,0,255) 表示 RGB 三通道,红色
cv2.imshow("image",img1) # 显示原图
cv2.waitKey(3000)
注意 cv2.findContours
的返回值个数可能因 opencv 版本不同而不一样,我的版本是三个返回值,有的版本是两个
效果图如下
我们把其他的 mask 的轮廓也都画在原图上,有 1.bmp~4.bmp
import cv2
def bgr2binary(image): # 彩色转二值
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
return binary
binarys = []
img = cv2.imread("/home/yanmeng/Downloads/cat.jpg") # 原图
for i in range(1,5): # 遍历 mask 图片
mask_path = "/home/yanmeng/Downloads/{}.bmp".format(str(i))
mask = cv2.imread(mask_path)
binarys.append(bgr2binary(mask)) # 读 mask 并转换为二值图
for binary_mask in binarys: # 遍历二值化后的 mask
_, contours, _ = cv2.findContours(binary_mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 找轮廓,并用红色标记出来
cv2.drawContours(img,contours,-1,(0,0,255),3) # 把轮廓画在原图上
cv2.imshow("image",img) # 显示原图
cv2.waitKey(3000)
mask 具体形式如下所示
2.bmp
3.bmp
4.bmp
最终效果图