OpenCv mean返回4元素元组

xdyibdwo  于 2023-06-24  发布在  其他
关注(0)|答案(2)|浏览(140)

我在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)

我以为我会得到每个轮廓的平均强度,但它看起来像每个通道的整体平均强度(图像是灰度的)。是我的期望不正确,还是我的代码不正确?

vuktfyat

vuktfyat1#

只是为了跟进这一点(并关闭它),我确实通过迭代轮廓来解决它,并使用轮廓作为原始图像的遮罩。代码为:

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)
for cnt in contours:
    res = np.zeros(img.shape, np.uint8)
    (x,y), radius = cv2.minEnclosingCircle(cnt)
    ctr = (int(x), int(y))
    rad = int(radius)
    circ = cv2.circle(res, ctr, rad,1,-1)
    print "Area: " + str(cv2.contourArea(cnt)), "Mean: " + str(float(cv2.meanStdDev(img, mask=res)[0]))

应该注意的是,我使用的是meanStdDev(我做了一些编辑,并希望返回Std Dev),而不是mean,但两者都应该适用于查找均值。目前还不清楚为什么mean似乎返回4个结果(对于4个通道?)在原始示例中的灰度图像上。

yk9xbfzb

yk9xbfzb2#

从文档:
函数cv::mean独立地为每个通道计算阵列元素的平均值M。
似乎不管输入图像中的通道数如何,cv2.mean都会返回一个4值元组,其中不相关的值(例如您的灰度图像示例中的最后3个)被设置为零。

相关问题