栗子:
有以下两张图片:原图、原图对应的mask。
目的:过滤掉背景、留下前景。
原图:
mask:
利用opencv过滤掉背景、只留下前景的结果:
实现代码:
import os
import cv2
import numpy as np
images_path = './Artic_Tern_0056_141858.jpg'#原图路径
masks_path = './Artic_Tern_0056_141858_mask.png'#原图对应mask路径
img = cv2.imread(images_path)# mask是.png格式的,image是.jpg格式的
print(type(img))
print(img.shape)
mask = cv2.imread(masks_path, 0) # “0”表示将mask以二值图像形式读取、以灰度值“1”读取会导致后面提取前景出错、原因是灰度图的通道数为3
print(type(mask))
print(mask.shape)
masked = cv2.add(img, np.zeros(np.shape(img), dtype=np.uint8), mask=mask) #观察中间的size输出结果,就可得到满足此行代码的输入img、mask条件
print(masked.shape)
#将image的相素值和mask像素值相加得到结果
cv2.imwrite("masked.png", masked)
注意输出的中间结果:
批量操作、只需要给出原图与mask路径、提取后的前景图片保存的路径即可:
import os
import cv2
import numpy as np
def add_mask2image_binary(images_path, masks_path, masked_path):
# Add binary masks to images
for img_item in os.listdir(images_path):
img_path = os.path.join(images_path, img_item)
img = cv2.imread(img_path)
mask_path = os.path.join(masks_path, img_item[:-4]+'.png') # mask是.png格式的,image是.jpg格式的
mask = cv2.imread(mask_path, 0) # 将mask以二值图像形式读取
#将image的相素值和mask像素值相加得到结果
masked = cv2.add(img, np.zeros(np.shape(img), dtype=np.uint8), mask=mask)
cv2.imwrite(os.path.join(masked_path, img_item), masked)
images_path = 'D:\\BaiduNetdiskDownload\\cub_mask\\cub_mask\\cub_200\\Image'
masks_path = 'D:\\BaiduNetdiskDownload\\cub_mask\\cub_mask\\cub_200_mask\\duts'
masked_path = 'D:\\BaiduNetdiskDownload\\cub_mask\\cub_mask\\results_0'
add_mask2image_binary(images_path, masks_path, masked_path)