从Image OpenCV Python移除遮罩

时间:2019-04-10 17:21:47

标签: python opencv

我可能有点超调,但我正在尝试使用从图像生成的蒙版,并将其从主图像中减去。我很愿意提取字符,但不确定如何收集整个蓝色样本,我还没有那种正确的平衡。

page here演示了我正在尝试实现的目标的相反方向。

基本图片

enter image description here

使用hsv边界的蒙版,然后将其反转以更好地显示

enter image description here

变黑

我现在想拿那个面具并将其从主图像中删除。

import cv2
import numpy as np
import random as rng

from PIL import Image
from PIL import ImageOps
from utils import helper

image_name = 'capt13.jpg'

img = cv2.imread(image_name)

hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

lower_red = np.array([0,120,70]) 
upper_red = np.array([10,255,255]) 
lower_mask = cv2.inRange(hsv, lower_red, upper_red) 

lower_red = np.array([160,120,70]) 
upper_red = np.array([180,255,255]) 
upper_mask = cv2.inRange(hsv, lower_red, upper_red) 
'''
lower_blue = np.array([80,40,30]) 
upper_blue = np.array([140,255,255]) 
lower_mask = cv2.inRange(hsv, lower_blue, upper_blue) 

lower_blue = np.array([240,220,200]) 
upper_blue = np.array([360,255,255]) 
upper_mask = cv2.inRange(hsv, lower_blue, upper_blue) 
'''
mask = lower_mask + upper_mask

res_lines = cv2.bitwise_and(img,img, mask= mask) 

# Keep the inverted
image = Image.fromarray(res_lines)
image.save('res.png')
inverted = ImageOps.invert(image)
inverted = inverted.convert('L')
inverted.save('inverted.png')

binary = np.array(inverted)
for row in range(len(binary)):
    for col in range(len(binary[row])):
        if binary[row][col] != 255:
            binary[row][col] = 0
binary_image = Image.fromarray(binary)
binary_image.save('binary.png')

提取蓝色(如上所述,我愿意为此寻求更好的解决方案)

利用hsv边界的蒙版然后将其反转

enter image description here

变黑

enter image description here

1 个答案:

答案 0 :(得分:0)

如果两个图像尺寸相同,则直接减法有效:

im = cv2.imread("image.png")
mask = cv2.imread("mask.png")

diff_im = im - im2

或者,您可以使用OpenCV的内置减法,该操作执行逐元素减法:

diff_im = cv2.subtract(im, im2)

作为最后的想法,您还应该尝试absdiff,因为它不会将负结果转换为零,这可能不是您想要的。

diff_im = cv2.absdiff(im, im2)