图像段中所有像素的强度值之和

时间:2019-10-22 09:39:34

标签: python image numpy math image-processing

根据下面显示的公式,我需要通过将分段强度值的总和除以分段像素数来计算平均阈值。

formula

其中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]

2 个答案:

答案 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()