Удалить маску из изображения OpenCV Python - PullRequest
0 голосов
/ 10 апреля 2019

Возможно, я немного перегружаюсь, но Я пытаюсь использовать маску, сгенерированную из моего изображения, и вычесть ее из основного изображения . Вместо этого я вполне могу извлечь символы, но не знаю, как собрать весь синий образец, у меня пока нет правильного баланса.

Страница здесь демонстрирует обратную сторону того, чего я пытаюсь достичь.

Базовое изображение

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 голосов
/ 10 апреля 2019

Прямое вычитание работает при условии, что оба изображения имеют одинаковый размер:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...