我可能有点超调,但我正在尝试使用从图像生成的蒙版,并将其从主图像中减去。我很愿意提取字符,但不确定如何收集整个蓝色样本,我还没有那种正确的平衡。
page here演示了我正在尝试实现的目标的相反方向。
基本图片
使用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边界的蒙版然后将其反转
变黑
答案 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)