【问题标题】:OpenCv mean returns 4 element tupleOpenCv 均值返回 4 元素元组
【发布时间】:2018-09-19 07:28:05
【问题描述】:

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

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

【问题讨论】:

  • 所以,您已将所有 3361 个轮廓(填充)绘制成黑色图像,该图像的平均灰度值为 156。“我认为我会得到每个轮廓的平均强度”-明显的期望不匹配。
  • 想要做什么? “每个轮廓的平均强度”甚至意味着什么?
  • 不完全。我已将所有 3361 轮廓(填充)绘制到黑色图像上,并使用该图像作为灰度图像上的蒙版来计算平均值。我没有计算掩码的平均值。
  • @berak,我认为你误解了我的问题。我想使用蒙版图像来定义一组 ROI,并计算每个 ROI 处原始灰度图像 (​​im2) 的平均强度。
  • 是的,我部分误解了你。仍然,您必须计算每个 roi(每个轮廓?)的东西,而不是整个图像。

标签: python opencv


【解决方案1】:

只是为了跟进(并关闭它),我确实通过迭代轮廓并将轮廓用作原始图像的蒙版来解决它。代码是:

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 个通道?)。

【讨论】:

  • 因此,正如问题所暗示的那样,这并不能解释为什么 cv2.mean 返回元组。有谁知道真正的答案吗?
猜你喜欢
  • 1970-01-01
  • 2013-12-29
  • 1970-01-01
  • 2015-08-09
  • 1970-01-01
  • 1970-01-01
  • 2018-08-02
  • 1970-01-01
  • 2021-05-27
相关资源
最近更新 更多