如何使用掩膜计算OPENCV直方图?

4

我需要在我的图片上只对一个部分进行直方图计算,但是这个部分具有圆形形状(如圆盘)。我创建了一个掩码来找到图像上的那个部分。

    cv2.rectangle(mask,(0, 0), (width, height), (0,0,0), -1)
    cv2.circle(mask,(int(avgkrug[0]),int(avgkrug[1])),radijusp2,(255,255,255),-1)
    cv2.circle(mask,(int(avgkrug[0]),int(avgkrug[1])),radijusp1,(0,0,0),-1)

使用上述代码,我找到了我感兴趣的“圆盘形”区域。现在我正在尝试计算直方图:
 for ch, col in enumerate(color):
    hist_item = cv2.calcHist([img],[ch],mask,[256],[0,255])
    ...

但是遇到了这个错误。
 error: (-215) !mask.data || mask.type() == CV_8UC1 in function cv::calcHist

然而,如果我将掩码保存在磁盘上并使用cv2.imread()读取它,则不会出现此错误。 我还尝试使用此行:

  hist_item = cv2.calcHist([slika],[ch],mask.astype(np.uint8),[256],[0,255])

如何使用我创建的掩模计算直方图,以便无需从磁盘读取/写入?

检查掩码的数据类型,mask.dtype。它应该是np.uint8。 - Abid Rahman K
print(type(mask.dtype)) -><class 'numpy.dtype'> print(np.result_type(mask.dtype)) ->uint8错误仍然存在 - Error
1个回答

3

您创建的掩模需要是uint8类型的,因此在创建掩模时,请将其设置为uint8类型,然后将其传递给计算直方图。

mask = np.zeros(image.shape[:2], dtype="uint8")

现在通过传递原始图像和相应的掩码来计算直方图。

hist_item = cv2.calcHist([image],[ch],mask,[256],[0,255])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接