根据下面显示的公式,我需要通过将分段强度值的总和除以分段像素数来计算平均阈值。
其中Xi'是二进制掩码(structure_mask
),| Xi'|是许多(xi_modulus
)。
I(x,y)是像素强度。
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
...
...
structure_mask = np.logical_and(magnitude_mask, intensity_mask).astype(np.uint8)
xi_modulus = np.count_nonzero(structure_mask.all(axis=2))
intensity_sum # = ??
如何使用numpy
计算强度总和?
已编辑:根据@HansHirse的回答,我尝试执行以下操作:
thresh_val = np.mean(img_gray[structure_mask])
我有IndexError: too many indices for array
structure_mask
的形状为(1066, 1600,1)
和img_gray
的地方-
(1066,1600)
更新:只是一个虚假的错误。形状不匹配通过适当的索引固定
structure_mask = np.logical_and(magnitude_mask, intensity_mask)[:, :, 0]
答案 0 :(得分:4)
使用NumPy的boolean array indexing,您可以轻松访问所需的值。您只需要注意,您的mask
(或句段)是NumPy的bool_
类型。
让我们看看这个简短的代码片段,在这里我将np.mean
的平均值与给定公式明确计算的平均值进行比较:
import cv2
import numpy as np
# Some artificial image
img = np.uint8(255 * np.tile(np.linspace(1, 0, 400), (400, 1)))
cv2.imshow('img', img)
# Some mask (or segment)
mask = np.zeros((400, 400), np.uint8)
mask[10:390, 10:30] = 255
cv2.imshow('mask', mask)
# Convert mask to bool_ type
mask = np.bool_(mask)
# Calculate mean by NumPy's mean
mean = np.mean(img[mask])
print('mean by np.mean:\n', mean)
# Calculate mean explicitly by given formula
mean = np.sum(img[mask]) / np.count_nonzero(mask)
print('mean by formula:\n', mean)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出(此处省略图像):
mean by np.mean:
242.05
mean by formula:
242.05
希望有帮助!
答案 1 :(得分:1)
numpy支持逻辑索引,因此
magnitude_mask[intensity_mask].mean()
会给您您想要的东西。
如果您坚持要使用总和
magnitude_mask[intensity_mask].sum()