使用蒙版获取图像的平均值
Getting mean of an image using a mask
我有一系列同心矩形,希望获得外矩形的均值排除内矩形。见附图,我需要得到阴影区域的平均值。
所以我使用内部矩形的掩码传递给 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
工作正常)。:
error:
/Users/jenkins/miniconda/0/2.7/conda-bld/work/opencv-2.4.11/modules/core/src/arithm.cpp:1021:
error: (-209) The operation is neither 'array op array' (where arrays
have the same size and type), nor 'array op scalar', nor 'scalar op
array' in function binary_op
这里的蒙版指的是背景为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)
在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
我有一系列同心矩形,希望获得外矩形的均值排除内矩形。见附图,我需要得到阴影区域的平均值。
所以我使用内部矩形的掩码传递给 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
工作正常)。:
error: /Users/jenkins/miniconda/0/2.7/conda-bld/work/opencv-2.4.11/modules/core/src/arithm.cpp:1021: error: (-209) The operation is neither 'array op array' (where arrays have the same size and type), nor 'array op scalar', nor 'scalar op array' in function binary_op
这里的蒙版指的是背景为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)
在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