【问题标题】:Extracting regions from image从图像中提取区域
【发布时间】:2019-11-12 11:42:50
【问题描述】:

您好,我正在尝试从一组图像中检索区域。我对图像和蒙版使用了 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 给出的解决方案,但出现以下错误:“error: (-215) (mtype == 0 || mtype == 1) && _mask.函数 cv::binary_op 中的 sameSize(*psrc1)"

Link to sample images

Expected output

My output

Masks

【问题讨论】:

  • 请为您的具体问题和图片提供一个最小、完整且可验证的示例。您应该能够使用 numpy 切片来提取这些区域,甚至将它们放入新的空白图像中。
  • @fmw42 添加了具有当前输出和预期输出的示例图像
  • @fmw42 所以我现在的理解是,对于蒙版的灰色区域,亮度会增加,但对于白色区域,它仍然可以正确提取区域。
  • “预期输出”显示 404 错误。所以我不确定你想要什么。你为什么要尝试使用灰色部分?为什么不只是白色的门槛。然后 bitwise_and 应该按照您期望的方式工作。你对用灰色部分遮罩有什么期望?也许您想要的是让您的蒙版在 0 到 1 的范围内浮动,然后将蒙版与图像相乘。这将降低蒙版中灰色区域的亮度。 1 将屏蔽为无变化,0 将屏蔽为黑色。
  • 请提供完整代码,以便其他人可以使用您的图像对其进行测试。请阅读此论坛的帮助部分,了解为您的特定问题提供一个最小、完整且可验证的示例

标签: python numpy opencv image-processing


【解决方案1】:

第一步将使用cv2.thresholdcv2.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)

【讨论】:

  • 感谢您抽出宝贵的时间来做这件事。它看起来真的很神奇。我只有几个问题。我没有将我的面具保存为图像。它们只是 numpy 数组,那么如何使用此代码在此处访问它们?将蒙版存储为图像是一种好习惯吗?如果是,那么如何确保输入图像和相应的掩码可以同时访问,即图像1和掩码1,图像2和掩码2?
  • 您可以省略这一行:composite_mask = cv2.imread("/path/to/mask.png", 0) 并简单地使用 numpy 数组本身初始化 composite_mask。只需确保它是单通道图像而不是 3 通道图像。
猜你喜欢
  • 1970-01-01
  • 2021-10-15
  • 2022-01-18
  • 1970-01-01
  • 2019-11-12
  • 2018-06-15
  • 1970-01-01
  • 2019-11-05
  • 1970-01-01
相关资源
最近更新 更多