从图像OpenCV Python中删除掩码

从图像OpenCV Python中删除掩码,python,opencv,Python,Opencv,我可能有点过调了,但我尝试使用从我的图像生成的遮罩,并从主图像中减去它。我非常愿意提取字符,但不确定如何收集整个蓝色样本,我还没有正确的平衡 这与我试图实现的目标正好相反 基础图像 使用hsv边界的遮罩,然后将其反转以更好地显示它 使其变暗 我现在想把这个面具从主图像中移除 import cv2 import numpy as np import random as rng from PIL import Image from PIL import ImageOps from utils

我可能有点过调了,但我尝试使用从我的图像生成的遮罩,并从主图像中减去它。我非常愿意提取字符,但不确定如何收集整个蓝色样本,我还没有正确的平衡

这与我试图实现的目标正好相反

基础图像

使用hsv边界的遮罩,然后将其反转以更好地显示它

使其变暗

我现在想把这个面具从主图像中移除

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边界的遮罩,然后将其反转

使其变暗


如果两幅图像的大小相同,则直接减法有效:

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)

好的,那么问题是什么呢?“我正在尝试使用从我的图像生成的遮罩,并从主图像中减去它。”