我在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)
我认为每个轮廓会得到一个平均强度,但它看起来像每个通道的整体平均强度(图像是灰度)。我的期望不正确,还是我的代码不正确?
答案 0 :(得分:0)
为了跟进这个(并将其关闭),我确实通过迭代轮廓并使用轮廓作为原始图像的遮罩来解决它。代码是:
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个通道?)。