Извлечение областей из изображения - PullRequest
0 голосов
/ 11 ноября 2019

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

Обновление: В настоящее время у меня есть три области в масках (белая, серая и черная). Я хочу иметь возможность выбрать регион (скажем, белый или серый), а затем для этого конкретного региона он должен извлечь изображение для соответствующего региона.

for im in glob.glob(path_to_images):
        image = cv2.imread(im)  

        canny = auto_canny(image)


        image[(image< 50)] = 0
        gray_mask = image[(image>= 50) & (image< 100)] = 100
        white_mask = image[image> 110] = 255



        if(white_mask):
            res = cv2.bitwise_and(img, img, mask = white_mask )
            white_inv= cv2.bitwise_not(white_mask)
            alt_ = cv2.bitwise_and(img_1, img_1, mask = white_inv)
            result = cv2.add(alt_, res)

        elif(gray_mask):
            res = cv2.bitwise_and(img, img, mask = gray_mask )
            gray_inv= cv2.bitwise_not(gray_mask)
            alt_ = cv2.bitwise_and(img_1, img_1, mask = gray_inv)
            result = cv2.add(alt_, res)





        cv2.imshow("result",result)
        cv2.waitKey(0)





Я пробовал это, но извлеченные области приводит кувеличенная яркость.

Обновление 2: Я пробовал решение, данное @ZdaR, но получил следующую ошибку: "ошибка: (-215) (mtype == 0 || mtype ==1) && _mask.sameSize (* psrc1) в функции cv :: binary_op "

Ссылка на примеры изображений

Ожидаемый результат

Мой вывод

Маски

1 Ответ

0 голосов
/ 11 ноября 2019

Первым шагом будет независимое разделение серой и белой масок с использованием методов cv2.threshold или cv2.inRange(), затем мы можем просто использовать метод cv2.min(), чтобы сделать отпечаток исходного изображения в серой и белой областях соответственно. как:

import cv2
import numpy as np


def extract_gray_mask(input_image, composite_mask):
    gray_mask = cv2.inRange(composite_mask, np.array([100]), np.array([120]))
    gray_mask = cv2.cvtColor(gray_mask, cv2.COLOR_GRAY2BGR)

    return cv2.min(input_image, gray_mask)


def extract_white_mask(input_image, composite_mask):
    white_mask = cv2.inRange(composite_mask, np.array([250]), np.array([255]))
    white_mask = cv2.cvtColor(white_mask, cv2.COLOR_GRAY2BGR)

    return cv2.min(input_image, white_mask)


input_image = cv2.imread("/path/to/original_img.png")
composite_mask = cv2.imread("/path/to/mask.png", 0)

img_1 = extract_gray_mask(input_image, composite_mask)
img_2 = extract_white_mask(input_image, composite_mask)

enter image description here

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...