我在OpenCV中定义并填充了一组轮廓,我试图将其用作遮罩来找到每个ROI中的平均强度。我想我可以使用cv2.mean
函数和一个定义好的掩码来实现这一点。我的代码是(im2
是从文件中读取的图像):
msk = np.zeros(im2.shape, np.uint8)
cv2.bilateralFilter(im2, 5, 200, 5)
im2 = cv2.GaussianBlur(im2,(5,5),0
binImg = cv2.adaptiveThreshold(im2, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 55, -5)
contours, heir = cv2.findContours(binImg, cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(msk, contours, -1, 255, -1)
print len(contours)
print cv2.mean(im2, mask = msk)
这将返回:
3361
(155.88012076286788, 0.0, 0.0, 0.0)
我以为我会得到每个轮廓的平均强度,但它看起来像每个通道的整体平均强度(图像是灰度的)。是我的期望不正确,还是我的代码不正确?
2条答案
按热度按时间vuktfyat1#
只是为了跟进这一点(并关闭它),我确实通过迭代轮廓来解决它,并使用轮廓作为原始图像的遮罩。代码为:
应该注意的是,我使用的是
meanStdDev
(我做了一些编辑,并希望返回Std Dev),而不是mean
,但两者都应该适用于查找均值。目前还不清楚为什么mean
似乎返回4个结果(对于4个通道?)在原始示例中的灰度图像上。yk9xbfzb2#
从文档:
函数cv::mean独立地为每个通道计算阵列元素的平均值M。
似乎不管输入图像中的通道数如何,
cv2.mean
都会返回一个4值元组,其中不相关的值(例如您的灰度图像示例中的最后3个)被设置为零。