【问题标题】:Getting mean of an image using a mask使用蒙版获取图像的平均值
【发布时间】:2017-05-11 00:19:08
【问题描述】:

我有一系列同心矩形,并希望获得外部矩形排除内部矩形的手段。见附图,我需要得到阴影区域的平均值。

所以我使用内部矩形的掩码传递给cv2.mean 方法,但我不确定如何设置掩码。我有以下代码:

for i in xrange(0,len(wins)-2,1):
    means_1 = cv2.mean(wins[i])[0]
    msk = cv2.bitwise_and(np.ones_like((wins[i+1]), np.uint8),np.zeros_like((wins[i]), np.uint8))
    means_2 = cv2.mean(wins[i+1],mask=msk)
    means_3 = cv2.mean(wins[i+1])[0]
    print means_1,means_2,means_3

means_2 出现此错误(means_3 工作正常)。:

错误: /Users/jenkins/miniconda/0/2.7/conda-bld/work/opencv-2.4.11/modules/core/src/arithm.cpp:1021: 错误:(-209)该操作既不是“数组操作数组”(其中数组 具有相同的大小和类型),也不是“数组操作标量”,也不是“标量操作” 函数 binary_op 中的数组'

【问题讨论】:

  • 然后做一些调试。您传递给bitwise_and 的两个数组的大小是多少? (我认为这就是错误的来源,因为您切断了堆栈跟踪)如果您不提供完整的、可重现的示例,那么没有人可以为您做到。

标签: python-2.7 opencv image-processing computer-vision


【解决方案1】:

这里的蒙版是指以0为背景,255为前景的二进制蒙版,因此您需要创建一个默认颜色为0的空蒙版,然后在您想要的位置绘制感兴趣的区域用255 求平均值。假设我有输入图像 [512 x 512]:

让我们假设 2 个同心矩形为:

outer_rect = [100, 100, 400, 400] # top, left, bottom, right
inner_rect = [200, 200, 300, 300]

现在使用这些矩形创建二进制掩码:

mask = np.zeros(image.shape[:2], dtype=np.uint8)
cv2.rectangle(mask, (outer_rect[0], outer_rect[1]), (outer_rect[2], outer_rect[3]), 255, -1)
cv2.rectangle(mask, (inner_rect[0], inner_rect[1]), (inner_rect[2], inner_rect[3]), 0, -1)

现在您可以调用cv2.mean() 来获取前景区域的平均值,用255 标记为:

lena_mean = cv2.mean(image, mask)
>>> (109.98813432835821, 96.60768656716418, 173.57567164179105, 0.0)

【讨论】:

  • 这个问题专门针对掩码,但值得注意的是(基于我的测试)使用子垫(ROI,原始输入的矩形部分)在性能方面会产生更好的结果(如多个高分辨率时好几倍)。
  • 对于较新的 numpy 版本(如 1.16),请参阅掩码数组:docs.scipy.org/doc/numpy/reference/…
【解决方案2】:

在 Python/OpenCV 或任何软件中,如果您有蒙版图像和二进制蒙版,则图像中非黑色像素的平均值(即 ROI)是蒙版图像的平均值除以面具

输入:

面具:

import cv2
import numpy as np

# load image 
img = cv2.imread('lena_g.png', cv2.IMREAD_GRAYSCALE)

# load mask
mask = cv2.imread('lena_mask.png', cv2.IMREAD_GRAYSCALE)

# compute means
mean_img = np.mean(img)
mean_mask = np.mean(mask)

# compute 255*mean_img/mean_mask
mean_roi = 255 * mean_img / mean_mask

# print mean of each
print("mean of image:", mean_img)
print("mean of mask:", mean_mask)
print("mean of roi:", mean_roi)

mean of image: 98.50196838378906
mean of mask: 216.090087890625
mean of roi: 116.23856597522328

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 2014-01-06
    相关资源
    最近更新 更多